Skip to content
This repository has been archived by the owner on Jun 28, 2022. It is now read-only.

无法更新到最新版2001191 #293

Open
dragonation opened this issue Feb 2, 2020 · 4 comments
Open

无法更新到最新版2001191 #293

dragonation opened this issue Feb 2, 2020 · 4 comments

Comments

@dragonation
Copy link

dragonation commented Feb 2, 2020

简单的运行update_package_nw.sh在最新版是不行的,编辑器和调试器的界面起不来。

我看了一下,官方新版升级了nwjs0.39.3,然后我修改了nwjs_v,运行了update_nwjs.sh,但是同时意味着node也被升级到了12.6.0

两边都升级完以后,依旧不行。追踪了一下,发现有很多native的模块因为efi不对,所以加载失败了。将这些模块重新编译到linux格式(记得更新node到12,module_version否则不对),可以看到编辑器起来了,但是马上闪退,有一闪而过的spawn错误对话框,但是只出现了一开头几次,后面几次尝试启动就看不到了

之后的尝试就没有进行,希望上述信息可以提供一点帮助

@dragonation
Copy link
Author

跟进一下情况,发现了如下的错误,似乎是底层对nw.Menu的操作出现了下标访问错误,正在尝试注掉相关的代码

另外这个报错源自于chromium的源代码,ui/base/models/simple_menu_model.cc,估计是nw封装的问题,也有可能是微信的问题,有待检查

[64450:64450:0203/112954.545917:FATAL:simple_menu_model.cc(481)] Check failed: static_cast<size_t>(index) < items_.size() (5 vs. 5)
#0 0x7fd97604cf79 <unknown>
Task trace:
#0 0x7fd976640ea5 <unknown>
#1 0x7fd9760afb06 <unknown>

@dragonation
Copy link
Author

再更新一下追踪信息,调试下来,应该是发生在了JS代码的menu.removeAt(5)部分,初步估计应该是gnome的菜单会自动合并分隔符,导致remove的过程中,自动合并掉了重复的分割菜单,导致native那边的实际menuItem数量和js内的不一致

@waivital
Copy link

再更新一下追踪信息,调试下来,应该是发生在了JS代码的menu.removeAt(5)部分,初步估计应该是gnome的菜单会自动合并分隔符,导致remove的过程中,自动合并掉了重复的分割菜单,导致native那边的实际menuItem数量和js内的不一致

按你这个猜想,写了个 patch 放到 package.nw/js/core/index.js 文件最前面,就不会闪退了
之前写了版有点问题就删掉了 =.=
调试下来好像是插入的第一个 menu_item 如果是 separator 的话,native 不会放到它的 items 里,就会导致 native 的数量和 js 这边的不一致,加个 patch 在 js 这边也处理下这种情况

const oldMenuAppend = nw.Menu.prototype.append
const oldMenuInsert = nw.Menu.prototype.insert
function isSeparator(menu_item) {
  return menu_item && menu_item.type === 'separator'
}
nw.Menu.prototype.append = function (menu_item) {
  const items = this.items
  const len = this.items.length
  if (~items.indexOf(menu_item)) return
  if (len === 0 && isSeparator(menu_item)) {
    return menu_item._destroy()
  }
  if (!isSeparator(menu_item) || !isSeparator(items[len - 1])) {
    oldMenuAppend.call(this, menu_item)
  } else {
    return menu_item._destroy()
  }
}
nw.Menu.prototype.insert = function (menu_item, i) {
  const items = this.items
  const len = this.items.length
  if (~items.indexOf(menu_item)) return
  if (len === 0 && isSeparator(menu_item)) {
    return menu_item._destroy()
  }
  if (!isSeparator(menu_item) || (!isSeparator(items[i]) && !isSeparator(items[i - 1]))) {
    oldMenuInsert.call(this, menu_item)
  } else {
    return menu_item._destroy()
  }
}

@dragonation
Copy link
Author

再更新一下追踪信息,调试下来,应该是发生在了JS代码的menu.removeAt(5)部分,初步估计应该是gnome的菜单会自动合并分隔符,导致remove的过程中,自动合并掉了重复的分割菜单,导致native那边的实际menuItem数量和js内的不一致

按你这个猜想,写了个 patch 放到 package.nw/js/core/index.js 文件最前面,就不会闪退了
之前写了版有点问题就删掉了 =.=
调试下来好像是插入的第一个 menu_item 如果是 separator 的话,native 不会放到它的 items 里,就会导致 native 的数量和 js 这边的不一致,加个 patch 在 js 这边也处理下这种情况

const oldMenuAppend = nw.Menu.prototype.append
const oldMenuInsert = nw.Menu.prototype.insert
function isSeparator(menu_item) {
  return menu_item && menu_item.type === 'separator'
}
nw.Menu.prototype.append = function (menu_item) {
  const items = this.items
  const len = this.items.length
  if (~items.indexOf(menu_item)) return
  if (len === 0 && isSeparator(menu_item)) {
    return menu_item._destroy()
  }
  if (!isSeparator(menu_item) || !isSeparator(items[len - 1])) {
    oldMenuAppend.call(this, menu_item)
  } else {
    return menu_item._destroy()
  }
}
nw.Menu.prototype.insert = function (menu_item, i) {
  const items = this.items
  const len = this.items.length
  if (~items.indexOf(menu_item)) return
  if (len === 0 && isSeparator(menu_item)) {
    return menu_item._destroy()
  }
  if (!isSeparator(menu_item) || (!isSeparator(items[i]) && !isSeparator(items[i - 1]))) {
    oldMenuInsert.call(this, menu_item)
  } else {
    return menu_item._destroy()
  }
}

你的方案虽然可以跑,但是修改了具体的menuitem列表,可能会导致后面的代码逻辑出现问题,因为我看了一下微信的menu管理方案……很糙的,完全依靠下标和总量来硬管理,所以很可能会导致后期菜单紊乱和重复,该删的没删掉(因为下标已经和微信自己预估的不一致了)。当然,现阶段应该没有问题。

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants