Chromium 中js navigator对象c++实现分析

农民  论坛元老 | 2024-10-9 14:38:07 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1561|帖子 1561|积分 4683

一、Navigator 对象

Navigator 对象包罗有关浏览器的信息。

前端测试例子:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>接口测试</title>
  6. </head>
  7. <body>
  8.        
  9. <div id="example"></div>
  10. <script>
  11. txt = "<p>浏览器代号: " + navigator.appCodeName + "</p>";
  12. txt+= "<p>浏览器名称: " + navigator.appName + "</p>";
  13. txt+= "<p>浏览器版本: " + navigator.appVersion + "</p>";
  14. txt+= "<p>启用Cookies: " + navigator.cookieEnabled + "</p>";
  15. txt+= "<p>硬件平台: " + navigator.platform + "</p>";
  16. txt+= "<p>用户代理: " + navigator.userAgent + "</p>";
  17. txt+= "<p>用户代理语言: " + navigator.language + "</p>";
  18. document.getElementById("example").innerHTML=txt;
  19. </script>
  20. </body>
  21. </html>
复制代码
二、Navigator对象c++代码实现如下:

    1)、Navigator接口界说third_party\blink\renderer\core\frame\navigator.idl 

              
  1. // https://html.spec.whatwg.org/C/#the-navigator-object
  2. [
  3.     Exposed=Window
  4. ] interface Navigator {
  5.     // objects implementing this interface also implement the interfaces given below
  6.     // TODO(foolip): vendorSub should be on NavigatorID.
  7.     [HighEntropy=Direct, MeasureAs=NavigatorVendorSub] readonly attribute DOMString vendorSub;
  8.     // TODO(foolip): productSub and vendor are not yet in the spec:
  9.     // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27954
  10.     [HighEntropy=Direct, MeasureAs=NavigatorProductSub] readonly attribute DOMString productSub;
  11.     // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27786
  12.     [HighEntropy=Direct, MeasureAs=NavigatorVendor] readonly attribute DOMString vendor;
  13. };
  14. Navigator includes NavigatorConcurrentHardware;
  15. Navigator includes NavigatorCookies;
  16. Navigator includes NavigatorDeviceMemory;
  17. Navigator includes NavigatorID;
  18. Navigator includes NavigatorLanguage;
  19. Navigator includes NavigatorOnLine;
  20. Navigator includes NavigatorAutomationInformation;
  21. Navigator includes NavigatorUA;
复制代码
    1.1)、third_party\blink\renderer\core\frame\navigator_id.idl

  1. // https://html.spec.whatwg.org/C/#client-identification
  2. interface mixin NavigatorID {
  3.     readonly attribute DOMString appCodeName; // constant "Mozilla"
  4.     readonly attribute DOMString appName; // constant "Netscape"
  5.     [HighEntropy=Direct, MeasureAs=NavigatorAppVersion] readonly attribute DOMString appVersion;
  6.     [HighEntropy=Direct, MeasureAs=NavigatorPlatform] readonly attribute DOMString platform;
  7.     readonly attribute DOMString product; // constant "Gecko"
  8.     // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22555
  9.     // boolean taintEnabled(); // constant false
  10.     [HighEntropy=Direct, MeasureAs=NavigatorUserAgent] readonly attribute DOMString userAgent;
  11. };
复制代码

2)、Navigator接口c++实现文件:

2.1)、third_party\blink\renderer\core\frame\navigator.h
            third_party\blink\renderer\core\frame\navigator.cc
  1. #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_NAVIGATOR_H_
  2. #define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_NAVIGATOR_H_
  3. #include "third_party/blink/public/common/user_agent/user_agent_metadata.h"
  4. #include "third_party/blink/renderer/core/core_export.h"
  5. #include "third_party/blink/renderer/core/execution_context/navigator_base.h"
  6. #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
  7. #include "third_party/blink/renderer/platform/supplementable.h"
  8. #include "third_party/blink/renderer/platform/wtf/forward.h"
  9. namespace blink {
  10. class CORE_EXPORT Navigator final : public NavigatorBase,
  11.                                     public Supplementable<Navigator> {
  12.   DEFINE_WRAPPERTYPEINFO();
  13. public:
  14.   explicit Navigator(ExecutionContext*);
  15.   // NavigatorCookies
  16.   bool cookieEnabled() const;
  17.   bool webdriver() const;
  18.   String productSub() const;
  19.   String vendor() const;
  20.   String vendorSub() const;
  21.   String platform() const override;
  22.   String GetAcceptLanguages() override;
  23.   void SetUserAgentMetadataForTesting(UserAgentMetadata);
  24.   void Trace(Visitor*) const override;
  25. private:
  26.   UserAgentMetadata metadata_;
  27. };
  28. }  // namespace blink
  29. #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_NAVIGATOR_H_
复制代码
  2.2)、
        third_party\blink\renderer\core\frame\navigator_id.h
        third_party\blink\renderer\core\frame\navigator_id.cc
  1. #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_NAVIGATOR_ID_H_
  2. #define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_NAVIGATOR_ID_H_
  3. #include "third_party/blink/renderer/core/core_export.h"
  4. #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
  5. namespace blink {
  6. class CORE_EXPORT NavigatorID {
  7. public:
  8.   String appCodeName();
  9.   String appName();
  10.   String appVersion();
  11.   virtual String platform() const;
  12.   String product();
  13.   virtual String userAgent() const = 0;
  14. };
  15. }  // namespace blink
  16. #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_NAVIGATOR_ID_H_
复制代码
3)、v8_navigator接口注册实现文件:

    out\Debug\gen\third_party\blink\renderer\bindings\modules\v8\v8_navigator.cc
    out\Debug\gen\third_party\blink\renderer\bindings\modules\v8\v8_navigator.h
   摘取其中navigator注册以及回调函数界说:
  1. v8::Local<v8::FunctionTemplate> interface_function_template = interface_template.As<v8::FunctionTemplate>();
  2. v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interface_function_template);
  3. {
  4.   static const IDLMemberInstaller::AttributeConfig kAttributeTable[] = {
  5. {"vendorSub", VendorSubAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  6. {"productSub", ProductSubAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  7. {"vendor", VendorAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  8. {"maxTouchPoints", MaxTouchPointsAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  9. {"scheduling", SchedulingAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  10. {"userActivation", UserActivationAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  11. {"doNotTrack", DoNotTrackAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  12. {"geolocation", GeolocationAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  13. {"connection", ConnectionAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  14. {"plugins", PluginsAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  15. {"mimeTypes", MimeTypesAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  16. {"pdfViewerEnabled", PdfViewerEnabledAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  17. {"webkitTemporaryStorage", WebkitTemporaryStorageAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  18. {"webkitPersistentStorage", WebkitPersistentStorageAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  19. {"hardwareConcurrency", HardwareConcurrencyAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  20. {"cookieEnabled", CookieEnabledAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  21. {"appCodeName", AppCodeNameAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  22. {"appName", AppNameAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  23. {"appVersion", AppVersionAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  24. {"platform", PlatformAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  25. {"product", ProductAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  26. {"userAgent", UserAgentAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  27. {"language", LanguageAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  28. {"languages", LanguagesAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  29. {"onLine", OnLineAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  30. {"webdriver", WebdriverAttributeGetCallback, nullptr, unsigned(v8::None), unsigned(IDLMemberInstaller::FlagLocation::kPrototype), unsigned(IDLMemberInstaller::FlagWorld::kAllWorlds), unsigned(IDLMemberInstaller::FlagReceiverCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(IDLMemberInstaller::FlagCrossOriginCheck::kCheck), unsigned(v8::SideEffectType::kHasNoSideEffect), unsigned(V8PrivateProperty::CachedAccessor::kNone)},
  31. };
  32. IDLMemberInstaller::InstallAttributes(isolate, world, instance_template, prototype_template, interface_template, signature, kAttributeTable);
  33. }
复制代码
里面其他接口界说,可以自行根据属性值 搜刮idl文件。
4)、打开测试用例看下调用堆栈:

     AppVersionAttributeGetCallback【在v8_navigator.cc 】调用 NavigatorID::appVersion()【navigator_id.cc】。

至此分析完毕,必要改此处的可以在 navigator_id.cc里面做文章。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表