在geolocation.h
文件中,可以找到一个私有成员
Member<GeoNotifierSet> one_shots_;
Member<GeolocationWatchers> watchers_;
// GeoNotifiers that are in the middle of invocation.
//
// |HandleError(error)| and |MakeSuccessCallbacks| need to clear |one_shots_|
// (and optionally |watchers_|) before invoking the callbacks, in order to
// avoid clearing notifiers added by calls to Geolocation methods
// from the callbacks. Thus, something else needs to make the notifiers being
// invoked alive with wrapper-tracing because V8 GC may run during the
// callbacks. |one_shots_being_invoked_| and |watchers_being_invoked_| perform
// wrapper-tracing.
// TODO(https://crbug.com/796145): Remove this hack once on-stack objects
// get supported by either of wrapper-tracing or unified GC.
Member<GeoNotifierSet> one_shots_being_invoked_;
HeapVector<Member<GeoNotifier>> watchers_being_invoked_;
Member<Geoposition> last_position_;
这个last_position_
就是返回位置的关键对象,通过这个对象获取到最后一次的位置并返回。
我们去.cc文件中查看修改这个对象的部分
在OnPositionUpdated
函数中对这个成员变量进行了修改,修改的值是通过传进来的参数result来获得的,如果我们想要修改这个值,需要拦截更新的部分,把它变成我们自定义的值。
last_position的类型
如果我们想要修改这个值,首先要搞清楚这是一个什么类型,我们从.h中可以获取到
Member<Geoposition> last_position_;
last_position_
是一个Member<Geoposition>
类型的对象。
详细分析一下其中的语法:
Member
类:Member
是一个模板类,用于管理指向垃圾回收堆(heap)中对象的指针。它确保这些对象在不再使用时能够被正确地回收。- 例如,
Member<Geoposition>
表示一个指向Geoposition
对象的指针,并且这个指针由垃圾回收机制管理。
Geoposition
类:Geoposition
是一个类,通常用于表示地理位置信息,包括经度、纬度、高度等。
last_position_
变量:last_position_
是一个Member<Geoposition>
类型的成员变量,表示最后一次记录的地理位置信息。
所以我们需要找到Geoposition
类的定义及构造方法,这样才能自定义出来一个新的对象。
Geoposition类
打开相同目录下的geoposition.h
,查看与构造有关的代码。
构造需要一个GeolocationCoordinates
类型的指针与一个EpochTimeStamp
类型的时间戳,EpochTimeStamp
我们可以通过blink层的静态方法ConvertTimeToEpochTimeStamp
与base库中的time.h中的方法获得。
blink::ConvertTimeToEpochTimeStamp(base::Time::Now());
这样就可以获得当前时间的EpochTimeStamp
类型的时间戳。
GeolocationCoordinates类
我们去相同目录下的GeolocationCoordinates.h
中查看其成员与构造方法。
可以看到它是由传入七个对应的数值来进行构造,其中有一些可选项。
具体的对应的含义如下
// 纬度
double latitude_;
// 经度
double longitude_;
// 海拔,可选
std::optional<double> altitude_;
// 精度
double accuracy_;
// 海拔精度,可选
std::optional<double> altitude_accuracy_;
// 方向,可选
std::optional<double> heading_;
// 速度,可选
std::optional<double> speed_;
结语
通过本文的详细分析,我们已经了解了如何在Chromium源码中找到并修改Geolocation API的返回值。我们探讨了last_position_
变量的类型和作用,并深入分析了Geoposition
类和GeolocationCoordinates
类的构造方法。通过这些知识,我们可以自定义地理位置信息,从而实现修改浏览器指纹的目的。
在下一篇文章中,我们将继续深入探讨如何具体实现这些修改,并提供详细的代码示例和操作步骤,帮助读者更好地掌握这项技术。敬请期待!
标签:Geolocation,last,being,Member,2024,修改,API,position,Geoposition From: https://blog.csdn.net/qqyy_sj/article/details/143290899