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