Commit 03cc87ba authored by lfg's avatar lfg Committed by Commit bot

Add webview testAPIMethodExistence to app_shell_browsertests.

This CL adds an app_shell_browsertest to verify the existence of the webview API.

BUG=352290

Review URL: https://codereview.chromium.org/581283002

Cr-Commit-Position: refs/heads/master@{#296194}
parent 7acc4b3e
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/path_service.h"
#include "base/strings/stringprintf.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/app_window/app_window.h"
#include "extensions/browser/app_window/app_window_registry.h"
#include "extensions/browser/extension_host.h"
#include "extensions/browser/guest_view/guest_view_manager.h"
#include "extensions/browser/guest_view/guest_view_manager_factory.h"
#include "extensions/browser/process_manager.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_paths.h"
#include "extensions/shell/browser/shell_extension_system.h"
#include "extensions/shell/test/shell_test.h"
#include "extensions/test/extension_test_message_listener.h"
namespace {
// TODO(lfg) Merge TestGuestViewManager and its factory with the one in chrome
// web_view_browsertest.cc.
class TestGuestViewManager : public extensions::GuestViewManager {
public:
explicit TestGuestViewManager(content::BrowserContext* context)
: GuestViewManager(context),
seen_guest_removed_(false),
web_contents_(NULL) {}
content::WebContents* WaitForGuestCreated() {
if (web_contents_)
return web_contents_;
created_message_loop_runner_ = new content::MessageLoopRunner;
created_message_loop_runner_->Run();
return web_contents_;
}
void WaitForGuestDeleted() {
if (seen_guest_removed_)
return;
deleted_message_loop_runner_ = new content::MessageLoopRunner;
deleted_message_loop_runner_->Run();
}
private:
// GuestViewManager override:
virtual void AddGuest(int guest_instance_id,
content::WebContents* guest_web_contents) OVERRIDE {
extensions::GuestViewManager::AddGuest(guest_instance_id,
guest_web_contents);
web_contents_ = guest_web_contents;
seen_guest_removed_ = false;
if (created_message_loop_runner_.get())
created_message_loop_runner_->Quit();
}
virtual void RemoveGuest(int guest_instance_id) OVERRIDE {
extensions::GuestViewManager::RemoveGuest(guest_instance_id);
web_contents_ = NULL;
seen_guest_removed_ = true;
if (deleted_message_loop_runner_.get())
deleted_message_loop_runner_->Quit();
}
bool seen_guest_removed_;
content::WebContents* web_contents_;
scoped_refptr<content::MessageLoopRunner> created_message_loop_runner_;
scoped_refptr<content::MessageLoopRunner> deleted_message_loop_runner_;
};
// Test factory for creating test instances of GuestViewManager.
class TestGuestViewManagerFactory : public extensions::GuestViewManagerFactory {
public:
TestGuestViewManagerFactory() : test_guest_view_manager_(NULL) {}
virtual ~TestGuestViewManagerFactory() {}
virtual extensions::GuestViewManager* CreateGuestViewManager(
content::BrowserContext* context) OVERRIDE {
return GetManager(context);
}
// This function gets called from GuestViewManager::FromBrowserContext(),
// where test_guest_view_manager_ is assigned to a linked_ptr that takes care
// of deleting it.
TestGuestViewManager* GetManager(content::BrowserContext* context) {
DCHECK(!test_guest_view_manager_);
test_guest_view_manager_ = new TestGuestViewManager(context);
return test_guest_view_manager_;
}
private:
TestGuestViewManager* test_guest_view_manager_;
DISALLOW_COPY_AND_ASSIGN(TestGuestViewManagerFactory);
};
} // namespace
namespace extensions {
// This class intercepts download request from the guest.
class WebViewAPITest : public AppShellTest {
protected:
void RunTest(const std::string& test_name, const std::string& app_location) {
base::FilePath test_data_dir;
PathService::Get(extensions::DIR_TEST_DATA, &test_data_dir);
test_data_dir = test_data_dir.AppendASCII(app_location.c_str());
ASSERT_TRUE(extension_system_->LoadApp(test_data_dir));
extension_system_->LaunchApp();
ExtensionTestMessageListener launch_listener("LAUNCHED", false);
ASSERT_TRUE(launch_listener.WaitUntilSatisfied());
const AppWindowRegistry::AppWindowList& app_window_list =
AppWindowRegistry::Get(browser_context_)->app_windows();
DCHECK(app_window_list.size() == 1);
content::WebContents* embedder_web_contents =
(*app_window_list.begin())->web_contents();
ExtensionTestMessageListener done_listener("TEST_PASSED", false);
done_listener.set_failure_message("TEST_FAILED");
if (!content::ExecuteScript(
embedder_web_contents,
base::StringPrintf("runTest('%s')", test_name.c_str()))) {
LOG(ERROR) << "Unable to start test.";
return;
}
ASSERT_TRUE(done_listener.WaitUntilSatisfied());
}
WebViewAPITest() {
extensions::GuestViewManager::set_factory_for_testing(&factory_);
}
private:
TestGuestViewManagerFactory factory_;
};
IN_PROC_BROWSER_TEST_F(WebViewAPITest, TestAPIMethodExistence) {
RunTest("testAPIMethodExistence", "web_view/apitest");
}
} // namespace extensions
...@@ -183,6 +183,7 @@ ...@@ -183,6 +183,7 @@
'../browser/api/socket/socket_apitest.cc', '../browser/api/socket/socket_apitest.cc',
'../browser/api/sockets_tcp/sockets_tcp_apitest.cc', '../browser/api/sockets_tcp/sockets_tcp_apitest.cc',
'../browser/api/sockets_udp/sockets_udp_apitest.cc', '../browser/api/sockets_udp/sockets_udp_apitest.cc',
'../browser/guest_view/web_view/web_view_apitest.cc',
'browser/shell_browsertest.cc', 'browser/shell_browsertest.cc',
'test/shell_apitest.cc', 'test/shell_apitest.cc',
'test/shell_apitest.h', 'test/shell_apitest.h',
......
<!--
* Copyright 2014 The Chromium Authors. All rights reserved. Use of this
* source code is governed by a BSD-style license that can be found in the
* LICENSE file.
-->
<html>
<body>
<div id="object-container"></div>
<script src="main.js"></script>
</body>
</html>
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var embedder = {};
// TODO(lfg) Move these functions to a common js.
window.runTest = function(testName) {
if (!embedder.test.testList[testName]) {
window.console.warn('Incorrect testName: ' + testName);
embedder.test.fail();
return;
}
// Run the test.
embedder.test.testList[testName]();
};
embedder.test = {};
embedder.test.assertEq = function(a, b) {
if (a != b) {
window.console.warn('assertion failed: ' + a + ' != ' + b);
embedder.test.fail();
}
};
embedder.test.assertFalse = function(condition) {
if (condition) {
window.console.warn('assertion failed: false != ' + condition);
embedder.test.fail();
}
};
embedder.test.assertTrue = function(condition) {
if (!condition) {
window.console.warn('assertion failed: true != ' + condition);
embedder.test.fail();
}
};
embedder.test.fail = function() {
chrome.test.sendMessage('TEST_FAILED');
};
embedder.test.succeed = function() {
chrome.test.sendMessage('TEST_PASSED');
};
// Tests begin.
function testAPIMethodExistence() {
var apiMethodsToCheck = [
'back',
'find',
'forward',
'canGoBack',
'canGoForward',
'clearData',
'getProcessId',
'getZoom',
'go',
'print',
'reload',
'setZoom',
'stop',
'stopFinding',
'terminate',
'executeScript',
'insertCSS',
'getUserAgent',
'isUserAgentOverridden',
'setUserAgentOverride'
];
var webview = document.createElement('webview');
webview.setAttribute('partition', arguments.callee.name);
webview.addEventListener('loadstop', function(e) {
for (var i = 0; i < apiMethodsToCheck.length; ++i) {
embedder.test.assertEq('function',
typeof webview[apiMethodsToCheck[i]]);
}
// Check contentWindow.
embedder.test.assertEq('object', typeof webview.contentWindow);
embedder.test.assertEq('function',
typeof webview.contentWindow.postMessage);
embedder.test.succeed();
});
webview.setAttribute('src', 'data:text/html,webview check api');
document.body.appendChild(webview);
}
embedder.test.testList = {
'testAPIMethodExistence': testAPIMethodExistence
};
onload = function() {
chrome.test.sendMessage('LAUNCHED');
};
{
"name": "Platform App Test: <webview>",
"version": "2",
"manifest_version": 2,
"permissions": [
"webview"
],
"app": {
"background": {
"scripts": ["test.js"]
}
}
}
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
chrome.app.runtime.onLaunched.addListener(function() {
chrome.app.window.create('main.html', {}, function () {});
});
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment