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

时间:2014-07-24 15:05:14

标签: macos cocoa iframe 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

我尝试使用decisionPolicyForNavigationAction处理此问题,但[request URL]值以这种方式到达并解析它以提取嵌入的url似乎是hackish。

关于为什么webView以这种方式构建网址以及如何正确处理加载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]];
    }
}

1 个答案:

答案 0 :(得分:4)

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

  • href=“http://example.com”href="http://example.com"
  • 不同
  • 提取的网址为“http://example.com”,而不是http://example.com
  • 网址是相对的,因此它变为http://localhost:8888/“http://example.com”
  • 网址必须是ASCII安全的,因此非ASCII字符会被编码,从而产生http://localhost:8888%E2%80%9Chttp://example.com%E2%80%9D

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