1 line
44 KiB
JavaScript
1 line
44 KiB
JavaScript
window.app={socket:null,console:{}};var Base64ToArrayBuffer=function(base64Str){var binStr=atob(base64Str);var ab=new ArrayBuffer(binStr.length);var bv=new Uint8Array(ab);for(var i=0,l=binStr.length;i<l;i++){bv[[i]]=binStr.charCodeAt(i)}return ab};var b64d=function(base64Str){var binStr=atob(base64Str);var u8Array=Uint8Array.from(binStr,c=>c.codePointAt(0));return(new TextDecoder).decode(u8Array)};class BrowserProperties{static initiateBrowserProperties(global){global.L={};let ua=navigator.userAgent.toLowerCase();let uv=navigator.vendor.toLowerCase();let doc=document.documentElement;let ie="ActiveXObject"in global;let cypressTest=ua.indexOf("cypress")!==-1;let clipboardApiAvailable=navigator.clipboard!==undefined&&navigator.clipboard.write!==undefined&&navigator.clipboard.read!==undefined;let webkit=ua.indexOf("webkit")!==-1;let chrome=ua.indexOf("chrome")!==-1;let gecko=(ua.indexOf("gecko")!==-1||cypressTest&&"MozUserFocus"in doc.style)&&!webkit&&!global.opera&&!ie;let safari=!chrome&&(ua.indexOf("safari")!==-1||uv.indexOf("apple")==0);let win=navigator.platform.indexOf("Win")===0;let mobile=typeof orientation!=="undefined"||ua.indexOf("mobile")!==-1;let msPointer=!global.PointerEvent&&global.MSPointerEvent;let pointer=global.PointerEvent&&navigator.pointerEnabled&&navigator.maxTouchPoints||msPointer;let webkit3d="WebKitCSSMatrix"in global&&"m11"in new global.WebKitCSSMatrix;let gecko3d="MozPerspective"in doc.style;var mac=navigator.appVersion.indexOf("Mac")!=-1||navigator.userAgent.indexOf("Mac")!=-1;var chromebook=global.ThisIsTheAndroidApp&&global.COOLMessageHandler.isChromeOS();var navigatorLang=navigator.languages&&navigator.languages.length?navigator.languages[0]:navigator.language||navigator.userLanguage||navigator.browserLanguage||navigator.systemLanguage;function getFirefoxVersion(){var version="";var userAgent=navigator.userAgent.toLowerCase();if(userAgent.indexOf("firefox")!==-1){var matches=userAgent.match(/firefox\/([0-9]+\.*[0-9]*)/);if(matches){version=matches[1]}}return version}window.L.Browser={ie:ie,edge:"msLaunchUri"in navigator&&!("documentMode"in document),webkit:webkit,gecko:gecko,geckoVersion:getFirefoxVersion(),android:ua.indexOf("android")!==-1,chrome:chrome,safari:safari,win:win,mac:mac,any3d:!global.L_DISABLE_3D&&(webkit3d||gecko3d),mobile:mobile,mobileWebkit:mobile&&webkit,cypressTest:cypressTest,clipboardApiAvailable:clipboardApiAvailable,msPointer:!!msPointer,pointer:!!pointer,retina:(global.devicePixelRatio||global.screen.deviceXDPI/global.screen.logicalXDPI)>1,lang:navigatorLang};global.mode={isChromebook:function(){return chromebook},isMobile:function(){if(global.mode.isChromebook())return false;if(global.L.Browser.mobile&&global.L.Browser.cypressTest){return true}return global.L.Browser.mobile&&(screen.width<768||screen.height<768)},isTablet:function(){if(global.mode.isChromebook())return false;return global.L.Browser.mobile&&!global.mode.isMobile()},isDesktop:function(){if(global.mode.isChromebook())return true;return!global.L.Browser.mobile},getDeviceFormFactor:function(){if(global.mode.isMobile())return"mobile";else if(global.mode.isTablet())return"tablet";else if(global.mode.isDesktop())return"desktop";else return null}}}}class InitializerBase{constructor(){BrowserProperties.initiateBrowserProperties(window);this.uriPrefix=document.getElementById("init-uri-prefix").value;this.brandingUriPrefix=this.uriPrefix;window.welcomeUrl=document.getElementById("init-welcome-url")?document.getElementById("init-welcome-url").value:"";window.feedbackUrl=document.getElementById("init-feedback-url")?document.getElementById("init-feedback-url").value:"";window.buyProductUrl=document.getElementById("init-buy-product-url")?document.getElementById("init-buy-product-url").value:"";let initCSSVars=document.getElementById("init-css-vars")?document.getElementById("init-css-vars").value:"";if(initCSSVars){initCSSVars=atob(initCSSVars);const sheet=new CSSStyleSheet;if(typeof sheet.replace==="function"){sheet.replace(initCSSVars);document.adoptedStyleSheets.push(sheet)}}const element=window.L.initial=document.getElementById("initial-variables");window.L.initial._stubMessage=function(){};window.host="";window.serviceRoot="";window.hexifyUrl=false;window.versionPath="";window.accessToken=element.dataset.accessToken;window.accessTokenTTL=element.dataset.accessTokenTtl;window.noAuthHeader=element.dataset.noAuthHeader;window.accessHeader=element.dataset.accessHeader;window.postMessageOriginExt="";window.coolwsdVersion="";window.enableWelcomeMessage=false;window.autoShowWelcome=false;window.autoShowFeedback=true;window.allowUpdateNotification=false;window.useIntegrationTheme=false;window.enableMacrosExecution=false;window.enableAccessibility=false;window.protocolDebug=false;window.enableDebug=false;window.frameAncestors="";window.socketProxy=false;window.uiDefaults={};window.useStatusbarSaveIndicator=false;window.checkFileInfoOverride={};window.deeplEnabled=false;window.zoteroEnabled=false;window.savedUIState=true;window.extraExportFormats=[];window.wasmEnabled=false;window.indirectionUrl="";window.geolocationSetup=false;window.canvasSlideshowEnabled=false;window.wopiSettingBaseUrl=element.dataset.wopiSettingBaseUrl;window.tileSize=256;window.ThisIsAMobileApp=false;window.ThisIsTheiOSApp=false;window.ThisIsTheGtkApp=false;window.ThisIsTheAndroidApp=false;window.ThisIsTheEmscriptenApp=false;window.bundlejsLoaded=false;window.fullyLoadedAndReady=false;window.addEventListener("load",function(){window.fullyLoadedAndReady=true;const contentKeeper=document.getElementById("content-keeper");while(contentKeeper.children.length>0)document.body.insertBefore(contentKeeper.children[contentKeeper.children.length-1],document.body.firstChild);document.getElementById("content-keeper").remove()},false);let productName=document.getElementById("init-product-branding-name").value;if(typeof productName==="string"&&productName.length){window.brandProductName=productName}let productURL=document.getElementById("init-product-branding-url").value;if(typeof productURL==="string"&&productURL.length){window.brandProductURL=productURL}this.initiateCoolParams()}initiateCoolParams(){const gls=window.location.search;const coolParams={p:new URLSearchParams(gls.slice(gls.lastIndexOf("?")+1))};coolParams.get=function(name){const value=this.p.get(name);return value===null?"":value}.bind(coolParams);coolParams.set=function(name,value){this.p.set(name,value)}.bind(coolParams);window.coolParams=coolParams}loadCSSFiles(){const link=document.createElement("link");link.setAttribute("rel","stylesheet");link.setAttribute("type","text/css");const brandingLink=document.createElement("link");brandingLink.setAttribute("rel","stylesheet");brandingLink.setAttribute("type","text/css");const theme_name=document.getElementById("init-branding-name").value;let theme_prefix="";if(window.useIntegrationTheme&&theme_name!=="")theme_prefix=theme_name+"/";if(window.mode.isMobile()){link.setAttribute("href",this.uriPrefix+"device-mobile.css");brandingLink.setAttribute("href",this.brandingUriPrefix+theme_prefix+"branding-mobile.css")}else if(window.mode.isTablet()){link.setAttribute("href",this.uriPrefix+"device-tablet.css");brandingLink.setAttribute("href",this.brandingUriPrefix+theme_prefix+"branding-tablet.css")}else{link.setAttribute("href",this.uriPrefix+"device-desktop.css");brandingLink.setAttribute("href",this.brandingUriPrefix+theme_prefix+"branding-desktop.css")}const otherStylesheets=document.querySelectorAll('link[rel="stylesheet"]');const lastOtherStylesheet=otherStylesheets[otherStylesheets.length-1];lastOtherStylesheet.insertAdjacentElement("afterend",link).insertAdjacentElement("afterend",brandingLink)}initializeViewMode(){const darkTheme=window.coolParams.get("darkTheme");if(darkTheme){window.uiDefaults={darkTheme:true}}}afterInitialization(){this.initializeViewMode();this.loadCSSFiles()}}class BrowserInitializer extends InitializerBase{constructor(){super();window.WOPIpostMessageReady=false;this._boundPostMessageHandler=this.postMessageHandler.bind(this);window.addEventListener("message",this._boundPostMessageHandler,false);const element=document.getElementById("initial-variables");window.host=element.dataset.host;window.serviceRoot=element.dataset.serviceRoot;window.hexifyUrl=element.dataset.hexifyUrl.toLowerCase().trim()==="true";window.versionPath=element.dataset.versionPath;window.postMessageOriginExt=element.dataset.postMessageOriginExt;window.coolLogging=element.dataset.coolLogging;window.coolwsdVersion=element.dataset.coolwsdVersion;window.enableWelcomeMessage=element.dataset.enableWelcomeMessage.toLowerCase().trim()==="true";window.autoShowWelcome=element.dataset.autoShowWelcome.toLowerCase().trim()==="true";window.autoShowFeedback=element.dataset.autoShowFeedback.toLowerCase().trim()==="true";window.allowUpdateNotification=element.dataset.allowUpdateNotification.toLowerCase().trim()==="true";window.userInterfaceMode=element.dataset.userInterfaceMode;window.useIntegrationTheme=element.dataset.useIntegrationTheme.toLowerCase().trim()==="true";window.useStatusbarSaveIndicator=element.dataset.statusbarSaveIndicator.toLowerCase().trim()==="true";window.enableMacrosExecution=element.dataset.enableMacrosExecution.toLowerCase().trim()==="true";window.enableAccessibility=element.dataset.enableAccessibility.toLowerCase().trim()==="true";window.outOfFocusTimeoutSecs=parseInt(element.dataset.outOfFocusTimeoutSecs);window.idleTimeoutSecs=parseInt(element.dataset.idleTimeoutSecs);window.minSavedMessageTimeoutSecs=parseInt(element.dataset.minSavedMessageTimeoutSecs);window.protocolDebug=element.dataset.protocolDebug.toLowerCase().trim()==="true";window.enableDebug=element.dataset.enableDebug.toLowerCase().trim()==="true";window.frameAncestors=decodeURIComponent(element.dataset.frameAncestors);window.socketProxy=element.dataset.socketProxy.toLowerCase().trim()==="true";window.uiDefaults=JSON.parse(atob(element.dataset.uiDefaults));window.checkFileInfoOverride=element.dataset.checkFileInfoOverride;window.deeplEnabled=element.dataset.deeplEnabled.toLowerCase().trim()==="true";window.zoteroEnabled=element.dataset.zoteroEnabled.toLowerCase().trim()==="true";window.documentSigningEnabled=element.dataset.documentSigningEnabled.toLowerCase().trim()==="true";window.savedUIState=element.dataset.savedUiState.toLowerCase().trim()==="true";window.extraExportFormats=Array.from(element.dataset.extraExportFormats.split(" "));window.wasmEnabled=element.dataset.wasmEnabled.toLowerCase().trim()==="true";window.indirectionUrl=element.dataset.indirectionUrl;window.geolocationSetup=element.dataset.geolocationSetup.toLowerCase().trim()==="true";window.canvasSlideshowEnabled=element.dataset.canvasSlideshowEnabled.toLowerCase().trim()==="true";window.wopiSettingBaseUrl=element.dataset.wopiSettingBaseUrl}postMessageHandler(e){if(!(e&&e.data))return;try{var msg=JSON.parse(e.data)}catch(err){return}if(msg.MessageId==="Host_PostmessageReady"){window.WOPIPostmessageReady=true;window.removeEventListener("message",this._boundPostMessageHandler,false);console.log("Received Host_PostmessageReady.")}}}class MobileAppInitializer extends InitializerBase{constructor(){super();window.ThisIsAMobileApp=true;window.HelpFile=document.getElementById("init-help-file").value;window.open=function(url,windowName,windowFeatures){window.postMobileMessage("HYPERLINK "+url)};const element=document.getElementById("initial-variables");window.MobileAppName=element.dataset.mobileAppName;window.brandProductName=element.dataset.mobileAppName;window.coolLogging="true";window.outOfFocusTimeoutSecs=1e6;window.idleTimeoutSecs=1e6;window.canvasSlideshowEnabled=true}}class IOSAppInitializer extends MobileAppInitializer{constructor(){super();window.ThisIsTheiOSApp=true;window.postMobileMessage=function(msg){window.webkit.messageHandlers.lok.postMessage(msg)};window.postMobileError=function(msg){window.webkit.messageHandlers.error.postMessage(msg)};window.postMobileDebug=function(msg){window.webkit.messageHandlers.debug.postMessage(msg)};document.dir=window.coolParams.get("dir");window.userInterfaceMode=window.coolParams.get("userinterfacemode");this.brandingUriPrefix="Branding/"+this.brandingUriPrefix}}class GTKAppInitializer extends MobileAppInitializer{constructor(){super();window.ThisIsTheGtkApp=true;window.postMobileMessage=function(msg){window.webkit.messageHandlers.cool.postMessage(msg,"*")};window.postMobileError=function(msg){window.webkit.messageHandlers.error.postMessage(msg,"*")};window.postMobileDebug=function(msg){window.webkit.messageHandlers.debug.postMessage(msg,"*")}}}class AndroidAppInitializer extends MobileAppInitializer{constructor(){super();window.ThisIsTheAndroidApp=true;window.postMobileMessage=function(msg){window.COOLMessageHandler.postMobileMessage(msg)};window.postMobileError=function(msg){window.COOLMessageHandler.postMobileError(msg)};window.postMobileDebug=function(msg){window.COOLMessageHandler.postMobileDebug(msg)};window.userInterfaceMode=window.coolParams.get("userinterfacemode")}}class EMSCRIPTENAppInitializer extends MobileAppInitializer{constructor(){super();window.ThisIsTheEmscriptenApp=true;window.postMobileMessage=function(msg){Module._handle_cool_message(Module.stringToNewUTF8(msg))};window.postMobileError=function(msg){console.log("COOL Error: "+msg)};window.postMobileDebug=function(msg){console.log("COOL Debug: "+msg)};window.userInterfaceMode="notebookbar"}}function getInitializerClass(){window.appType=document.getElementById("init-app-type").value;if(window.appType==="browser"){return new BrowserInitializer}else if(window.appType==="mobile"){let osType=document.getElementById("init-mobile-app-os-type");if(osType){osType=osType.value;if(osType==="IOS")return new IOSAppInitializer;else if(osType==="GTK")return new GTKAppInitializer;else if(osType==="ANDROID")return new AndroidAppInitializer;else if(osType==="EMSCRIPTEN")return new EMSCRIPTENAppInitializer}}}(function(global){const initializer=getInitializerClass();initializer.afterInitialization();global.logServer=function(log){if(global.ThisIsAMobileApp){global.postMobileError(log)}else if(global.socket&&(global.socket instanceof WebSocket||global.socket instanceof global.IndirectSocket)&&global.socket.readyState===1){global.socket.send(log)}else if(global.socket&&global.L&&global.app.definitions.Socket&&global.socket instanceof global.app.definitions.Socket&&global.socket.connected()){global.socket.sendMessage(log)}else{fetch(global.location.pathname.match(/.*\//)+"logging.html",{method:"POST",headers:{"Content-Type":"application/json"},body:global.coolLogging+" "+log})}};global.setLogging=function(doLogging){var loggingMethods=["error","warn","info","debug","trace","log","assert","time","timeEnd","group","groupEnd"];if(!doLogging){var noop=function(){};for(var i=0;i<loggingMethods.length;i++){global.app.console[loggingMethods[i]]=noop}}else{for(var i=0;i<loggingMethods.length;i++){if(!Object.prototype.hasOwnProperty.call(global.console,loggingMethods[i])){continue}(function(method){global.app.console[method]=function logWithCool(){var args=Array.prototype.slice.call(arguments);if(method==="error"){var log="jserror ";for(var arg=0;arg<arguments.length;arg++){if(typeof arguments[arg]==="string")log+=arguments[arg]+"\n"}global.logServer(log)}if(global.L&&global.L.Map&&global.L.Map.THIS&&global.L.Map.THIS._debug&&global.L.Map.THIS._debug.logTrace===true){console.groupCollapsed("Trace");console.trace();console.groupEnd()}return global.console[method].apply(console,args)}})(loggingMethods[i])}global.onerror=function(msg,src,row,col,err){var data={userAgent:navigator.userAgent.toLowerCase(),vendor:navigator.vendor.toLowerCase(),message:msg,source:src,line:row,column:col};var desc=err?err.message||"(no message)":"(no err)",stack=err?err.stack||"(no stack)":"(no err)";var log="jserror "+JSON.stringify(data,null,2)+"\n"+desc+"\n"+stack+"\n";global.logServer(log);if(L.Browser.cypressTest&&window.parent!==window&&err!==null){console.log("Sending global error to Cypress...:",err);window.parent.postMessage(err)}return false}}};global.setLogging(global.coolLogging!="");function parseBool(val){if(typeof val!=="string")return false;switch(val.toLowerCase().trim()){case"1":case"true":case"yes":case"on":return true;case"0":case"false":case"no":case"off":return false;default:return false}}global.L.Params={closeButtonEnabled:parseBool(global.coolParams.get("closebutton")),revHistoryEnabled:parseBool(global.coolParams.get("revisionhistory"))};global.prefs={_localStorageCache:{},_userBrowserSetting:new Map,_settingUpdateJSON:{},_pendingSettingUpdate:undefined,useBrowserSetting:false,canPersist:function(){var str="localstorage_test";try{global.localStorage.setItem(str,str);global.localStorage.removeItem(str);return true}catch(e){return false}}(),_initializeBrowserSetting:function(msg){let settingJSON=JSON.parse(msg.substring("browsersetting:".length+1));if(typeof settingJSON==="undefined")return;const processObject=(object,parentKey="")=>{Object.keys(object).forEach(key=>{const fullKey=parentKey?`${parentKey}.${key}`:key;const value=object[key];if(typeof value==="object"&&!Array.isArray(value)&&value!==null){processObject(value,fullKey)}else if(Array.isArray(value)){global.prefs._userBrowserSetting[fullKey]=JSON.stringify(value)}else{global.prefs._userBrowserSetting[fullKey]=typeof value==="boolean"?value?"true":"false":value}})};processObject(settingJSON);global.prefs._localStorageCache={};global.prefs.useBrowserSetting=true;global.getAccessibilityState()},_renameLocalStoragePref:function(oldName,newName){if(!global.prefs.canPersist){return}const oldValue=global.localStorage.getItem(oldName);const newValue=global.localStorage.getItem(newName);if(oldValue===null||newValue!==null){return}global.localStorage.setItem(newName,oldValue)},_getUIDefault:function(key,defaultValue=undefined){const parts=key.split(".");let result=global.uiDefaults;for(const part of parts){if(!Object.prototype.hasOwnProperty.call(result,part)){return defaultValue}if(typeof result==="string"){return defaultValue}result=result[part]}if(typeof result!=="string"){return defaultValue}return result},get:function(key,defaultValue=undefined){if(key in global.prefs._localStorageCache){return global.prefs._localStorageCache[key]}const uiDefault=global.prefs._getUIDefault(key);if(!global.savedUIState&&uiDefault!==undefined){global.prefs._localStorageCache[key]=uiDefault;return uiDefault}if(global.prefs.useBrowserSetting){let val=defaultValue;if(Object.prototype.hasOwnProperty.call(global.prefs._userBrowserSetting,key))val=global.prefs._userBrowserSetting[key];if(val!==undefined){global.prefs._localStorageCache[key]=val;return val}}if(global.prefs.canPersist){const localStorageItem=global.localStorage.getItem(key);if(localStorageItem){global.prefs._localStorageCache[key]=localStorageItem;return localStorageItem}}if(uiDefault!==undefined){global.prefs._localStorageCache[key]=uiDefault;return uiDefault}global.prefs._localStorageCache[key]=defaultValue;return defaultValue},sendPendingBrowserSettingsUpdate:function(){const isEmpty=obj=>Object.keys(obj).length===0;if(!isEmpty(global.prefs._settingUpdateJSON)){global.socket.send("browsersetting action=update json="+JSON.stringify(global.prefs._settingUpdateJSON));global.prefs._settingUpdateJSON={}}clearTimeout(global.prefs._pendingSettingUpdate);global.prefs._pendingSettingUpdate=undefined},setMultiple:function(prefsObject){const browserSettingEnabled=global.prefs.useBrowserSetting;for(const[key,value]of Object.entries(prefsObject)){if(browserSettingEnabled){const oldValue=global.prefs._userBrowserSetting[key];global.prefs._userBrowserSetting[key]=value;if(oldValue!==value)global.prefs._settingUpdateJSON[key]=value}if(global.prefs.canPersist){global.localStorage.setItem(key,value)}global.prefs._localStorageCache[key]=value}const isEmpty=obj=>Object.keys(obj).length===0;if(browserSettingEnabled&&!isEmpty(global.prefs._settingUpdateJSON)&&global.socket&&(global.socket instanceof WebSocket||global.socket instanceof global.IndirectSocket)&&global.socket.readyState===1){clearTimeout(global.prefs._pendingSettingUpdate);global.prefs._pendingSettingUpdate=setTimeout(L.bind(this.sendPendingBrowserSettingsUpdate,this),5e3)}},set:function(key,value){value=String(value);if(global.prefs.useBrowserSetting){const oldValue=global.prefs._userBrowserSetting[key];global.prefs._userBrowserSetting[key]=value;if(global.socket&&(global.socket instanceof WebSocket||global.socket instanceof global.IndirectSocket)&&global.socket.readyState===1&&oldValue!==value){global.prefs._settingUpdateJSON[key]=value;clearTimeout(global.prefs._pendingSettingUpdate);global.prefs._pendingSettingUpdate=setTimeout(L.bind(this.sendPendingBrowserSettingsUpdate,this),5e3)}}if(global.prefs.canPersist){global.localStorage.setItem(key,value)}global.prefs._localStorageCache[key]=value},remove:function(key){if(global.prefs.useBrowserSetting){global.prefs._userBrowserSetting.delete(key)}if(global.prefs.canPersist){global.localStorage.removeItem(key)}global.prefs._localStorageCache[key]=undefined},getBoolean:function(key,defaultValue=false){const value=global.prefs.get(key,"").toLowerCase();if(value==="false"){return false}if(value==="true"){return true}return defaultValue},getNumber:function(key,defaultValue=NaN){const value=global.prefs.get(key,"").toLowerCase();const parsedValue=parseFloat(value);if(isNaN(parsedValue)){return defaultValue}return parsedValue}};global.getAccessibilityState=function(){var isCalcTest=global.docURL.includes("data/desktop/calc/")||global.docURL.includes("data/mobile/calc/")||global.docURL.includes("data/idle/calc/")||global.docURL.includes("data/multiuser/calc/");if(L.Browser.cypressTest&&isCalcTest)global.enableAccessibility=false;if(L.Browser.cypressTest)global.prefs.set("accessibilityState",global.enableAccessibility);return global.prefs.getBoolean("accessibilityState")};const prefDocTypes=["text","spreadsheet","presentation","drawing"];for(const docType of prefDocTypes){global.prefs._renameLocalStoragePref(`UIDefaults_${docType}_darkTheme`,"darkTheme")}const oldDocTypePrefs=["A11yCheckDeck","NavigatorDeck","PropertyDeck","SdCustomAnimationDeck","SdMasterPagesDeck","SdSlideTransitionDeck","ShowResolved","ShowRuler","ShowSidebar","ShowStatusbar","ShowToolbar"];for(const pref of oldDocTypePrefs){for(const docType of prefDocTypes){global.prefs._renameLocalStoragePref(`UIDefaults_${docType}_${pref}`,`${docType}.${pref}`)}}global.keyboard={onscreenKeyboardHint:global.uiDefaults["onscreenKeyboardHint"],guessOnscreenKeyboard:function(){if(global.keyboard.onscreenKeyboardHint!=undefined)return global.keyboard.onscreenKeyboardHint;return global.ThisIsAMobileApp&&!global.ThisIsTheEmscriptenApp||global.mode.isMobile()||global.mode.isTablet()},hintOnscreenKeyboard:function(hint){if(global.app&&global.L.Map&&global.L.Map.THIS._docLayer.isCalc()&&hint!==undefined){var command={Enable:{type:"boolean",value:hint}};global.L.Map.THIS.sendUnoCommand(".uno:MoveKeepInsertMode",command)}global.keyboard.onscreenKeyboardHint=hint}};global.memo={_lastId:0,_getId:function(obj){if(obj===null||obj===undefined){return""+obj}if(!("_coolMemoId"in obj)){obj["_coolMemoId"]=++global.memo._lastId}return obj._coolMemoId},_decoratorMemo:{},decorator:function(decorator,context){var decoratorId=global.memo._getId(decorator);var contextId=global.memo._getId(context);return function(f){var functionId=global.memo._getId(f);if(global.memo._decoratorMemo[decoratorId+" "+contextId+" "+functionId]===undefined){global.memo._decoratorMemo[decoratorId+" "+contextId+" "+functionId]=decorator.apply(this,arguments);if(context!==null&&context!==undefined){global.memo._decoratorMemo[decoratorId+" "+contextId+" "+functionId]=global.memo._decoratorMemo[decoratorId+" "+contextId+" "+functionId].bind(context)}}return global.memo._decoratorMemo[decoratorId+" "+contextId+" "+functionId]}},_bindMemo:{},bind:function(f,context){var functionId=global.memo._getId(f);var contextId=global.memo._getId(context);if(global.memo._bindMemo[functionId+" "+contextId]===undefined){global.memo._bindMemo[functionId+" "+contextId]=f.bind(context)}return global.memo._bindMemo[functionId+" "+contextId]}};global.touch={isTouchEvent:function(e){if(e.originalEvent){e=e.originalEvent}if(L.Browser.cypressTest&&global.L.Browser.mobile){return true}if(e.pointerType){return e.pointerType==="touch"||e.pointerType==="kinect"}if(e.isMouseEvent!==undefined){return!e.isMouseEvent}if(e.guessEmulatedFromTouch){return true}return!(e instanceof MouseEvent)},touchOnly:global.memo.decorator(function(f){return function(e){if(!global.touch.isTouchEvent(e))return;return f.apply(this,arguments)}}),mouseOnly:global.memo.decorator(function(f){return function(e){if(global.touch.isTouchEvent(e))return;return f.apply(this,arguments)}}),hasPrimaryTouchscreen:function(){return global.matchMedia("(pointer: coarse)").matches},hasAnyTouchscreen:function(){return global.matchMedia("(any-pointer: coarse)").matches},lastEventWasTouch:null,lastEventTime:null,currentlyUsingTouchscreen:function(){if(global.touch.lastEventWasTouch!==null){return global.touch.lastEventWasTouch}return global.touch.hasAnyTouchscreen()}};const registerTapOrClick=e=>{registerGuessEmulatedFromTouch(e);global.touch.lastEventWasTouch=global.touch.isTouchEvent(e);global.touch.lastEventTime=Date.now()};const registerGuessEmulatedFromTouch=e=>{e.guessEmulatedFromTouch=global.touch.lastEventWasTouch&&Date.now()-global.touch.lastEventTime<50};document.addEventListener("touchstart",registerTapOrClick,{capture:true});document.addEventListener("touchend",registerTapOrClick,{capture:true});document.addEventListener("mousedown",registerTapOrClick,{capture:true});document.addEventListener("mouseup",registerTapOrClick,{capture:true});document.addEventListener("pointerdown",registerTapOrClick,{capture:true});document.addEventListener("pointerup",registerTapOrClick,{capture:true});document.addEventListener("mouseenter",registerGuessEmulatedFromTouch,{capture:true});document.addEventListener("mouseleave",registerGuessEmulatedFromTouch,{capture:true});document.addEventListener("mouseover",registerGuessEmulatedFromTouch,{capture:true});document.addEventListener("mouseout",registerGuessEmulatedFromTouch,{capture:true});global.deviceFormFactor=global.mode.getDeviceFormFactor();if(global.ThisIsTheiOSApp){global.addEventListener("keydown",function(e){if(e.metaKey){e.preventDefault()}if(global.MagicKeyDownHandler)global.MagicKeyDownHandler(e)});global.addEventListener("keyup",function(e){if(e.metaKey){e.preventDefault()}if(global.MagicKeyUpHandler)global.MagicKeyUpHandler(e)})}document.addEventListener("contextmenu",function(e){if(e.preventDefault){e.preventDefault()}else{e.returnValue=false}},false);global.fakeWebSocketCounter=0;global.FakeWebSocket=function(){this.binaryType="arraybuffer";this.bufferedAmount=0;this.extensions="";this.protocol="";this.readyState=1;this.id=global.fakeWebSocketCounter++;this.onclose=function(){};this.onerror=function(){};this.onmessage=function(){};this.onopen=function(){};this.close=function(){}};global.FakeWebSocket.prototype.send=function(data){global.postMobileMessage(data)};global.proxySocketCounter=0;global.ProxySocket=function(uri){var that=this;this.uri=uri;this.binaryType="arraybuffer";this.bufferedAmount=0;this.extensions="";this.unloading=false;this.protocol="";this.connected=true;this.readyState=0;this.sessionId="open";this.id=global.proxySocketCounter++;this.msgInflight=0;this.openInflight=0;this.inSerial=1;this.outSerial=1;this.minPollMs=25;this.maxPollMs=500;this.curPollMs=this.minPollMs;this.minIdlePollsToThrottle=3;this.throttleFactor=1.15;this.lastDataTimestamp=performance.now();this.serialQueue=new Map;this.onclose=function(){};this.onerror=function(){};this.onmessage=function(){};this.decoder=new TextDecoder;this.doSlice=function(bytes,start,end){return bytes.slice(start,end)};this.decode=function(bytes,start,end){return this.decoder.decode(this.doSlice(bytes,start,end))};this.processBufferedMessages=function(expectedSerial){while(this.serialQueue.has(expectedSerial)){let bufferedMessage=this.serialQueue.get(expectedSerial);this.inSerial=bufferedMessage.serial;try{this.onmessage({data:bufferedMessage.data})}catch(e){global.app.console.error(e);global.app.console.warn(`Failed processing a ProxySocket message (due to ${e}), ignoring`)}this.serialQueue.delete(expectedSerial);expectedSerial++}},this.parseIncomingArray=function(arr){for(var i=0;i<arr.length;++i){var left=arr.length-i;if(left<4){break}var type=String.fromCharCode(arr[i+0]);if(type!="T"&&type!="B"){global.app.console.debug("wrong data type: "+type);break}i++;if(arr[i]!==48&&arr[i+1]!==120){global.app.console.debug("missing hex preamble");break}i+=2;var numStr="";var start=i;while(arr[i]!=10)i++;numStr=this.decode(arr,start,i);var serial=parseInt(numStr,16);i++;if(arr[i]!==48&&arr[i+1]!==120){global.app.console.debug("missing hex preamble");break}i+=2;start=i;while(arr[i]!=10)i++;numStr=this.decode(arr,start,i);var size=parseInt(numStr,16);i++;var data;if(type=="T")data=this.decode(arr,i,i+size);else data=this.doSlice(arr,i,i+size);this.serialQueue.set(serial,{data:data,serial:serial});this.processBufferedMessages(serial);i+=size}};this.sendQueue="";this._signalErrorClose=function(){clearInterval(this.pollInterval);clearTimeout(this.delaySession);this.pollInterval=undefined;this.delaySession=undefined;if(that.readyState<3){this.onerror();this.onclose()}this.sessionId="open";this.inSerial=0;this.outSerial=0;this.msgInflight=0;this.openInflight=0;this.readyState=3};this._setPollInterval=function(intervalMs){clearInterval(this.pollInterval);if(this.readyState===1)this.pollInterval=setInterval(this.doSend,intervalMs)},this.doSend=function(){if(that.sessionId==="open"){if(that.readyState===3)global.app.console.debug("Error: sending on closed socket");return}if(that.msgInflight>=4){if(that.curPollMs<that.maxPollMs){that.curPollMs=Math.min(that.maxPollMs,that.curPollMs*that.throttleFactor)|0;global.app.console.debug("High latency connection - too much in-flight, throttling to "+that.curPollMs+" ms.");that._setPollInterval(that.curPollMs)}else if(performance.now()-that.lastDataTimestamp>30*1e3){global.app.console.debug("Close connection after no response for 30secs");that._signalErrorClose()}else global.app.console.debug("High latency connection - too much in-flight, pausing.");return}that._setPollInterval(that.maxPollMs);var req=new XMLHttpRequest;const url=that.getEndPoint("write");req.open("POST",url);req.responseType="arraybuffer";req.addEventListener("load",function(){if(this.status==200){var data=new Uint8Array(this.response);if(data.length){that.curPollMs=that.minPollMs;that._setPollInterval(that.curPollMs);that.lastDataTimestamp=performance.now();that.parseIncomingArray(data);return}}else{global.app.console.debug("proxy: error on incoming response "+this.status);that._signalErrorClose()}if(that.curPollMs<that.maxPollMs){var timeSinceLastDataMs=performance.now()-that.lastDataTimestamp|0;if(timeSinceLastDataMs>=that.minIdlePollsToThrottle*that.curPollMs){that.curPollMs=Math.min(that.maxPollMs,that.curPollMs*that.throttleFactor)|0}}that._setPollInterval(that.curPollMs)});req.addEventListener("loadend",function(){that.msgInflight--});const toSend=that.sendQueue;that.sendQueue="";that.msgInflight++;req.send(toSend.concat("."))};this.getSessionId=function(){if(this.openInflight>0){global.app.console.debug("Waiting for session open");return}if(this.delaySession)return;if(global.lastCreatedProxySocket){var msSince=performance.now()-global.lastCreatedProxySocket;if(msSince<250){var delay=250-msSince;global.app.console.debug("Wait to re-try session creation for "+delay+"ms");this.curPollMs=delay;this.delaySession=setTimeout(function(){that.delaySession=undefined;that.getSessionId()},delay);return}}global.lastCreatedProxySocket=performance.now();var req=new XMLHttpRequest;const endPoint=that.getEndPoint("open");req.open("POST",endPoint);req.responseType="text";req.addEventListener("load",function(){global.app.console.debug("got session: "+this.responseText);if(this.status!==200||!this.responseText||this.responseText.indexOf("\n")>=0){global.app.console.debug("Error: failed to fetch session id! error: "+this.status);that._signalErrorClose()}else{that.sessionId=this.responseText;that.readyState=1;that.onopen();that._setPollInterval(that.curPollMs)}});req.addEventListener("loadend",function(){global.app.console.debug("Open completed state: "+that.readyState);that.openInflight--});req.send("");this.openInflight++};this.send=function(msg){var hadData=this.sendQueue.length>0;this.sendQueue=this.sendQueue.concat("B0x"+this.outSerial.toString(16)+"\n"+"0x"+(new TextEncoder).encode(msg).length.toString(16)+"\n"+msg+"\n");this.outSerial++;if(that.curPollMs>that.minPollMs||!hadData){if(that.msgInflight<=3){that.curPollMs=that.minPollMs;that._setPollInterval(that.curPollMs)}}};this.sendCloseMsg=function(beacon){const url=that.getEndPoint("close");if(!beacon){var req=new XMLHttpRequest;req.open("POST",url);req.send("")}else navigator.sendBeacon(url,"")};this.close=function(){var oldState=this.readyState;global.app.console.debug("proxy: close socket");this.readyState=3;this.onclose();clearInterval(this.pollInterval);clearTimeout(this.delaySession);this.pollInterval=undefined;if(oldState===1)this.sendCloseMsg(this.unloading);this.sessionId="open"};this.setUnloading=function(){this.unloading=true};this.getEndPoint=function(command){var base=this.uri;return base+"/"+this.sessionId+"/"+command+"/"+this.outSerial};global.app.console.debug("proxy: new socket "+this.id+" "+this.uri);this.getSessionId()};class MobileSocket extends global.ProxySocket{constructor(url){super("cool:/cool/mobilesocket"+url);delete this.send;delete this._setPollInterval;delete this.close}send(data){global.postMobileMessage(data)}close(){}_setPollInterval(){}}global.iterateCSSImages=function(visitor){var visitUrls=function(rules,visitor,base){if(!rules)return;for(var r=0;r<rules.length;++r){if(rules[r]&&rules[r].type!=1){visitUrls(rules[r].cssRules||rules[r].rules,visitor,base);continue}if(!rules[r]||!rules[r].style)continue;var img=rules[r].style.backgroundImage;if(img===""||img===undefined)continue;if(img.startsWith('url("images/')){visitor(rules[r].style,img,img.replace('url("images/',base+"/images/"))}if(img.startsWith('url("remote/')){visitor(rules[r].style,img,img.replace('url("remote/',base+"/remote/"))}}};var sheets=document.styleSheets;for(var i=0;i<sheets.length;++i){var relBases;try{relBases=sheets[i].href.split("/")}catch(err){global.app.console.log("Missing href from CSS number "+i);continue}relBases.pop();var base='url("'+relBases.join("/");var rules;try{rules=sheets[i].cssRules||sheets[i].rules}catch(err){global.app.console.log("Missing CSS from "+sheets[i].href);continue}visitUrls(rules,visitor,base)}};if(global.socketProxy){global.addEventListener("load",function(){global.iterateCSSImages(function(style,img,fullUrl){style.backgroundImage=fullUrl})},false)}global.IndirectSocket=function(uri){var that=this;this.uri=uri;this.binaryType="";this.unloading=false;this.readyState=0;this.innerSocket=undefined;this.onclose=function(){};this.onerror=function(){};this.onmessage=function(){};this.onopen=function(){};this.close=function(){this.innerSocket.close()};this.send=function(msg){this.innerSocket.send(msg)};this.setUnloading=function(){this.unloading=true};this.sendPostMsg=function(errorCode){var errorMsg;if(errorCode===0){errorMsg=_("The system is currently adjusting resources. Please wait a moment while we retry your request...")}else if(errorCode===1){errorMsg=_("The document is being migrated to a new server. Retrying shortly...")}else{errorMsg=_("Failed to get RouteToken from controller")}var msg={MessageId:"Action_Load_Resp",SendTime:Date.now(),Values:{success:false,errorMsg:errorMsg,errorType:"clusterscaling"}};global.parent.postMessage(JSON.stringify(msg),"*")};this.sendRouteTokenRequest=function(requestUri){var http=new XMLHttpRequest;http.open("GET",requestUri,true);http.responseType="json";http.addEventListener("load",function(){if(this.status===200){var uriWithRouteToken=http.response.uri;global.expectedServerId=http.response.serverId;var params=new URL(uriWithRouteToken).searchParams;global.routeToken=params.get("RouteToken");global.app.console.log("updated routeToken: "+global.routeToken);that.innerSocket=new WebSocket(uriWithRouteToken);that.innerSocket.binaryType=that.binaryType;that.innerSocket.onerror=function(){that.readyState=that.innerSocket.readyState;that.onerror()};that.innerSocket.onclose=function(){that.readyState=3;that.onclose();that.innerSocket.onerror=function(){};that.innerSocket.onclose=function(){};that.innerSocket.onmessage=function(){}};that.innerSocket.onopen=function(){that.readyState=1;that.onopen()};that.innerSocket.onmessage=function(e){that.readyState=that.innerSocket.readyState;that.onmessage(e)}}else if(this.status===202){if(!(window.app&&window.app.socket&&window.app.socket._reconnecting)){that.sendPostMsg(http.response.errorCode)}var timeoutFn=function(requestUri){console.warn("Requesting again for routeToken");this.open("GET",requestUri,true);this.send()}.bind(this);setTimeout(timeoutFn,3e3,requestUri)}else{global.app.console.error("Indirection url: error on incoming response "+this.status);that.sendPostMsg(-1)}});http.send()};let requestUri=global.indirectionUrl+"?Uri="+encodeURIComponent(that.uri);if(global.geolocationSetup){let timeZone=Intl.DateTimeFormat().resolvedOptions().timeZone;requestUri+="&TimeZone="+timeZone}this.sendRouteTokenRequest(requestUri)};global.createWebSocket=function(uri){if("processCoolUrl"in global){uri=global.processCoolUrl({url:uri,type:"ws"})}if(global.ThisIsAMobileApp){return new MobileSocket(uri)}else if(global.socketProxy){return new global.ProxySocket(uri)}else if(global.indirectionUrl!=""&&!global.migrating){global.indirectSocket=true;return new global.IndirectSocket(uri)}else{return new WebSocket(uri)}};global._=function(string){if(global.ThisIsAMobileApp){if(global.LOCALIZATIONS&&Object.prototype.hasOwnProperty.call(global.LOCALIZATIONS,string)){var result=global.LOCALIZATIONS[string];if(global.LANG==="de-CH"){result=result.replace(/ß/g,"ss")}return result}else{return string}}else{return string.toLocaleString()}};if(global.webserver===undefined){var protocol=global.location.protocol==="file:"?"https:":global.location.protocol;global.webserver=global.host.replace(/^(ws|wss):/i,protocol);global.webserver=global.webserver.replace(/\/*$/,"")}var docParams,wopiParams;var filePath=global.coolParams.get("file_path");global.wopiSrc=global.coolParams.get("WOPISrc");if(global.wopiSrc!=""){global.docURL=decodeURIComponent(global.wopiSrc);if(global.accessToken!==""){wopiParams={access_token:global.accessToken,access_token_ttl:global.accessTokenTTL,no_auth_header:global.noAuthHeader}}else if(global.accessHeader!==""){wopiParams={access_header:global.accessHeader}}if(wopiParams){docParams=Object.keys(wopiParams).map(function(key){return encodeURIComponent(key)+"="+encodeURIComponent(wopiParams[key])}).join("&")}}else{global.docURL=filePath}global.makeWsUrl=function(path){if(!global.ThisIsAMobileApp){global.app.console.assert(global.host.startsWith("ws"),"host is not ws: "+global.host)}return global.host+global.serviceRoot+path};global.routeToken="";global.makeDocAndWopiSrcUrl=function(root,docUrlParams,suffix,wopiSrcParam){var wopiSrc="";if(global.wopiSrc!=""){wopiSrc="?WOPISrc="+encodeURIComponent(global.wopiSrc);if(global.routeToken!="")wopiSrc+="&RouteToken="+global.routeToken;wopiSrc+="&compat=";if(wopiSrcParam&&wopiSrcParam.length>0)wopiSrc+="&"+wopiSrcParam}else if(wopiSrcParam&&wopiSrcParam.length>0){wopiSrc="?"+wopiSrcParam}suffix=suffix||"/ws";var encodedDocUrl=encodeURIComponent(docUrlParams)+suffix+wopiSrc;if(global.hexifyUrl)encodedDocUrl=global.hexEncode(encodedDocUrl);return root+encodedDocUrl+"/ws"};global.makeWsUrlWopiSrc=function(path,docUrlParams,suffix,wopiSrcParam){var websocketURI=global.makeWsUrl(path);return global.makeDocAndWopiSrcUrl(websocketURI,docUrlParams,suffix,wopiSrcParam)};global.makeHttpUrl=function(path){global.app.console.assert(global.webserver.startsWith("http"),"webserver is not http: "+global.webserver);return global.webserver+global.serviceRoot+path};global.makeHttpUrlWopiSrc=function(path,docUrlParams,suffix,wopiSrcParam){var httpURI=global.makeHttpUrl(path);return global.makeDocAndWopiSrcUrl(httpURI,docUrlParams,suffix,wopiSrcParam)};global.makeClientVisibleArea=function(){const width=window.innerWidth*15;const height=window.innerHeight*15;return"0;0;"+width+";"+height};global.hexEncode=function(string){var bytes=(new TextEncoder).encode(string);var hex="0x";for(var i=0;i<bytes.length;++i){hex+=bytes[i].toString(16)}return hex};global.hexDecode=function(hex){if(hex.startsWith("0x"))hex=hex.substr(2);var bytes=new Uint8Array(hex.length/2);for(var i=0;i<bytes.length;i++){bytes[i]=parseInt(hex.substr(i*2,2),16)}return(new TextDecoder).decode(bytes)};if(global.ThisIsTheGtkApp||global.ThisIsTheEmscriptenApp){global.socket=new global.FakeWebSocket;global.TheFakeWebSocket=global.socket}else{var docParamsPart=docParams?(global.docURL.includes("?")?"&":"?")+docParams:"";var websocketURI=global.makeWsUrlWopiSrc("/cool/",global.docURL+docParamsPart);try{global.socket=global.createWebSocket(websocketURI)}catch(err){global.app.console.log(err)}}var isRandomUser=global.coolParams.get("randomUser");if(isRandomUser){var randomUserLangs=["ar","bg","ca","cs","da","de","el","en-US","en-GB","eo","es","eu","fi","fr","gl","he","hr","hu","id","is","it","ja","ko","lo","nb","nl","oc","pl","pt","pt-BR","sq","ru","sk","sl","sv","tr","uk","vi","zh-CN","zh-TW"];var randomUserLang=randomUserLangs[Math.floor(Math.random()*randomUserLangs.length)];window.app.console.log("Randomize Settings: Set language to: ",randomUserLang);global.coolParams.set("lang",randomUserLang);global.coolParams.set("debug",true)}var lang=global.coolParams.get("lang");if(lang){if(lang==="en-us")lang="en-US";if(lang==="en-gb")lang="en-GB";if(lang==="pt-br")lang="pt-BR";if(lang==="zh-cn")lang="zh-CN";if(lang==="zh-tw")lang="zh-TW";global.langParam=encodeURIComponent(lang)}else global.langParam="en-US";global.langParamLocale=new Intl.Locale(global.langParam);global.queueMsg=[];if(global.ThisIsTheEmscriptenApp)global.LANG="en-US";else if(global.ThisIsAMobileApp)global.LANG=lang;if(global.socket&&global.socket.readyState!==3){global.socket.onopen=function(){if(global.socket.readyState===1){var ProtocolVersionNumber="0.1";var timestamp=encodeURIComponent(global.coolParams.get("timestamp"));var msg="load url="+encodeURIComponent(global.docURL);var now0=Date.now();var now1=performance.now();var now2=Date.now();global.socket.send("coolclient "+ProtocolVersionNumber+" "+(now0+now2)/2+" "+now1);msg+=" accessibilityState="+global.getAccessibilityState();if(global.ThisIsAMobileApp){msg+=" lang="+global.LANG}else{if(timestamp){msg+=" timestamp="+timestamp}if(lang){msg+=" lang="+lang}}if(global.deviceFormFactor){msg+=" deviceFormFactor="+global.deviceFormFactor}var spellOnline=window.prefs.get("SpellOnline");if(spellOnline){msg+=" spellOnline="+spellOnline}const darkTheme=window.prefs.getBoolean("darkTheme");msg+=" darkTheme="+darkTheme;const darkBackground=window.prefs.getBoolean("darkBackgroundForTheme."+(darkTheme?"dark":"light"),darkTheme);msg+=" darkBackground="+darkBackground;msg+=" timezone="+Intl.DateTimeFormat().resolvedOptions().timeZone;msg+=" clientvisiblearea="+window.makeClientVisibleArea();global.socket.send(msg)}};global.socket.onerror=function(event){global.app.console.log(event)};global.socket.onclose=function(event){global.app.console.log(event)};global.socket.onmessage=function(event){if(event.data.startsWith("browsersetting:")){try{global.prefs._initializeBrowserSetting(event.data)}catch(e){global.app.console.error("Failed to initialize browser settings: ",e.message)}}if(typeof global.socket._onMessage==="function"){global.socket._emptyQueue();global.socket._onMessage(event)}else{global.queueMsg.push(event.data)}};global.socket.binaryType="arraybuffer";if(global.ThisIsAMobileApp&&!global.ThisIsTheEmscriptenApp){global.postMobileMessage("HULLO");this.socket.onopen()}}function handleViewportChange(event){var visualViewport=event.target;window.scroll(0,0);document.body.style.height=visualViewport.height+"px"}if(window.visualViewport!==undefined){window.visualViewport.addEventListener("scroll",handleViewportChange);window.visualViewport.addEventListener("resize",handleViewportChange)}})(window); |