CKEditor 4 dialogadvtab 插件回归测试:连续创建多个链接时 Advanced 标签 id 属性丢失(1046)的复现与修复解析
前端UI组件【免费下载链接】ckeditor4The best enterprise-grade WYSIWYG editor. Fully customizable with countless features and plugins.项目地址https://gitcode.com/gh_mirrors/ck/ckeditor4点击查看免费下载本文以 tests/plugins/dialogadvtab/manual/multiplelinks.md 这份手动测试用例文档为骨架深入讲解 CKEditor 4 中dialogadvtab插件如何为链接对话框Link dialog提供 Advanced 标签页以及围绕 issue #1046连续创建多个新链接时后一个链接的id属性丢失的完整回归测试流程。读完本文你将掌握该手动测试的操作步骤与判定标准理解 Advanced 标签页中id字段的底层实现机制并能通过仓库内的自动化测试与源码确认该 Bug 的根因与修复方式。测试用例文档概览一份 Bender 手动测试的完整要素multiplelinks.md是 CKEditor 4 测试体系中的一份**手动测试manual test**文档与同目录下的multiplelinks.html页面一一对应。文档头部以bender-*开头的元数据标签声明了测试的运行环境与归属信息元数据标签值含义bender-tags4.10.1, 1046, bug该测试归属于 4.10.1 版本周期关联 issue #1046属于 Bug 回归测试bender-uicollapsed手动测试页面默认以折叠 UI 呈现聚焦编辑器本体bender-ckeditor-pluginswysiwygarea, toolbar, link, dialogadvtab, sourcearea测试页面加载的插件集合经典编辑区、工具栏、链接插件、Advanced 标签插件以及源码视图对应的测试页面 multiplelinks.html 内容极简一个contenteditabletrue的div#editor内部包含pfoo, bar/p两段文本随后通过CKEDITOR.replace( editor )将编辑器初始化到该容器上。测试的全部交互都发生在这一小段正文之上。手动复现步骤完整操作流程文档给出了 8 步操作目的是连续创建两个带id属性的链接选中文本 foo。点击工具栏的 Link链接按钮打开链接对话框。将 URL 设置为 aa。切换到 Advanced高级标签页。将 Id 字段设置为 aa。点击 OK 确认完成第一个链接。重复步骤 1–6这次选中 bar并将 Id 字段设置为 bb。点击工具栏的 Source源代码按钮切换到源码视图检查生成的 HTML。这套步骤本质上是在同一个编辑器实例中先后为两个不同的文本片段创建链接且每次都通过 Advanced 标签页写入自定义的id值。步骤 8 切换到源码视图是为了直观地核对两个a元素的最终属性。Expected 与 Unexpected测试的判定标准文档给出了明确的判定标准Expected预期两个链接都带有正确的id值即最终 HTML 应类似a href... idaafoo/a与a href... idbbbar/a。Unexpected意外第二个链接没有获得id属性即 Bug 复现成功。这一对预期/意外结果的设定精确指向了 issue #1046 描述的现象后续新建的链接不会包含id属性。在修复前执行上述步骤会出现 Unexpected 分支描述的结果——第一个链接正常携带idaa而第二个链接丢失id属性。Bug 根因分析Advanced 标签字段的复用机制要理解为什么第二个链接会丢失id需要回到 plugins/dialogadvtab/plugin.js 的字段实现。Advanced 标签页中的每个字段都通过setupAdvParams与commitAdvParams两个回调与编辑区中的真实元素同步function setupAdvParams( element ) { var attrName this.att; var value element element.hasAttribute( attrName ) element.getAttribute( attrName ) || ; if ( value ! undefined ) this.setValue( value ); } function commitAdvParams() { // Dialogs may use different parameters in the commit list, so, by // definition, we take the first CKEDITOR.dom.element available. var element; for ( var i 0; i arguments.length; i ) { if ( arguments[ i ] instanceof CKEDITOR.dom.element ) { element arguments[ i ]; break; } } if ( element ) { var attrName this.att, value this.getValue(); if ( value ) element.setAttribute( attrName, value ); else element.removeAttribute( attrName, value ); } }字段定义中的att属性如id决定了字段读写的是哪个 HTML 属性setup在对话框打开时把元素的现有属性值回填到输入框commit在点击 OK 时把输入框的值写回元素。dialogadvtab 插件的createAdvancedTab中advId字段正是这样构建的见 plugins/dialogadvtab/plugin.js 中tabConfig.id分支。而 plugins/link/dialogs/link.js 是链接对话框的真正实现它自身也定义了advId字段requiredContent: a[id]并通过setupAdvParams/commitAdvParams将值归入data.advanced对象再在提交阶段由 plugins/link/plugin.js 中的advAttrNames映射id: advId批量写回a元素。从源码结构看#1046 的根因在于当连续新建第二个链接时Advanced 标签页中advId等字段的初始化/提交链路存在状态残留或目标元素判定偏差导致第二次提交时id未能正确写回到新创建的a元素上从而出现第二个链接没有id属性的现象。修复验证变更记录与自动化回归测试issue #1046 的修复被记录在 CHANGES.md 的 Fixed Issues 列表中Fixed: Subsequent new links do not include theidattribute.该修复随 4.11.0对应bender-tags: 4.10.1所标记的回归周期发布。与手动测试配套的自动化回归测试位于 tests/plugins/dialogadvtab/dialog.js其中两个用例直接验证了本文讨论的场景test adding two subsequent id changes先选中p[aaa] strongbbb/strong/p中的 aaa打开 link 对话框设置 URL 为a、Advanced 标签的advId为aa并确认断言输出a hrefhttp://a idaaaaa/a随后选中strongbbb/strong再次打开对话框设置 URL 为b、advId为bb并确认断言输出a hrefhttp://b idbbstrongbbb/strong/a——第二个链接的idbb正是修复后的正确行为。test editing two subsequent id changes对已有两个链接的 HTML 分别补充id属性验证编辑路径下同样不会丢失属性。这两个用例与手动测试multiplelinks.md形成自动化 人工双重回归防线手动测试负责在真实浏览器交互中确认体验正确自动化测试负责在每次 CI 中锁定输出结果。dialogadvtab 插件原理Advanced 标签页的可配置化设计multiplelinks.md依赖的dialogadvtab插件plugins/dialogadvtab/plugin.js是一个标签页工厂通过createAdvancedTab( editor, tabConfig, element )为其他对话框按需生成 Advanced 标签页。核心设计包括可配置字段开关defaultTabConfig { id: 1, dir: 1, classes: 1, styles: 1 }决定默认启用id、dir文字方向、classCSS 类与style内联样式四类字段调用方可通过tabConfig裁剪例如 plugins/table/dialogs/table.js 中调用dialogadvtab.createAdvancedTab( editor, null, table )传null即使用默认配置而 plugins/iframe/dialogs/iframe.js 中只启用{ id: 1, classes: 1, styles: 1 }不启用dir。内容过滤规则allowedContent根据tabConfig动态生成允许内容规则——id/dir产生[id,dir]属性规则、classes产生(*)类规则、styles产生{*}样式规则保证用户通过 Advanced 标签页写入的属性不被编辑器的内容过滤器剥离。字段类型多样advId是text输入框advLangDir是select下拉框notSet/ltr/rtl三项advStyles是带getStyle/updateStyle辅助方法的样式文本域并配有CKEDITOR.dialog.validate.inlineStyle校验advCSSClasses是 CSS 类名文本域。dialog.js中另外两个用例test getStyle、test dialog field updateStyle分别对应 issue #9553 与 #9281验证了advStyles字段解析与更新内联样式的行为可作为理解该字段的补充阅读。如何运行这份手动测试该手动测试由 Bender 测试框架驱动测试分组配置见 bender.jstests.Plugins分组覆盖tests/plugins/**手动测试通过manualBrowsers参与人工验证。若要在本地复现可将编辑器加载到测试页面所声明的插件集合wysiwygarea, toolbar, link, dialogadvtab, sourcearea中初始化包含pfoo, bar/p的编辑区然后严格按上文 8 步操作执行最后通过 Source 视图检查两个链接的id属性是否符合 Expected 分支。仓库为只读运行与配置方式仅用于本地验证无需修改任何仓库文件。小结multiplelinks.md虽然只是一份简短的手动测试文档但它完整承载了一个真实 Bug#1046的复现路径与验收标准。结合 plugins/dialogadvtab/plugin.js、plugins/link/dialogs/link.js、tests/plugins/dialogadvtab/dialog.js 与 CHANGES.md 中的修复记录可以清晰地看到 CKEditor 4 从问题发现 → 手动复现 → 根因定位 → 修复 → 自动化回归的完整工程闭环以及dialogadvtab插件作为可复用 Advanced 标签页工厂的底层设计。赞分享前端UI组件【免费下载链接】ckeditor4The best enterprise-grade WYSIWYG editor. Fully customizable with countless features and plugins.项目地址https://gitcode.com/gh_mirrors/ck/ckeditor4点击查看免费下载相关推荐CKEditor 4 粘贴全角空格U3000丢失问题修复与回归测试解析CKEditor 4 粘贴全角空格U3000丢失问题修复与回归测试解析 本文以 CKEditor 4 仓库中的手动测试用例 tests/plugins/c前端UI组件CKEditor 4 Auto Link 插件源码模式兼容性修复解析2756 缺陷、根因与 Bender 回归测试CKEditor 4 Auto Link 插件源码模式兼容性修复解析 2756 缺陷、根因与 Bender 回归测试 Auto Link 是 CKEditor前端UI组件CKEditor 4 Auto Grow 插件宽度稳定性深度解析Bug 4286 手动回归测试与源码修复原理CKEditor 4 Auto Grow 插件宽度稳定性深度解析Bug 4286 手动回归测试与源码修复原理 Auto Grow自动增高是 CKEdito前端UI组件上一篇从文件级审计到可辩护的合规声明vscode-gitlens 的 WCAG Compliance Rollup 方法论与实践下一篇embassy-usb-logger 使用指南在 Embassy 应用中通过 USB 串口输出 log 日志创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

ohos.app.ability.dialog_request 模态弹框请求模块指南:RequestResult 与 ResultCode 解析

ohos.app.ability.dialog_request 模态弹框请求模块指南:RequestResult 与 ResultCode 解析

文档知识库教程OpenHarmony 【免费下载链接】CangjieCorpus 本仓库为仓颉编程语言语料库,聚焦 仓颉编程语言 核心知识体系,整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源,经结构化处理与专业标注,构建为支持 R…

2026/10/16 2:58:58 阅读更多 →
WinPython-64bit 3.8.12.3PyPy 变更日志全解析:包清单、升级明细与 changelog 生成机制

WinPython-64bit 3.8.12.3PyPy 变更日志全解析:包清单、升级明细与 changelog 生成机制

开发工具构建工具CLI包管理器 【免费下载链接】winpython A free Python-distribution for Windows platform, including prebuilt packages for Scientific Python. 项目地址: https://gitcode.com/gh_mirrors/wi/winpython 点击查看 免费下载 本篇文章以仓库 cha…

2026/10/16 2:58:58 阅读更多 →
CLRS 算法导论第 29 章习题精解:初始基本可行解与两阶段单纯形法(INITIALIZE-SIMPLEX)

CLRS 算法导论第 29 章习题精解:初始基本可行解与两阶段单纯形法(INITIALIZE-SIMPLEX)

文档教程教育 【免费下载链接】CLRS 📚 Solutions to Introduction to Algorithms Third Edition 项目地址: https://gitcode.com/gh_mirrors/clr/CLRS 点击查看 免费下载 本文围绕《算法导论》第三版第 29.5 节「The initial basic feasible solution」…

2026/10/16 2:57:58 阅读更多 →

最新新闻

CTF音频隐写解题指南:从‘啊哒~’看振幅、频谱与相位三重分析

CTF音频隐写解题指南:从‘啊哒~’看振幅、频谱与相位三重分析

1. 从一道CTF杂项题名看起:为什么“啊哒~”不是卖萌,而是信号“BugkuCTF-Misc:啊哒~”——第一次在某高校CTF训练平台看到这个标题时,我下意识点开想看看是不是新出的搞笑彩蛋题。结果发现它被归在Misc(杂项&#xff0…

2026/10/16 3:52:10 阅读更多 →
CANN一站式算子开发工具:从工程生成到性能优化的完整实践

CANN一站式算子开发工具:从工程生成到性能优化的完整实践

做AI算子开发的朋友,应该都有过这种体验:需求一句话就说完了——“写个自定义算子”,真正动手却要在工程搭建、参数定义、调试、性能调优上来回折腾。如果恰好是在一款新的AI芯片上跑,工具链又不成熟,那痛苦程度直接翻…

2026/10/16 3:52:10 阅读更多 →
Win10下VMware安装CentOS 7.9并配置静态IP与外网访问

Win10下VMware安装CentOS 7.9并配置静态IP与外网访问

1. 为什么要在Win10上折腾CentOS 7.9虚拟机很多刚接触Linux运维或者后端开发的朋友,第一道拦路虎不是命令本身,而是“我该把系统装在哪”。直接把自己的主力Windows 10笔记本格掉装Linux,显然不现实——办公、聊天、看文档都还得靠它。退而求…

2026/10/16 3:52:10 阅读更多 →
深度学习为何持续流行:从特征学习到端到端训练的范式变革

深度学习为何持续流行:从特征学习到端到端训练的范式变革

1. 从一张老照片说起:深度学习到底改变了什么2012年之前,如果你在一场计算机视觉的学术会议上说“我们用一个端到端的神经网络把图像分类错误率砍掉一半”,大概率会被审稿人反问:“你的特征工程做了什么?为什么不用SIF…

2026/10/16 3:52:10 阅读更多 →
WinUI 3 快速上手指南:6 个里程碑做出 Fluent 风格的 Windows 应用

WinUI 3 快速上手指南:6 个里程碑做出 Fluent 风格的 Windows 应用

WinUI 3 快速上手指南:6 个里程碑做出 Fluent 风格的 Windows 应用 【免费下载链接】microsoft-ui-xaml WinUI: a modern UI framework with a rich set of controls and styles to build dynamic and high-performing Windows applications. 项目地址: https://g…

2026/10/16 3:52:10 阅读更多 →
PL/0编译器C语言实现:从词法分析到解释执行的完整教学级编译流程

PL/0编译器C语言实现:从词法分析到解释执行的完整教学级编译流程

简介:本资源是N.Wirth教授经典PL/0语言编译器的C语言实现源码,面向编译原理初学者、高校计算机专业学生及教学实践者,用于深入理解词法分析、语法分析、语义处理与目标代码生成等编译全流程核心机制。压缩包为11KB的ZIP格式,共含2…

2026/10/16 3:51:09 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →