Chromium 中js Fetch API接口c++代码实现(二)

news2024/11/19 16:36:37

Chromium 中JavaScript Fetch API接口c++代码实现(一)-CSDN博客

接着上一篇继续介绍调用,上函数堆栈。

1、打开http://192.168.8.1/chfs/shared/test/test02.html

此标签进程ID12484,

2、打开vs附加上此进程ID12484

3、点击页面测试按钮 调转到c++代码

F:\code\google\src\third_party\blink\renderer\core\fetch\fetch_manager.cc

ScriptPromise FetchManager::Fetch(ScriptState* script_state,
                                  FetchRequestData* request,
                                  AbortSignal* signal,
                                  ExceptionState& exception_state) {
  DCHECK(signal);
  if (signal->aborted()) {
    exception_state.RethrowV8Exception(signal->reason(script_state).V8Value());
    return ScriptPromise();
  }

  request->SetDestination(network::mojom::RequestDestination::kEmpty);

  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(
      script_state, exception_state.GetContext());
  ScriptPromise promise = resolver->Promise();

  auto* loader = MakeGarbageCollected<Loader>(
      GetExecutionContext(), this, resolver, request, script_state, signal);
  loaders_.insert(loader);
  // TODO(ricea): Reject the Response body with AbortError, not TypeError.
  loader->Start(exception_state);
  return promise;
}

可以看到已经进入fetch函数

4、response响应堆栈:

third_party\blink\renderer\platform\loader\fetch\url_loader\background_url_loader.cc

5、third_party\blink\renderer\platform\loader\fetch\resource_loader.h 资源加载响应

   \third_party\blink\renderer\platform\loader\fetch\resource_loader.cc

   //通知body 响应response.json()函数
 

  // FrameType never changes during the lifetime of a request.
  if (auto* observer = fetcher_->GetResourceLoadObserver()) {
    ResourceRequest request_for_obserber(initial_request);
    // TODO(yoichio): Have DidReceiveResponse take a ResourceResponseHead, not
    // ResourceRequest.


    observer->DidReceiveResponse(
        resource_->InspectorId(), request_for_obserber, response, resource_,
        ResourceLoadObserver::ResponseSource::kNotFromMemoryCache);
  }

6、src\out\Debug\gen\third_party\blink\renderer\bindings\core\v8\v8_response.cc

void JsonOperationCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_Response_json");
BLINK_BINDINGS_TRACE_EVENT("Response.json");

// Promise returning function: Convert a TypeError to a reject promise.
v8::Isolate* isolate = info.GetIsolate();
v8::Local<v8::Object> v8_receiver = info.This();
const ExceptionContextType exception_context_type = ExceptionContextType::kOperationInvoke;
const char* const class_like_name = "Response";
const char* const property_name = "json";
ExceptionState exception_state(isolate, exception_context_type, class_like_name, property_name);
ExceptionToRejectPromiseScope reject_promise_scope(info, exception_state);
if (!V8Response::HasInstance(isolate, v8_receiver)) {
  exception_state.ThrowTypeError("Illegal invocation");
return;
}







Response* blink_receiver = V8Response::ToWrappableUnsafe(isolate, v8_receiver);
v8::Local<v8::Context> receiver_context = v8_receiver->GetCreationContextChecked();
ScriptState* receiver_script_state = ScriptState::From(receiver_context);
ScriptState* script_state = receiver_script_state;
auto&& return_value = blink_receiver->json(script_state, exception_state);
if (UNLIKELY(exception_state.HadException())) {
  return;
}
bindings::V8SetReturnValue(info, return_value);
}

7、src\third_party\blink\renderer\core\fetch\body.cc

Response.json 响应

ScriptPromise Body::json(ScriptState* script_state,
                         ExceptionState& exception_state) {
  auto on_no_body = [script_state](ScriptPromiseResolver* resolver) {
    resolver->Reject(V8ThrowException::CreateSyntaxError(
        script_state->GetIsolate(), "Unexpected end of input"));
  };
  return LoadAndConvertBody<BodyJsonConsumer>(
      script_state, &CreateLoaderAsStringWithUTF8Decode, on_no_body,
      exception_state);
}

8、最后返回前端 效果如下:

至于其他细节,自行查看代码吧,用户还可以通过此处源码自行修改前端的一些请求数据。

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

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

相关文章

uni-app 开发的应用快速构建成鸿蒙原生应用

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;它支持编译到 iOS、Android、小程序等多个平台。对于 HarmonyOS&#xff08;鸿蒙系统&#xff09;&#xff0c;uni-app 提供了特定的支持&#xff0c;允许开发者构建鸿蒙原生应用。 一、uni-app 对 HarmonyOS 的支…

分治算法(7)_归并排序_计算右侧小于当前元素的个数

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 分治算法(7)_归并排序_计算右侧小于当前元素的个数 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&…

公司防泄密软件哪个好?6款公司内部文件防泄密软件,2024超好用推荐!

企业的核心机密就如同生命之源&#xff0c;然而&#xff0c;数据泄露的风险也随之而来&#xff0c;让不少企业头疼不已。 面对这一挑战&#xff0c;选择一款高效、可靠的防泄密软件显得尤为重要。 那么&#xff0c;公司防泄密软件哪个好&#xff1f; 接下来&#xff0c;就让我…

攻防世界---->[简单] 初识RSA

做题笔记。 下载 是一个.py的文件。 用 Notepad打开瞅瞅。 分析&#xff1a; L (p-1)*(q-1) dgmpy2.invert(e,L) 求逆元快速算出来&#xff1a;invert(e,φ(N)) 求出d值。 n p*q pq p*(q-1) qp q*(p-1) L 【q*(p-1) * p*(q-1)】 // p*q >>> (p-1)*(…

C++关于树的基础知识

首先区分概念 “度为m的树”指的是至少有一个结点的度是m&#xff0c;一定是非空树 “m叉树”指的是允许所有的结点都小于m&#xff0c;且可以是空树 常见考点&#xff1a; 度为m的树的第i层最多有个结点 &#xff08;对于m叉树也相同&#xff09; 第一层m的0次方 第二层m的…

如何帮助企业进行有效的专利管理?

专利管理是企业创新发展的重要支撑&#xff0c;有效的专利管理不仅能保护企业的创新成果&#xff0c;还能提升企业的核心竞争力。那么&#xff0c;究竟该如何帮助企业进行有效的专利管理呢&#xff1f;接下来&#xff0c;本文将为您详细解答。 一、专利管理对企业的重要性 1. 保…

[ROS2]解决PyQt5和sip的各种报错问题 stderr: qt_gui_cpp

前言 编译ros环境的时候遇到了qt_gui_cpp各种编译问题&#xff0c;但是鉴于网上解决方法基本没有&#xff0c;故记录下来帮助后来者。整篇文章总结下来就是一句话&#xff1a;PyQt5和sip安装过程或安装版本有问题&#xff0c;需要重新安装。 问题与解决方法 如果PyQt5你是正…

华为OD机试 - 处理器问题(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

一文了解:LLM Dropout

咱们来聊聊&#xff0c;啥样的预测模型才算是好模型&#xff1f;简单来说&#xff0c;就是那种在处理它从没见过的数据时&#xff0c;也能表现得特别棒的模型。老派的泛化理论告诉我们&#xff0c;要想让模型在训练集和测试集上都表现差不多&#xff0c;就得让模型简单点。这个…

以一个B站必剪应用Bug过一下CVSS 4.0评分

Bug的内容就是Mac上的必剪无法完成B站视频上传新手任务。 这个从B站客服那里确认了。 没多大事儿,这是个设备相关的bug,我们也可以认为这样的小bug对用户是无害的,此时评分为0,无影响,但从学习角度出发我们将部分评分提高到L,也就是假设这是个CVE的话,聊一下安全问题。…

为什么推荐你一定要弄懂千门八将108局,学会做局思维的人有多么的厉害?

在纷繁复杂的社会与商业环境中&#xff0c;能够洞悉事物本质、预见趋势并巧妙布局的人&#xff0c;往往能在竞争中脱颖而出&#xff0c;成为时代的弄潮儿。而“千门八将108局”这一古老而深邃的智慧体系&#xff0c;不仅蕴含了中国传统文化中对于策略、心理学、人际交往的深刻理…

Java 集合实现类

Java 集合实现类 ​ Java 提供了一套实现了 Collection 接口的标准集合类。其中一些是具体类&#xff0c;这些类可以直接拿来使用&#xff0c;而另外一些是抽象类&#xff0c;提供了接口的部分实现 序号类描述1AbstractCollection 实现了大部分的集合接口。2AbstractList 继承…

java中日期时间类的api

目录 1. Instant 类 构造方法 1&#xff09;Instant.now()&#xff1a;获取当前时间戳。 常用方法 1&#xff09;plus(Duration duration) 2&#xff09;minus(Duration duration) 3&#xff09;toEpochMilli() 4&#xff09;ofEpochMilli(long epochMilli) 5&#xff09;案例:…

网站建设公司哪家好?好的网站建设公司应该有哪些特别之处?

面对众多的网站建设公司&#xff0c;企业该如何选择呢&#xff1f;如何才能避坑呢&#xff1f;本文将探讨好的网站建设公司应该具备的特别之处 案例&#xff0c;这是最直观的表现&#xff0c;一个好的网站建设公司必然拥有为数众多的的案例展示&#xff0c;且这些案例质量高&a…

基于resnet网络【系列】多类别图像识别、迁移学习:猫狗分类实战

目录 1、前言 2、resnet 猫狗分类实战 2.1 训练 2.2 推理 3、更换数据集训练 1、前言 ResNet&#xff08;残差网络&#xff09;是一种深度卷积神经网络架构&#xff0c;广泛用于图像分类任务。它是由微软研究院的研究人员于2015年推出的&#xff0c;以其通过使用残差连接…

Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)

引言 想象一下&#xff0c;只要描述你想要的画面&#xff0c;电脑就能帮你画出来。这在几年前还像是科幻小说里的场景&#xff0c;但随着神经网络和潜在扩散模型&#xff08;LDM&#xff09;技术的发展&#xff0c;现在已经成为可能。OpenAI 推出的 DALLE 工具&#xff0c;因其…

vue项目刷新后h5样式失效

vue项目刷新后h5样式失效 今天遇到一个bug&#xff0c;有一个Element的message组件&#xff0c;用它做的一个进度条&#xff0c;它是写在一个页面上&#xff0c;并且是用js控制dom元素的 web端一切正常&#xff0c;h5如果从别的页面跳过来也正常&#xff0c;但是&#xff0c;H…

服装生产管理:SpringBoot框架的高效策略

5 系统的实现 5.1 登录界面的实现 用户要想进入本系统必须进行登录操作&#xff0c;进入对应角色登录界面&#xff0c;在登录界面输入系统账号、登录密码&#xff0c;选择登录类型&#xff0c;点击登录按钮进行登录系统&#xff0c;管理员登录界面展示如图5-1所示&#xff0c…

【STM32开发之寄存器版】(八)-定时器的编码器接口模式

一、前言 1.1 编码器接口原理 编码器模式主要用于检测旋转编码器的转动方向和转动速度。旋转编码器一般输出两路相位相差90度的脉冲信号&#xff08;称为A相和B相&#xff09;&#xff0c;通过这两路信号&#xff0c;定时器可以判断编码器的旋转方向&#xff0c;并计数转动的脉…

嵌入式学习-线性表Day03-栈

嵌入式学习-线性表Day03-栈 栈 顺序栈 2&#xff09;入栈 3&#xff09;出栈 链式栈 栈 什么是栈? 只能在一端进行插入和删除操作的线性表&#xff08;又称为堆栈&#xff09;&#xff0c;进行插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底 栈特点&#xff1a; 先进…