This source file includes following definitions.
- GetFilePathForJSResource
- GetResource
- run_loop_
- Test
- run_loop_
- RenderViewCreated
- set_run_loop
- CreateWebUIControllerForURL
- GetWebUIType
- UseWebUIForURL
- UseWebUIBindingsForURL
- factory
- IN_PROC_BROWSER_TEST_F
#include "base/command_line.h"
#include "base/file_util.h"
#include "base/files/file_path.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/strings/string_util.h"
#include "content/browser/webui/web_ui_controller_factory_registry.h"
#include "content/common/mojo/mojo_channel_init.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui_controller.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/common/content_paths.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/url_utils.h"
#include "content/public/test/content_browser_test.h"
#include "content/public/test/content_browser_test_utils.h"
#include "content/test/data/web_ui_test_mojo_bindings.mojom.h"
#include "grit/content_resources.h"
#include "mojo/public/cpp/bindings/remote_ptr.h"
#include "mojo/public/js/bindings/constants.h"
namespace content {
namespace {
bool got_message = false;
base::FilePath GetFilePathForJSResource(const std::string& path) {
std::string binding_path = "gen/" + path + ".js";
#if defined(OS_WIN)
std::string tmp;
base::ReplaceChars(binding_path, "//", "\\", &tmp);
binding_path.swap(tmp);
#endif
base::FilePath file_path;
PathService::Get(CHILD_PROCESS_EXE, &file_path);
return file_path.DirName().AppendASCII(binding_path);
}
bool GetResource(const std::string& id,
const WebUIDataSource::GotDataCallback& callback) {
if (id == mojo::kCodecModuleName ||
id == mojo::kConnectionModuleName ||
id == mojo::kConnectorModuleName ||
id == mojo::kRouterModuleName)
return false;
std::string contents;
CHECK(base::ReadFileToString(GetFilePathForJSResource(id), &contents,
std::string::npos));
base::RefCountedString* ref_contents = new base::RefCountedString;
ref_contents->data() = contents;
callback.Run(ref_contents);
return true;
}
class BrowserTargetImpl : public mojo::BrowserTarget {
public:
BrowserTargetImpl(mojo::ScopedRendererTargetHandle handle,
base::RunLoop* run_loop)
: client_(handle.Pass(), this),
run_loop_(run_loop) {
client_->Test();
}
virtual ~BrowserTargetImpl() {}
virtual void Test() OVERRIDE {
got_message = true;
run_loop_->Quit();
}
private:
mojo::RemotePtr<mojo::RendererTarget> client_;
base::RunLoop* run_loop_;
DISALLOW_COPY_AND_ASSIGN(BrowserTargetImpl);
};
class TestWebUIController : public WebUIController {
public:
explicit TestWebUIController(WebUI* web_ui, base::RunLoop* run_loop)
: WebUIController(web_ui),
run_loop_(run_loop) {
content::WebUIDataSource* data_source =
WebUIDataSource::AddMojoDataSource(
web_ui->GetWebContents()->GetBrowserContext());
data_source->SetRequestFilter(base::Bind(&GetResource));
}
virtual void RenderViewCreated(RenderViewHost* render_view_host) OVERRIDE {
mojo::InterfacePipe<mojo::BrowserTarget, mojo::RendererTarget> pipe;
browser_target_.reset(
new BrowserTargetImpl(pipe.handle_to_peer.Pass(), run_loop_));
render_view_host->SetWebUIHandle(
mojo::ScopedMessagePipeHandle(pipe.handle_to_self.release()));
}
private:
base::RunLoop* run_loop_;
scoped_ptr<BrowserTargetImpl> browser_target_;
DISALLOW_COPY_AND_ASSIGN(TestWebUIController);
};
class TestWebUIControllerFactory : public WebUIControllerFactory {
public:
TestWebUIControllerFactory() : run_loop_(NULL) {}
void set_run_loop(base::RunLoop* run_loop) { run_loop_ = run_loop; }
virtual WebUIController* CreateWebUIControllerForURL(
WebUI* web_ui, const GURL& url) const OVERRIDE {
return new TestWebUIController(web_ui, run_loop_);
}
virtual WebUI::TypeID GetWebUIType(BrowserContext* browser_context,
const GURL& url) const OVERRIDE {
return reinterpret_cast<WebUI::TypeID>(1);
}
virtual bool UseWebUIForURL(BrowserContext* browser_context,
const GURL& url) const OVERRIDE {
return true;
}
virtual bool UseWebUIBindingsForURL(BrowserContext* browser_context,
const GURL& url) const OVERRIDE {
return true;
}
private:
base::RunLoop* run_loop_;
DISALLOW_COPY_AND_ASSIGN(TestWebUIControllerFactory);
};
class WebUIMojoTest : public ContentBrowserTest {
public:
WebUIMojoTest() {
WebUIControllerFactory::RegisterFactory(&factory_);
}
virtual ~WebUIMojoTest() {
WebUIControllerFactory::UnregisterFactoryForTesting(&factory_);
}
TestWebUIControllerFactory* factory() { return &factory_; }
private:
TestWebUIControllerFactory factory_;
DISALLOW_COPY_AND_ASSIGN(WebUIMojoTest);
};
IN_PROC_BROWSER_TEST_F(WebUIMojoTest, EndToEnd) {
const base::FilePath test_file_path(
GetFilePathForJSResource(
"content/test/data/web_ui_test_mojo_bindings.mojom"));
if (!base::PathExists(test_file_path)) {
LOG(WARNING) << " mojom binding file doesn't exist, assuming on isolate";
return;
}
got_message = false;
ASSERT_TRUE(test_server()->Start());
base::RunLoop run_loop;
factory()->set_run_loop(&run_loop);
GURL test_url(test_server()->GetURL("files/web_ui_mojo.html"));
NavigateToURL(shell(), test_url);
run_loop.Run();
EXPECT_TRUE(got_message);
}
}
}