在研究 <iframe>
上的问题时在 Chrome 扩展上,<webview>
在 Chrome 应用程序中引起了我的注意并引起了我的兴趣。
所以我决定做一个我在 <iframe>
上面临的问题的小例子看看是否<webview>
解决它。根据我对观看 Chrome 开发视频的理解,webview
在与您的应用程序不同的进程中运行;它没有与您的应用程序相同的权限。所以我假设如果运行中的内容以某种方式与“主线程”(应用程序)分开,我猜他们的内容将彼此分开执行而不阻塞应用程序或另一个,以防它们中的任何一个可能有可能长时间运行的 js 执行。因此我做了以下事情:
背景.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
});
});
list .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" ]
}
窗口.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>
其中三个 webviews 是普通网页,第四个只是一个长时间运行的 js 文件的示例,您可以检查代码或者我稍后提供。 如果我打开 4 个 google chrome 浏览器窗口,输入地址,按回车键,我会观察到:3 个页面立即加载,另一个执行长 js 的页面仍然有效。
如果我在一个网页中这样做,用于打开这 4 个网页,因为它们都在同一个进程中,如果 1 个页面由于 js 执行而缓慢/阻塞,所有其他页面将被阻塞。
现在使用 Chrome 应用程序,使用我注意到一些有趣和奇怪的行为。我注意到以下几点:
- 如果我只加载前 3 个网页,加载速度很快,而且看起来是“同时”;
- 如果我按原样加载所有网页,我会看到前 3 个页面正在加载,最后一个页面因为它有一个很长的 js 执行需要他的时间然后它显示(这将是最佳行为),因为它们是不同的他们不应该依赖的进程如果 webview 很慢,其他人必须等待;
- 现在,如果我评论第三个,刷新并执行该应用程序,我将看不到 webview,直到带有 longscript 的那个完成。 (为什么会这样?)
- 上面的点是随机的,要么像我提到的那样发生,要么没有发生。
- 最后,让我们再添加一个
<webview id="wv5" style="width: 450px; height: 300px; border: 2px solid red" src="http://developer.chrome.com"></webview>
,对我来说会发生的是:前三个被加载,第四个正在执行,完成并显示后我看到第五个呈现。
我的主要问题/怀疑是关于行为的,因为它们实际上是在一个单独的进程中运行,为什么它没有与浏览器窗口相同的行为,例如,为什么 webview 阻止其他人工作/呈现,它打算按原样工作吗?我是否应该采取一些解决方法来检测一段时间后 webview 是否未完成以跳过加载并让其他人加载,这样我就可以回到慢速的?
提前谢谢你。
最佳答案
Webview 运行在与您的应用程序不同的进程中,但它们运行在同一分区中彼此相同的进程中。如果您不指定分区属性,它们将位于相同的默认值中。如果您检查 Chrome 任务管理器 (shift+esc),您将看到:
(注意进程 ID 列)
如果您改为使用标签属性将每个 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 现在都在自己的进程中运行:
关于javascript - 谷歌浏览器应用 : Webview behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16635739/