Chromium 中前端HTMLDialogElement <Dialog> c++代码实现

news2024/12/28 23:42:27

一、HTMLDialogElement: open property

Baseline Widely available

The open property of the HTMLDialogElement interface is a boolean value reflecting the open HTML attribute, indicating whether the <dialog> is available for interaction.

Value

A boolean value representing the state of the open HTML attribute. true means it is set, and therefore the dialog is shown. false means it not set, and therefore the dialog is not shown.

The property is not read only — it is possible to set the value to programmatically show or hide the dialog.

HTMLDialogElement: open property - Web APIs | MDN (mozilla.org)

html例子:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>pop-up dialog box</title>
</head>
<body>
  <!-- pop-up dialog box, containing a form -->
<dialog id="favDialog">
  <form method="dialog">
    <p>
      <label for="favAnimal">Favorite animal:</label>
      <select id="favAnimal" name="favAnimal">
        <option></option>
        <option>Brine shrimp</option>
        <option>Red panda</option>
        <option>Spider monkey</option>
      </select>
    </p>
    <div>
      <button id="cancel" type="reset">Cancel</button>
      <button type="submit">Confirm</button>
    </div>
  </form>
</dialog>

<div>
  <button id="Dialog Test">Dialog Test</button>
</div>

<script>const updateButton = document.getElementById("Dialog Test");
const cancelButton = document.getElementById("cancel");
const dialog = document.getElementById("favDialog");
dialog.returnValue = "favAnimal";

function openCheck(dialog) {
  if (dialog.open) {
    console.log("Dialog open");
  } else {
    console.log("Dialog closed");
    console.log(dialog.returnValue);
  }
}

// Update button opens a modal dialog
updateButton.addEventListener("click", () => {
  dialog.showModal();
  openCheck(dialog);
});

// Form cancel button closes the dialog box
cancelButton.addEventListener("click", () => {
  dialog.close("animalNotChosen");
  openCheck(dialog);
});
</script>

</body>
</html>

二、HTMLDialogElement 接口blink接口定义:

前端 show();showModal()等方法都在此接口中。

third_party\blink\renderer\core\html\html_dialog_element.idl


// https://html.spec.whatwg.org/C/#the-dialog-element
[
    Exposed=Window,
    HTMLConstructor
] interface HTMLDialogElement : HTMLElement {
    [CEReactions, Reflect] attribute boolean open;
    attribute DOMString returnValue;
    [CEReactions, Measure, RaisesException] void show();
    [CEReactions, Measure, RaisesException] void showModal();
    [CEReactions] void close(optional DOMString returnValue);
};

third_party\blink\renderer\core\html\html_dialog_element.h

third_party\blink\renderer\core\html\html_dialog_element.cc


#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_HTML_DIALOG_ELEMENT_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_HTML_DIALOG_ELEMENT_H_

#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/html/closewatcher/close_watcher.h"
#include "third_party/blink/renderer/core/html/html_element.h"
#include "third_party/blink/renderer/platform/geometry/layout_unit.h"

namespace blink {

class Document;
class ExceptionState;

class CORE_EXPORT HTMLDialogElement final : public HTMLElement {
  DEFINE_WRAPPERTYPEINFO();

 public:
  explicit HTMLDialogElement(Document&);

  void Trace(Visitor*) const override;

  void close(const String& return_value = String());
  void show(ExceptionState&);
  void showModal(ExceptionState&);
  void RemovedFrom(ContainerNode&) override;

  bool IsModal() const { return is_modal_; }

  String returnValue() const { return return_value_; }
  void setReturnValue(const String& return_value) {
    return_value_ = return_value;
  }

  void CloseWatcherFiredCancel(Event*);
  void CloseWatcherFiredClose();

  // Dialogs support focus, since the dialog focus algorithm
  // https://html.spec.whatwg.org/multipage/interactive-elements.html#dialog-focusing-steps
  // can decide to focus the dialog itself if the dialog does not have a focus
  // delegate.
  bool SupportsFocus(UpdateBehavior) const override { return true; }
  bool IsKeyboardFocusable(UpdateBehavior update_behavior =
                               UpdateBehavior::kStyleAndLayout) const override;

  // https://html.spec.whatwg.org/C/#the-dialog-element
  // Chooses the focused element when show() or showModal() is invoked.
  void SetFocusForDialog();

  // This is the old dialog initial focus behavior which is currently being
  // replaced by SetFocusForDialog.
  // TODO(http://crbug.com/383230): Remove this when DialogNewFocusBehavior gets
  // to stable with no issues.
  static void SetFocusForDialogLegacy(HTMLDialogElement* dialog);

 private:
  void SetIsModal(bool is_modal);
  void ScheduleCloseEvent();

  bool is_modal_;
  String return_value_;
  WeakMember<Element> previously_focused_element_;

  Member<CloseWatcher> close_watcher_;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_HTML_DIALOG_ELEMENT_H_

三、HTMLDialogElement v8接口定义

out\Debug\gen\third_party\blink\renderer\bindings\core\v8\v8_html_dialog_element.cc

out\Debug\gen\third_party\blink\renderer\bindings\core\v8\v8_html_dialog_element.h

截取部分:

void ShowModalOperationCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_HTMLDialogElement_showModal");
BLINK_BINDINGS_TRACE_EVENT("HTMLDialogElement.showModal");


v8::Isolate* isolate = info.GetIsolate();
v8::Local<v8::Context> current_context = isolate->GetCurrentContext();
ExecutionContext* current_execution_context = ExecutionContext::From(current_context);
// [Measure], [MeasureAs]
UseCounter::Count(current_execution_context, WebFeature::kV8HTMLDialogElement_ShowModal_Method);




const ExceptionContextType exception_context_type = ExceptionContextType::kOperationInvoke;
const char* const class_like_name = "HTMLDialogElement";
const char* const property_name = "showModal";
ExceptionState exception_state(isolate, exception_context_type, class_like_name, property_name);

// [CEReactions]
CEReactionsScope ce_reactions_scope;


v8::Local<v8::Object> v8_receiver = info.This();
HTMLDialogElement* blink_receiver = V8HTMLDialogElement::ToWrappableUnsafe(isolate, v8_receiver);
blink_receiver->showModal(exception_state);
if (UNLIKELY(exception_state.HadException())) {
  return;
}

}

四、打开测试用例test04.html看下堆栈:

要附加新打开的测试页test04.html进程ID=21488

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2203224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CENTOS上的网络安全工具(三十)DPDK和HyperScan环境构建

一、预备知识 由于DPDK涉及到强CPU相关的优化策略&#xff0c;以及对网卡驱动栈的替换&#xff0c;所以在开始之前&#xff0c;首先需要垫补点CPU相关的概念&#xff0c;以及Linux上和网卡驱动相关的管理命令。 &#xff08;一&#xff09;CPU架构及相关概念 1. Socket、Core…

社交网络中的AI趋势:Facebook的创新探索

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的迅速发展正在深刻改变社交网络的面貌。作为全球最大的社交媒体平台之一&#xff0c;Facebook在AI领域的创新探索&#xff0c;不仅提升了用户体验&#xff0c;还推动了整个社交网络生态的演变。本文将深入探讨…

Linux操作系统分析实验-用户与内核共享内存,实验二

Linux操作系统分析实验-多线程与内核模块编程&#xff0c;实验一_实验一 多线程与内核模块编程-CSDN博客 一、实验目的 1、理解Linux进程地址空间、虚拟内存、物理内存的概念&#xff1b; 2、理解物理内存分配和回收原理。 3、利用链表实现动态内存分配。 4、了解共享内存…

VMtools安装办法解决本地与虚机拷贝

一、打开虚拟机选项-重新安装VMware Tools 二、等待虚拟机开启&#xff0c;点开运行(WinR)输入D:/setup.exe 前提正常引用虚拟机光盘介质&#xff0c;保证光驱位置处于D盘&#xff0c;下一步进行安装完成。

Golang | Leetcode Golang题解之第466题统计重复个数

题目&#xff1a; 题解&#xff1a; func getMaxRepetitions(s1 string, n1 int, s2 string, n2 int) int {n : len(s2)cnt : make([]int, n)for i : 0; i < n; i {// 如果重新给一个s1 并且s2是从第i位开始匹配 那么s2可以走多少位&#xff08;走完了就从头开始走p1, p2 :…

Jenkins pipeline语法笔记

Jenkins pipeline 简介Jenkins Pipeline 优势DSL 是什么 pipeline支持两种语法&#xff1a;声明式pipeline语法&#xff1a;Pipelineagent Pipeline 声明式语法DeclarativeenvironmentoptionsparameterstriggerstoolsinputwhenParallel Pipeline Scripted语法流程控制Declarati…

【HarmonyOS】HMRouter使用详解(三)生命周期

生命周期&#xff08;Lifecycle&#xff09; 使用HMRouter的页面跳转时&#xff0c;想实现和Navigation一样的生命周期时&#xff0c;需要通过新建生命周期类来实现对页面对某一个生命周期的监控。 新建Lifecycle类 通过继承IHMLifecycle接口实现生命周期接口的方法重写。 通过…

20240904 华为笔试 二叉树消消乐

文章目录 题目解题思路代码BUG 代码最终代码题目 题目描述 给定原始二叉树和参照二叉树(输入的二叉树均为满二叉树,二叉树节点的值范围为[1,1000],二叉树的深度不超过1000),现对原始二叉树和参照二又树中相同层级目值相同的节点进行消除,消除规则为原始二叉树和参照二又树中…

进程概念三

1&#xff0c;运行状态R 1&#xff0c;理论&#xff1a; 在cpu中&#xff0c;有一个结构体&#xff1a;runqueue组成的一个双向链表&#xff0c;里面记录着对应的进程的代码和数据&#xff0c;存在内存中随时准备被调度&#xff0c;这种时候就叫做运行状态 2&#xff0c;why&a…

25西安电子科技大学考研预报名人数信息—公布

01报名信息直播 西安电子科技大学之前考研收集信息表现在公布&#xff0c;本次收集涉及到833、834、893&#xff08;原953&#xff09;专业&#xff0c;即计算机科学与技术学院、人工智能学院、网络与信息安全学院、卓越工程师学院 对于大家想提问的问题&#xff0c;学长学姐将…

AI智能聊天问答系统源码+AI绘画系统+图文搭建部署教程,文生图图生图,TTS语音识别输入,AI智能体,文档分析

一、前言 人工智能的快速进步吸引了全球的瞩目&#xff0c;各式AI应用如绘图、语言模型和视频处理等已在多个领域获得应用。这些技术不仅加速了科技的创新&#xff0c;也在艺术创作、内容生产和商业实践等方面显示了其巨大潜力。例如&#xff0c;AI语言模型极大提升了内容自动…

Cursor 与 DeepSeek API 的完美融合

在当今的编程领域中&#xff0c;选择合适的工具对于提高编程效率和质量至关重要。今天&#xff0c;我们将深入探讨如何将强大的 AI 辅助编程工具 Cursor 与优秀的 DeepSeek API 进行配置&#xff0c;以实现更加高效的编程体验。 一、Cursor&#xff1a;强大的 AI 辅助编程工具…

前端实现-搜索关键字标红处理

1、实现效果 2、代码实现 searchNotes(data, value) {const searchTerms = value.split( );const aData = [];for (let i = 0; i < data.length; i++) {const item = data[i];let titleMatches = true;let gaishuMatches = true;for (const term of searchTerms) {if (!ite…

Docker 的使用-01

一、Docker 设置和镜像源 1.1、设置 #查看 Docker 信息 docker version docker info#守护线程启动&#xff1a; systemctl daemon-reload 重启Docker服务&#xff1a; systemctl restart docker#关闭Docker服务 sudo systemctl stop docker#启动Docker服务 systemctl start d…

finereport制作带刷新和滚动的明细表

1、数据库查询 SELECT * FROM S订单 limit 602、配置页面内容 里面配置 订单明细 right(now(), 8) FORMAT(today(), "EEEE", "Locale.UK") today()3、时间按秒刷新 # 全页面刷新&#xff0c;则可用以下js: setInterval(“self.location.reload();”,1000…

AI 仅有大模型吗?AI Agent 究竟有多牛?

今天来和大家聊一个当下科技领域特别火爆的概念——AI Agent&#xff01; 前世界首富在其个人博客上写道&#xff1a; AI Agent&#xff08;AI智能体/助理/助手&#xff09;“将彻底改变计算机使用方式&#xff0c;并颠覆软件行业”。 他还预言“Android、iOS和Windows都是平…

喜讯!迈威通信TSN产品通过“时间敏感网络(TSN)产业链名录计划”评测,各项指标名列前茅

TSN技术&#xff0c;作为推动企业网络化与智能化转型的关键力量&#xff0c;已成为工业网络迈向下一代演进的共识方向&#xff0c;正加速重构工业网络的技术架构与产业生态。为响应这一趋势&#xff0c;工业互联网产业联盟携手中国信息通信研究院及50余家产学研用单位&#xff…

leetcode---素数,最小质因子,最大公约数

1 判断一个数是不是质数(素数) 方法1&#xff1a;依次判断能否被n整除即可&#xff0c;能够整除则不是质数&#xff0c;否则是质数 方法2&#xff1a;假如n是合数&#xff0c;必然存在非1的两个约数p1和p2&#xff0c;其中p1<sqrt(n)&#xff0c;p2>sqrt(n)。 方法3&…

【Unity学习笔记】解决疑似升级Win11或使用Unity6导致Unity旧版本无法打开的问题

【Unity学习笔记】解决疑似升级Win11或使用Unity6导致Unity旧版本无法打开的问题 一句话省流&#xff1a; 确保项目地址没有任何中文&#xff0c;重新申请个许可证&#xff0c;然后该咋就咋&#xff0c;完事。 ——————————————————————————————…

攻防世界(CTF)~Reverse-easyRE1

题目介绍 下载附件后一个32位一个64位 64位的放到ExeinfoPE查看一下有无壳子&#xff08;无壳&#xff09; 放IDA看一下伪代码&#xff0c;习惯性看一下main函数&#xff0c;直接发现了flag flag{db2f62a36a018bce28e46d976e3f9864}