Google Chrome应用:Webview行为

时间:2013-05-19 14:28:47

标签: javascript google-chrome google-chrome-app behavior google-chrome-webview

在Chrome扩展程序中<iframe>上研究问题时,Chrome应用中的<webview>引起了我的注意,让我感兴趣。

所以我决定做一个我在<iframe>面临的问题的小例子,看看<webview>是否解决了问题。根据我对观看Chrome开发视频的理解,webview在与您的应用无关的单独进程中运行;它与您的应用没有相同的权限。所以我假设如果运行中的内容以某种方式与“主线程”(app)分开,我猜他们的内容将彼此分开执行,不会阻止应用程序或其他任何一个可能有一个可能长时间运行js executon。因此我做了以下事情:

background.js

chrome.app.runtime.onLaunched.addListener(function() {
  // Tell your app what to launch and how.
  chrome.app.window.create('window.html', {
      width: 1800,
      height: 1000
  });
});

的manifest.json

{
  // Required
  "name": "Hello World!",
  "version": "0.1",
  "manifest_version": 2,

  // Recommended
  "description": "My first packaged app.",
  "icons": { "16": "calculator-16.png", "128": "calculator-128.png" },
  // "default_locale": "en",

  // Pick one (or none) OF browser_action, page_action, theme, app 

  "app": {
    "background": {
      "scripts": [ "background.js" ]
    }
  },

  "minimum_chrome_version": "23",

  "permissions": [ "webview" ]

}

window.html

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <div>Hello, world!</div>
    <webview id="wv1" style="width: 450px; height: 300px; border: 2px solid red" src="http://www.google.com"></webview>
    <webview id="wv2" style="width: 450px; height: 300px; border: 2px solid red" src="http://www.nytimes.com"></webview>
    <webview id="wv3" style="width: 450px; height: 300px; border: 2px solid red" src="http://www.stackoverflow.com"></webview>
    <webview id="wv4" style="width: 450px; height: 300px; border: 2px solid red" src="http://db.tt/FCCA7nuz"></webview>
  </body>
</html>

其中三个网页浏览量是普通网页,第四个只是一个长期运行的js文件的示例,您可以检查代码或我可以在以后提供它。 如果我打开4个谷歌浏览器窗口,输入地址,按回车键,我会观察到:3个页面立即加载,另一个用长js执行仍然有效。

如果我在网页中执行此操作,使用打开这4个网页,因为它们都在同一个进程中,如果由于js执行导致1个页面缓慢/阻塞,则所有其他网页都将被阻止。

现在使用Chrome应用程序,使用我注意到一些有趣和奇怪的行为。我注意到以下几点:

  1. 如果我只加载前3个网页,则加载速度很快且“同时”出现;
  2. 如果我按原样加载所有网页,我会看到前3页加载,最后3页因为它有一个很长的js执行需要他的时间然后它显示(这将是最佳行为),因为它们是不同的他们不应该依赖于webview是否缓慢,其他人必须等待;
  3. 现在,如果我评论第三个,刷新并执行应用程序,我看到没有webview,直到完成了longscript的那个。 (为什么会这样?)
  4. 上述要点是随机的,要么就像我提到的那样,要么就是没有。
  5. 最后,让我们添加另一个<webview id="wv5" style="width: 450px; height: 300px; border: 2px solid red" src="http://developer.chrome.com"></webview>,对我来说会发生什么:前三个加载,第四个正在执行,完成后显示然后我看到第五个渲染。
  6. 我的主要问题/怀疑是关于行为,因为它们实际上是在一个单独的进程中运行,为什么它没有与浏览器窗口相同的行为,为什么那个webview会阻止其他工作/渲染,是打算按原样工作吗?我应该做一些解决方法来检测一段时间后webview是否没有完成跳过负载并让其他人加载,那么我可以回到慢速的那些?

    提前谢谢。

1 个答案:

答案 0 :(得分:9)

Webview在与您的应用程序不同的进程中运行,但它们在同一分区中以相同的进程运行。如果未指定分区属性,则它们将处于相同的默认属性中。如果您查看Chrome任务管理器(shift + esc),您会看到: enter image description here

(注意进程ID列)

如果您使用tag属性将每个webview设置为不同的分区:

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <div>Hello, world!</div>
    <webview id="wv1" partition="p1" style="width: 450px; height: 300px; border: 2px solid red" src="http://www.google.com"></webview>
    <webview id="wv2" partition="p2" style="width: 450px; height: 300px; border: 2px solid red" src="http://www.nytimes.com"></webview>
    <webview id="wv3" partition="p3" style="width: 450px; height: 300px; border: 2px solid red" src="http://www.stackoverflow.com"></webview>
    <webview id="wv4" partition="p4" style="width: 450px; height: 300px; border: 2px solid red" src="http://db.tt/FCCA7nuz"></webview>
  </body>
</html>

您将看到每个webview现在都在自己的进程中运行:

enter image description here