为什么一个decidePolicyForNavigationAction请求中的url返回http://localhost:8888/%E2%80%9Chttp://example.com%E2%80%9D

Jua*_*ank 3 macos iframe cocoa webview

早上好,

我有一个 mac webView(不是 iOS UIWebView),它加载的 url 指向http://localhost:8888. 加载的 html 包含链接和 iframe,但是当加载 iframe 或单击链接时,主页会尝试加载http://localhost:8888/%E2%80%9Chttp://example.com%E2%80%9D然后重新加载原始页面http://localhost:8888.。更奇怪的是,打开的链接或 iframe 确实试图加载http://localhost:8888/%E2%80%9Chttp://example.com%E2%80%9D.

我试图用decidePolicyForNavigationAction 来处理这个问题,但[request URL]值以这种方式到达并解析它以提取嵌入的url 似乎很hackish。

关于为什么 webView 以这种方式构建 url 以及如何正确处理加载 iframe 和链接的任何想法?

- (void)webView:(WebView *)webView
decidePolicyForNavigationAction:(NSDictionary *)actionInformation
        request:(NSURLRequest *)request
          frame:(WebFrame *)frame
decisionListener:(id <WebPolicyDecisionListener>)listener
{
    NSLog(@"Navigating to %@", [request URL]); // returns http://localhost:8888/%E2%80%9Chttp://example.com%E2%80%9D
    [listener use];
}

- (void)webView:(WebView *)webView
decidePolicyForNewWindowAction:(NSDictionary *)actionInformation
        request:(NSURLRequest *)request
   newFrameName:(NSString *)frameName
decisionListener:(id < WebPolicyDecisionListener >)listener {
    if ([actionInformation objectForKey:WebActionElementKey]) {
        // Happens here also :(
        NSLog(@"Opening in browser %@", [request URL]);
        [[NSWorkspace sharedWorkspace] openURL:[request URL]];
    }
}
Run Code Online (Sandbox Code Playgroud)

hru*_*ing 6

请注意,您的 URL 具有转义序列%E2%80%9C并对其进行%E2%80%9D包装。这些是URI转义序列分别。那些看起来像",但“开始”和“结束”双引号的字符略有不同。当 webView 处理 HTML 并在 之后查找属性值时href,webView 没有找到按预期包装属性值的双引号或单引号。相反,它会找到另一个字符。由于引用不是预期的 HTML 属性引用字符,因此 webView 将其解释为 URL 的一部分。由于 URL 不以已知协议(http://https://等)或 URL 根 ( /)开头,因此 webView 将 URL 解释为相对于给定 URL (http://localhost:8888/)。为了使其成为有效的 URL(特定 ASCII 字符),它会转义两个非 ASCII 富引号字符。这就是为什么它们在您的 URL 中显示为%E2%80%9Cand%E2%80%9D而不是and 的原因。更简洁:

  • href=“http://example.com” 不一样 href="http://example.com"
  • 拉取的 URL 是“http://example.com”,不是http://example.com
  • URL 是相对的,所以它变成 http://localhost:8888/“http://example.com”
  • URL 必须是 ASCII 安全的,所以非 ASCII 字符被编码,导致 http://localhost:8888%E2%80%9Chttp://example.com%E2%80%9D

最有可能的是,有人从 Word 文档或其他富文本格式器之类的东西中复制并粘贴了 HTML,这通常会将简单的双引号变成“更丰富”的格式双引号。用适当的双引号或单引号替换丰富的引号,您的链接将开始按预期工作。