跳到主要内容

Edge 浏览器复制粘贴 URL 显示网站标题

问题描述 #

与预料的不同,当把 Edge 浏览器地址栏中的 https://collection.armyja.cn/v/front-end/ 粘贴到 Notion 时,显示的是超链接 【前端笔记 - Collection (armyja.cn)】。这是为什么呢?

https://collection.armyja.cn/v/front-end/ 粘贴到记事本,再粘贴回 Notion,发现只显示超链接 https://collection.armyja.cn/v/front-end/ ,符合预期。

分析过程 #

打开 Chrome Debugger,添加事件侦听器断点,勾选 paste,如下图所示。粘贴网址,进断点。由于 js 文件是混淆过的,挤在一行不好分析,于是点击下图左下角的【{}】按钮,展示为 format 后的代码内容。

首先进入到 injectGlobalHook.js,如下图所示。因为 _intercept 变量值为 false,所以函数没有做任何操作。所以这里不需要分析。

接着跳到下一个断点监听,如下图所示。

到这里就比较难推进了,因为每在函数内部调用一次函数就要手动定位函数位置并打断点。有没有更快的办法呢?注意到 clipboardData 有 3 个 type。参考 https://developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent/clipboardDatahttps://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/getData ,提到 clipboardData 的类型为 DataTransfer,有方法 getData(format)。 format 为 data types。

Example data types are text/plain and text/uri-list.

于是在控制台尝试拿到粘贴内容。

> i[0].clipboardData.getData('text/html')
< '<html>\r\n<body>\r\n\x3C!--StartFragment--><a href="https://collection.armyja.cn/v/front-end/">前端笔记 - Collection (armyja.cn)</a>\x3C!--EndFragment-->\r\n</body>\r\n</html>'

> i[0].clipboardData.getData('text/link-preview')
< ''

> i[0].clipboardData.getData('text/plain')
< ''

顺藤摸瓜,既然粘贴的内容类型是 text/html,那么 js 一定有针对这一类型做特殊处理。在这个文件搜索 text/html,打上断点,果然程序停在这里,距离上个分析点直接越过 10 余个堆栈元素,如下图所示。

回溯到中间的堆栈可以看到返回有语义的 json 结构,如下图所示。

总结 #

当把 Edge 浏览器地址栏中的网址粘贴到 Notion 时,js 存储的粘贴内容由浏览器决定, data type 为 text/html
从记事本拷贝链接,js 存储的粘贴内容 data type 为 text/plain

在 Edge 浏览器的 设置 - 共享、复制和粘贴 里说明了,默认 Ctrl-V 是粘贴链接, Ctrl-Shift-V 为粘贴纯文本,详细说明参见 https://go.microsoft.com/fwlink/?linkid=2136809