在Chrome扩展程序中<iframe>
上研究问题时,Chrome应用中的<webview>
引起了我的注意,让我感兴趣。
所以我决定做一个我在<iframe>
面临的问题的小例子,看看<webview>
是否解决了问题。根据我对观看Chrome开发视频的理解,webview
在与您的应用无关的单独进程中运行;它与您的应用没有相同的权限。所以我假设如果运行中的内容以某种方式与“主线程”(app)分开,我猜他们的内容将彼此分开执行,不会阻止应用程序或其他任何一个可能有一个可能长时间运行js executon。因此我做了以下事情:
chrome.app.runtime.onLaunched.addListener(function() {
// Tell your app what to launch and how.
chrome.app.window.create('window.html', {
width: 1800,
height: 1000
});
});
{
// 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" ]
}
<!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应用程序,使用我注意到一些有趣和奇怪的行为。我注意到以下几点:
<webview id="wv5" style="width: 450px; height: 300px; border: 2px solid red" src="http://developer.chrome.com"></webview>
,对我来说会发生什么:前三个加载,第四个正在执行,完成后显示然后我看到第五个渲染。我的主要问题/怀疑是关于行为,因为它们实际上是在一个单独的进程中运行,为什么它没有与浏览器窗口相同的行为,为什么那个webview会阻止其他工作/渲染,是打算按原样工作吗?我应该做一些解决方法来检测一段时间后webview是否没有完成跳过负载并让其他人加载,那么我可以回到慢速的那些?
提前谢谢。
答案 0 :(得分:9)
Webview在与您的应用程序不同的进程中运行,但它们在同一分区中以相同的进程运行。如果未指定分区属性,则它们将处于相同的默认属性中。如果您查看Chrome任务管理器(shift + esc),您会看到:
(注意进程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现在都在自己的进程中运行: