146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/command_line.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/strings/string_util.h"
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/browser_process.h"
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/policy/cloud/policy_header_service_factory.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_constants.h"
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/policy/core/common/cloud/policy_header_io_helper.h"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/policy/core/common/cloud/policy_header_service.h"
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/policy/core/common/policy_switches.h"
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/browser/resource_dispatcher_host.h"
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/http/http_request_headers.h"
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h"
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/test/embedded_test_server/http_request.h"
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/test/embedded_test_server/http_response.h"
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/url_request/url_request.h"
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing content::ResourceType;
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace {
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)static const char kTestPolicyHeader[] = "test_header";
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)static const char kServerRedirectUrl[] = "/server-redirect";
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)scoped_ptr<net::test_server::HttpResponse> HandleTestRequest(
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const net::test_server::HttpRequest& request) {
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (StartsWithASCII(request.relative_url, kServerRedirectUrl, true)) {
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Extract the target URL and redirect there.
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    size_t query_string_pos = request.relative_url.find('?');
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    std::string redirect_target =
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        request.relative_url.substr(query_string_pos + 1);
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_ptr<net::test_server::BasicHttpResponse> http_response(
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        new net::test_server::BasicHttpResponse);
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    http_response->set_code(net::HTTP_MOVED_PERMANENTLY);
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    http_response->AddCustomHeader("Location", redirect_target);
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return http_response.PassAs<net::test_server::HttpResponse>();
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else {
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_ptr<net::test_server::BasicHttpResponse> http_response(
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        new net::test_server::BasicHttpResponse);
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    http_response->set_code(net::HTTP_OK);
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    http_response->set_content("Success");
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return http_response.PassAs<net::test_server::HttpResponse>();
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class TestDispatcherHostDelegate : public ChromeResourceDispatcherHostDelegate {
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  explicit TestDispatcherHostDelegate(
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      prerender::PrerenderTracker* prerender_tracker)
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      : ChromeResourceDispatcherHostDelegate(prerender_tracker) {
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~TestDispatcherHostDelegate() {}
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void RequestBeginning(
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      net::URLRequest* request,
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      content::ResourceContext* resource_context,
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::AppCacheService* appcache_service,
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ResourceType resource_type,
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ScopedVector<content::ResourceThrottle>* throttles) OVERRIDE {
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ChromeResourceDispatcherHostDelegate::RequestBeginning(
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        request,
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        resource_context,
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        appcache_service,
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        resource_type,
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        throttles);
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    request_headers_.MergeFrom(request->extra_request_headers());
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void OnRequestRedirected(
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const GURL& redirect_url,
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      net::URLRequest* request,
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      content::ResourceContext* resource_context,
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      content::ResourceResponse* response) OVERRIDE {
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ChromeResourceDispatcherHostDelegate::OnRequestRedirected(
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        redirect_url,
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        request,
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        resource_context,
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        response);
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    request_headers_.MergeFrom(request->extra_request_headers());
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  net::HttpRequestHeaders request_headers_;
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestDispatcherHostDelegate);
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class ChromeResourceDispatcherHostDelegateBrowserTest :
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    public InProcessBrowserTest {
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ChromeResourceDispatcherHostDelegateBrowserTest() {}
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    InProcessBrowserTest::SetUpOnMainThread();
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Hook navigations with our delegate.
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    dispatcher_host_delegate_.reset(new TestDispatcherHostDelegate(
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        g_browser_process->prerender_tracker()));
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    content::ResourceDispatcherHost::Get()->SetDelegate(
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        dispatcher_host_delegate_.get());
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    embedded_test_server()->RegisterRequestHandler(
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        base::Bind(&HandleTestRequest));
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Tell chrome that this is our DM server.
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    dm_url_ = embedded_test_server()->GetURL("/DeviceManagement");
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // At this point, the Profile is already initialized and it's too
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // late to set the DMServer URL via command line flags, so directly
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // inject it to the PolicyHeaderIOHelper.
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    policy::PolicyHeaderService* policy_header_service =
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        policy::PolicyHeaderServiceFactory::GetForBrowserContext(
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            browser()->profile());
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    std::vector<policy::PolicyHeaderIOHelper*> helpers =
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        policy_header_service->GetHelpersForTest();
12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for (std::vector<policy::PolicyHeaderIOHelper*>::const_iterator it =
12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)             helpers.begin();
12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         it != helpers.end(); ++it) {
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (*it)->SetServerURLForTest(dm_url_.spec());
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (*it)->UpdateHeader(kTestPolicyHeader);
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void TearDownOnMainThread() OVERRIDE {
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    content::ResourceDispatcherHost::Get()->SetDelegate(NULL);
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    dispatcher_host_delegate_.reset();
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected:
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // The fake URL for DMServer we are using.
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GURL dm_url_;
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<TestDispatcherHostDelegate> dispatcher_host_delegate_;
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ChromeResourceDispatcherHostDelegateBrowserTest);
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ChromeResourceDispatcherHostDelegateBrowserTest,
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       NoPolicyHeader) {
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // When fetching non-DMServer URLs, we should not add a policy header to the
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // request.
15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(!embedded_test_server()->base_url().spec().empty());
15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), embedded_test_server()->base_url());
15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_FALSE(dispatcher_host_delegate_->request_headers_.HasHeader(
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      policy::kChromePolicyHeader));
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ChromeResourceDispatcherHostDelegateBrowserTest,
15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       PolicyHeader) {
16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // When fetching a DMServer URL, we should add a policy header to the
16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // request.
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), dm_url_);
16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string value;
16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(dispatcher_host_delegate_->request_headers_.GetHeader(
16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      policy::kChromePolicyHeader, &value));
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(kTestPolicyHeader, value);
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ChromeResourceDispatcherHostDelegateBrowserTest,
17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       PolicyHeaderForRedirect) {
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Build up a URL that results in a redirect to the DMServer URL to make
17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // sure the policy header is still added.
17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string redirect_url;
17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  redirect_url += kServerRedirectUrl;
17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  redirect_url += "?";
17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  redirect_url += dm_url_.spec();
17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL(
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      redirect_url));
18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string value;
18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(dispatcher_host_delegate_->request_headers_.GetHeader(
18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      policy::kChromePolicyHeader, &value));
18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(kTestPolicyHeader, value);
18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
185