Files
oops-plugin-framework/dist/api/index.js
dgflash d2c68fbab5 fix(gui): 修复 onBeforeRemove 回调不触发的问题
问题原因:
在 LayerUI.remove() 方法中,state.valid 被提前设置为 false,
导致 LayerUIElement.remove() 中判断 state.valid 时条件不成立,
从而跳过了 onBeforeRemove 回调的触发。

修复方案:
将 state.valid = false 的赋值操作移动到 LayerUIElement.remove()
调用之后执行,确保回调能正常触发。

影响范围:
- 修复通过 oops.gui.remove() 关闭界面时 onBeforeRemove 回调不执行的问题
- 不影响界面缓存和异步加载的僵尸节点防护逻辑
2026-04-01 22:38:10 +08:00

2 lines
4.9 KiB
JavaScript

"use strict";var D=Object.create;var f=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,$=Object.prototype.hasOwnProperty;var N=(o,r)=>{for(var t in r)f(o,t,{get:r[t],enumerable:!0})},E=(o,r,t,e)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of B(r))!$.call(o,s)&&s!==t&&f(o,s,{get:()=>r[s],enumerable:!(e=M(r,s))||e.enumerable});return o};var W=(o,r,t)=>(t=o!=null?D(L(o)):{},E(r||!o||!o.__esModule?f(t,"default",{value:o,enumerable:!0}):t,o)),Y=o=>E(f({},"__esModule",{value:!0}),o);var J={};N(J,{OpenAssetAPI:()=>h,StateAPI:()=>g,getOpenAssetAPI:()=>k,getStateAPI:()=>T,resetOpenAssetAPI:()=>q,resetStateAPI:()=>C});module.exports=Y(J);function I(o){return new Promise((r,t)=>{let e="",s=!1;o.on("data",n=>{s||(e+=n.toString())}),o.on("end",()=>{s||r(e)}),o.on("error",n=>{s||(s=!0,t(n))})})}function p(o,r,t){o.statusCode=r,o.setHeader("Content-Type","application/json; charset=utf-8"),o.end(JSON.stringify(t))}var y="x-cocos-project-id",u="asset-db",_="query-uuid-by-url",O="query-url-by-uuid",U="query-asset-info",x="query-asset-meta",A="open-asset",m="db://",v="assets";var c=class{constructor(){this.projectId="";this.projectPath=""}setProjectPath(r){this.projectPath=r}getProjectPath(){return this.projectPath}setProjectId(r){this.projectId=r}getProjectId(){return this.projectId}validateProjectId(r){return r===this.projectId}getRequestMethod(r){return r.method||"GET"}checkRequest(r,t){let e=this.getMethodName(r),s=this.getApiPath();return e==="GET"&&s===r.url?(this.handleRequest(r,t),!0):!1}getMethodName(r){return(r.method||"GET").toUpperCase()}};var g=class extends c{constructor(){super(...arguments);this.port=8456;this.running=!1}setPort(t){this.port=t}getPort(){return this.port}setRunning(t){this.running=t}isRunning(){return this.running}getState(){return{projectId:this.projectId,projectPath:this.projectPath,port:this.port,running:this.running}}async handleRequest(t,e){let s={ok:!0,state:this.getState()};p(e,200,s)}getApiPath(){return"/api/state"}},P=null;function T(){return P||(P=new g),P}function C(){P=null}var R=W(require("path"));var h=class extends c{constructor(){super(...arguments);this.logCallback=null;this.focusWindowCallback=null;this.editorRequestCallback=null}setLogCallback(t){this.logCallback=t}setFocusWindowCallback(t){this.focusWindowCallback=t}setEditorRequestCallback(t){this.editorRequestCallback=t}log(t){this.logCallback&&this.logCallback(t)}focusWindow(){return this.focusWindowCallback?this.focusWindowCallback():!1}async requestEditor(t,e,...s){if(this.editorRequestCallback)return await this.editorRequestCallback(t,e,...s)}normalizeAssetUrl(t){if(!t)return null;let e=t.replace(/\\/g,"/").trim();if(!e)return null;if(e.startsWith(m))return e;if(e.startsWith(`${v}/`))return`${m}${e}`;let s=R.isAbsolute(e)?e.replace(/\\/g,"/"):R.join(this.projectPath,e).replace(/\\/g,"/"),n=`${this.projectPath.replace(/\\/g,"/")}/${v}/`,i=s.toLowerCase(),a=n.toLowerCase();return i.startsWith(a)?`${m}${v}/${s.slice(n.length)}`:null}async getAssetUrlByUuid(t){let e=await this.requestEditor(u,O,t);return typeof e=="string"?e:e&&typeof e.url=="string"?e.url:""}async resolveUuid(t,e){if(t.uuid)return t.uuid;if(!e)return null;let s=await this.requestEditor(u,_,e);if(typeof s=="string"&&s)return s;if(s&&typeof s.uuid=="string")return s.uuid;let n=await this.requestEditor(u,U,e);if(n&&typeof n.uuid=="string")return n.uuid;let i=await this.requestEditor(u,x,e);return i&&typeof i.uuid=="string"?i.uuid:null}async tryOpenByRequest(t,...e){try{return await this.requestEditor(u,t,...e),!0}catch(s){return!1}}async openAsset(t,e,s){let n=t?await this.getAssetUrlByUuid(t):e||"",i=!1,a="";return t&&await this.tryOpenByRequest(A,t)&&(i=!0,a="opened by uuid"),!i&&n&&await this.tryOpenByRequest(A,n)&&(i=!0,a="opened by asset url"),i||(a=`failed to open asset. uuid=${t||"<none>"} assetUrl=${n||"<none>"}`),this.log(`openAsset uuid=${t||"<none>"} focused=${s} opened=${i} url=${n||"<empty>"}`),{ok:i,focused:s,opened:i,assetUrl:n,message:a}}async handleRequest(t,e){try{let s=await I(t),n=s?JSON.parse(s):{},i=String(t.headers[y]||"").trim(),a=String(n.projectId||i).trim();if(!a){p(e,400,{ok:!1,message:"missing projectId"});return}if(!this.validateProjectId(a)){let w={ok:!1,message:"projectId mismatch",projectId:this.projectId};p(e,409,w);return}let d=this.normalizeAssetUrl(n.assetPath),b=await this.resolveUuid(n,d||null);if(!b&&!d){p(e,400,{ok:!1,message:"invalid assetPath/uuid"});return}let H=this.focusWindow(),l=await this.openAsset(b,d||null,H),j={ok:l.ok,uuid:b,focused:l.focused,opened:l.opened,assetUrl:l.assetUrl,message:l.message};p(e,l.ok?200:500,j)}catch(s){p(e,500,{ok:!1,message:(s==null?void 0:s.message)||"open failed"})}}getApiPath(){return"/api/open-asset"}},S=null;function k(){return S||(S=new h),S}function q(){S=null}0&&(module.exports={OpenAssetAPI,StateAPI,getOpenAssetAPI,getStateAPI,resetOpenAssetAPI,resetStateAPI});