我在Linux上使用带有WebKit-GTK 2.4.9的WebKitGTK1 API的应用程序。 (这是Debian Jessie的当前版本,2.5+版本不支持v1 API。)
我已经实现了一个自定义URI方案,用于通过resource-request-starting
处理程序加载整个基本页面内容,该处理程序通过webkit_web_resource_get_uri
解析传入的URI,如果它与自定义方案匹配,则生成一些HTML内容并调用webkit_network_request_set_uri
将原始URI替换为包含要呈现内容的base64'd data:
URI。 (这类似于this question的接受答案。)
这大部分工作得很好,我的处理程序在每个请求上被调用(包括具有相同原始URI的重复请求)并生成正确的内容 - 但是在上游的某个地方,浏览器似乎只呈现任何给定原始的第一个返回数据URI,即使我生成的数据URI不同。
可能需要注意的是webkit_web_resource_get_uri
即使在调用data:
之后也会返回原始的非webkit_network_request_set_uri
URI,因此我假设此URI正在被缓存,然后被用作某个更高级别组件中的密钥,用于缓存数据,而不是使用请求中的真实 URI。
不幸的是,这似乎是G_PARAM_CONSTRUCT_ONLY
属性,并且似乎没有任何公共API可以设置和/或清除它,以便它使用请求的重写URI。有没有办法迫使GTK在施工后设置属性?据我所知,它内部有一个setter方法,如果内部属性被重置为NULL,getter将执行Right Thing™。
或者是否有一些更好的方法来强制WebKit呈现新的data:
URI,尽管它有任何相反的想法?
目前,我通过包含使其在原始自定义URI中生成不同数据的值(传递给webkit_web_view_load_uri
或生成的页面中的链接)来解决这个问题。这个确实有效,但它有点难看,如果我将来忘记添加某些内容,或者某些内容会改变生成但事先不知道,则可能会出现问题。看起来有点愚蠢,它会引发所有引发生成正确数据的事件的麻烦,只是稍后将其抛弃(大概),因为错误的URI上的URI比较。
我认为使用已知的唯一值(例如,顺序递增id)也可以工作,并解决一些未知的未知问题,但这并不简单。