1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/command_line.h"
6#include "base/files/file_util.h"
7#include "base/path_service.h"
8#include "base/strings/string_util.h"
9#include "base/strings/utf_string_conversions.h"
10#include "content/browser/loader/resource_dispatcher_host_impl.h"
11#include "content/public/browser/browser_thread.h"
12#include "content/public/browser/resource_dispatcher_host_delegate.h"
13#include "content/public/common/content_switches.h"
14#include "content/public/test/browser_test_utils.h"
15#include "content/public/test/content_browser_test.h"
16#include "content/public/test/content_browser_test_utils.h"
17#include "content/public/test/test_utils.h"
18#include "content/shell/browser/shell.h"
19#include "content/shell/common/shell_switches.h"
20#include "net/test/embedded_test_server/embedded_test_server.h"
21#include "net/test/url_request/url_request_mock_http_job.h"
22#include "net/url_request/url_request.h"
23#include "ui/gfx/rect.h"
24
25#if defined(OS_WIN)
26#include "base/win/registry.h"
27#endif
28
29// TODO(jschuh): Finish plugins on Win64. crbug.com/180861
30#if defined(OS_WIN) && defined(ARCH_CPU_X86_64)
31#define MAYBE(x) DISABLED_##x
32#else
33#define MAYBE(x) x
34#endif
35
36using base::ASCIIToUTF16;
37
38namespace content {
39namespace {
40
41void SetUrlRequestMock(const base::FilePath& path) {
42  net::URLRequestMockHTTPJob::AddUrlHandler(
43      path, content::BrowserThread::GetBlockingPool());
44}
45
46}
47
48class PluginTest : public ContentBrowserTest {
49 protected:
50  PluginTest() {}
51
52  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
53    // Some NPAPI tests schedule garbage collection to force object tear-down.
54    command_line->AppendSwitchASCII(switches::kJavaScriptFlags, "--expose_gc");
55
56#if defined(OS_WIN)
57    const testing::TestInfo* const test_info =
58        testing::UnitTest::GetInstance()->current_test_info();
59    if (strcmp(test_info->name(), "MediaPlayerNew") == 0) {
60      // The installer adds our process names to the registry key below.  Since
61      // the installer might not have run on this machine, add it manually.
62      base::win::RegKey regkey;
63      if (regkey.Open(HKEY_LOCAL_MACHINE,
64                      L"Software\\Microsoft\\MediaPlayer\\ShimInclusionList",
65                      KEY_WRITE) == ERROR_SUCCESS) {
66        regkey.CreateKey(L"BROWSER_TESTS.EXE", KEY_READ);
67      }
68    }
69#elif defined(OS_MACOSX)
70    base::FilePath plugin_dir;
71    PathService::Get(base::DIR_MODULE, &plugin_dir);
72    plugin_dir = plugin_dir.AppendASCII("plugins");
73    // The plugins directory isn't read by default on the Mac, so it needs to be
74    // explicitly registered.
75    command_line->AppendSwitchPath(switches::kExtraPluginDir, plugin_dir);
76#endif
77  }
78
79  virtual void SetUpOnMainThread() OVERRIDE {
80    base::FilePath path = GetTestFilePath("", "");
81    BrowserThread::PostTask(
82        BrowserThread::IO, FROM_HERE, base::Bind(&SetUrlRequestMock, path));
83  }
84
85  static void LoadAndWaitInWindow(Shell* window, const GURL& url) {
86    base::string16 expected_title(ASCIIToUTF16("OK"));
87    TitleWatcher title_watcher(window->web_contents(), expected_title);
88    title_watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
89    title_watcher.AlsoWaitForTitle(ASCIIToUTF16("plugin_not_found"));
90    NavigateToURL(window, url);
91    base::string16 title = title_watcher.WaitAndGetTitle();
92    if (title == ASCIIToUTF16("plugin_not_found")) {
93      const testing::TestInfo* const test_info =
94          testing::UnitTest::GetInstance()->current_test_info();
95      VLOG(0) << "PluginTest." << test_info->name()
96              << " not running because plugin not installed.";
97    } else {
98      EXPECT_EQ(expected_title, title);
99    }
100  }
101
102  void LoadAndWait(const GURL& url) {
103    LoadAndWaitInWindow(shell(), url);
104  }
105
106  GURL GetURL(const char* filename) {
107    return GetTestUrl("npapi", filename);
108  }
109
110  void NavigateAway() {
111    GURL url = GetTestUrl("", "simple_page.html");
112    LoadAndWait(url);
113  }
114
115  void TestPlugin(const char* filename) {
116    base::FilePath path = GetTestFilePath("plugin", filename);
117    if (!base::PathExists(path)) {
118      const testing::TestInfo* const test_info =
119          testing::UnitTest::GetInstance()->current_test_info();
120      VLOG(0) << "PluginTest." << test_info->name()
121              << " not running because test data wasn't found.";
122      return;
123    }
124
125    GURL url = GetTestUrl("plugin", filename);
126    LoadAndWait(url);
127  }
128};
129
130// Make sure that navigating away from a plugin referenced by JS doesn't
131// crash.
132IN_PROC_BROWSER_TEST_F(PluginTest, UnloadNoCrash) {
133  LoadAndWait(GetURL("layout_test_plugin.html"));
134  NavigateAway();
135}
136
137// Tests if a plugin executing a self deleting script using NPN_GetURL
138// works without crashing or hanging
139// Flaky: http://crbug.com/59327
140IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(SelfDeletePluginGetUrl)) {
141  LoadAndWait(GetURL("self_delete_plugin_geturl.html"));
142}
143
144// Tests if a plugin executing a self deleting script using Invoke
145// works without crashing or hanging
146// Flaky. See http://crbug.com/30702
147IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(SelfDeletePluginInvoke)) {
148  LoadAndWait(GetURL("self_delete_plugin_invoke.html"));
149}
150
151IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(NPObjectReleasedOnDestruction)) {
152  NavigateToURL(shell(), GetURL("npobject_released_on_destruction.html"));
153  NavigateAway();
154}
155
156// Test that a dialog is properly created when a plugin throws an
157// exception.  Should be run for in and out of process plugins, but
158// the more interesting case is out of process, where we must route
159// the exception to the correct renderer.
160IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(NPObjectSetException)) {
161  LoadAndWait(GetURL("npobject_set_exception.html"));
162}
163
164#if defined(OS_WIN)
165// Tests if a plugin executing a self deleting script in the context of
166// a synchronous mouseup works correctly.
167// This was never ported to Mac. The only thing remaining is to make
168// SimulateMouseClick get to Mac plugins, currently it doesn't work.
169IN_PROC_BROWSER_TEST_F(PluginTest,
170                       MAYBE(SelfDeletePluginInvokeInSynchronousMouseUp)) {
171  NavigateToURL(shell(), GetURL("execute_script_delete_in_mouse_up.html"));
172
173  base::string16 expected_title(ASCIIToUTF16("OK"));
174  TitleWatcher title_watcher(shell()->web_contents(), expected_title);
175  title_watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
176  SimulateMouseClick(shell()->web_contents(), 0,
177      blink::WebMouseEvent::ButtonLeft);
178  EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
179}
180#endif
181
182// Flaky, http://crbug.com/302274.
183#if defined(OS_MACOSX)
184#define MAYBE_GetURLRequest404Response DISABLED_GetURLRequest404Response
185#else
186#define MAYBE_GetURLRequest404Response MAYBE(GetURLRequest404Response)
187#endif
188
189IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE_GetURLRequest404Response) {
190  GURL url(net::URLRequestMockHTTPJob::GetMockUrl(
191      base::FilePath().AppendASCII("npapi").AppendASCII(
192          "plugin_url_request_404.html")));
193  LoadAndWait(url);
194}
195
196// Tests if a plugin executing a self deleting script using Invoke with
197// a modal dialog showing works without crashing or hanging
198// Disabled, flakily exceeds timeout, http://crbug.com/46257.
199IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(SelfDeletePluginInvokeAlert)) {
200  // Navigate asynchronously because if we waitd until it completes, there's a
201  // race condition where the alert can come up before we start watching for it.
202  shell()->LoadURL(GetURL("self_delete_plugin_invoke_alert.html"));
203
204  base::string16 expected_title(ASCIIToUTF16("OK"));
205  TitleWatcher title_watcher(shell()->web_contents(), expected_title);
206  title_watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
207
208  WaitForAppModalDialog(shell());
209
210  EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
211}
212
213// Test passing arguments to a plugin.
214// crbug.com/306318
215#if !defined(OS_LINUX)
216IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(Arguments)) {
217  LoadAndWait(GetURL("arguments.html"));
218}
219#endif
220
221// Test invoking many plugins within a single page.
222IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(ManyPlugins)) {
223  LoadAndWait(GetURL("many_plugins.html"));
224}
225
226#if !defined(OS_MACOSX)  // http://crbug.com/402164
227// Test various calls to GetURL from a plugin.
228IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(GetURL)) {
229  LoadAndWait(GetURL("geturl.html"));
230}
231#endif
232
233// Test various calls to GetURL for javascript URLs with
234// non NULL targets from a plugin.
235IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(GetJavaScriptURL)) {
236  LoadAndWait(GetURL("get_javascript_url.html"));
237}
238
239// Test that calling GetURL with a javascript URL and target=_self
240// works properly when the plugin is embedded in a subframe.
241IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(GetJavaScriptURL2)) {
242  LoadAndWait(GetURL("get_javascript_url2.html"));
243}
244
245// Test is flaky on linux/cros/win builders.  http://crbug.com/71904
246IN_PROC_BROWSER_TEST_F(PluginTest, GetURLRedirectNotification) {
247  LoadAndWait(GetURL("geturl_redirect_notify.html"));
248}
249
250// Tests that identity is preserved for NPObjects passed from a plugin
251// into JavaScript.
252IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(NPObjectIdentity)) {
253  LoadAndWait(GetURL("npobject_identity.html"));
254}
255
256// Tests that if an NPObject is proxies back to its original process, the
257// original pointer is returned and not a proxy.  If this fails the plugin
258// will crash.
259IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(NPObjectProxy)) {
260  LoadAndWait(GetURL("npobject_proxy.html"));
261}
262
263#if defined(OS_WIN) || defined(OS_MACOSX)
264// Tests if a plugin executing a self deleting script in the context of
265// a synchronous paint event works correctly
266// http://crbug.com/44960
267IN_PROC_BROWSER_TEST_F(PluginTest,
268                       MAYBE(SelfDeletePluginInvokeInSynchronousPaint)) {
269  LoadAndWait(GetURL("execute_script_delete_in_paint.html"));
270}
271#endif
272
273// Tests that if a plugin executes a self resizing script in the context of a
274// synchronous paint, the plugin doesn't use deallocated memory.
275// http://crbug.com/139462
276IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(ResizeDuringPaint)) {
277  LoadAndWait(GetURL("resize_during_paint.html"));
278}
279
280IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(SelfDeletePluginInNewStream)) {
281  LoadAndWait(GetURL("self_delete_plugin_stream.html"));
282}
283
284// On Mac this test asserts in plugin_host: http://crbug.com/95558
285// On all platforms it flakes in ~URLRequestContext: http://crbug.com/310336
286#if !defined(NDEBUG)
287IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_DeletePluginInDeallocate) {
288  LoadAndWait(GetURL("plugin_delete_in_deallocate.html"));
289}
290#endif
291
292#if defined(OS_WIN)
293
294IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(VerifyPluginWindowRect)) {
295  LoadAndWait(GetURL("verify_plugin_window_rect.html"));
296}
297
298// Tests that creating a new instance of a plugin while another one is handling
299// a paint message doesn't cause deadlock.
300// http://crbug.com/406184
301IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_CreateInstanceInPaint) {
302  LoadAndWait(GetURL("create_instance_in_paint.html"));
303}
304
305// Tests that putting up an alert in response to a paint doesn't deadlock.
306IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_AlertInWindowMessage) {
307  NavigateToURL(shell(), GetURL("alert_in_window_message.html"));
308
309  WaitForAppModalDialog(shell());
310  WaitForAppModalDialog(shell());
311}
312
313// http://crbug.com/406184
314IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_VerifyNPObjectLifetimeTest) {
315  LoadAndWait(GetURL("npobject_lifetime_test.html"));
316}
317
318// Tests that we don't crash or assert if NPP_New fails
319IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(NewFails)) {
320  LoadAndWait(GetURL("new_fails.html"));
321}
322
323IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(SelfDeletePluginInNPNEvaluate)) {
324  LoadAndWait(GetURL("execute_script_delete_in_npn_evaluate.html"));
325}
326
327IN_PROC_BROWSER_TEST_F(PluginTest,
328                       MAYBE(SelfDeleteCreatePluginInNPNEvaluate)) {
329  LoadAndWait(GetURL("npn_plugin_delete_create_in_evaluate.html"));
330}
331
332#endif  // OS_WIN
333
334// If this flakes, reopen http://crbug.com/17645
335// As of 6 July 2011, this test is flaky on Windows (perhaps due to timing out).
336#if !defined(OS_MACOSX) && !defined(OS_LINUX)
337// Disabled on Mac because the plugin side isn't implemented yet, see
338// "TODO(port)" in plugin_javascript_open_popup.cc.
339// Disabled on Linux because we don't support NPAPI any more.
340IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(OpenPopupWindowWithPlugin)) {
341  LoadAndWait(GetURL("get_javascript_open_popup_with_plugin.html"));
342}
343#endif
344
345// Test checking the privacy mode is off.
346IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(PrivateDisabled)) {
347  LoadAndWait(GetURL("private.html"));
348}
349
350IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(ScheduleTimer)) {
351  LoadAndWait(GetURL("schedule_timer.html"));
352}
353
354IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(PluginThreadAsyncCall)) {
355  LoadAndWait(GetURL("plugin_thread_async_call.html"));
356}
357
358IN_PROC_BROWSER_TEST_F(PluginTest, PluginSingleRangeRequest) {
359  LoadAndWait(GetURL("plugin_single_range_request.html"));
360}
361
362#if !defined(OS_WIN) // http://crbug.com/396373
363// Test checking the privacy mode is on.
364// If this flakes on Linux, use http://crbug.com/104380
365IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(PrivateEnabled)) {
366  GURL url = GetURL("private.html");
367  url = GURL(url.spec() + "?private");
368  LoadAndWaitInWindow(CreateOffTheRecordBrowser(), url);
369}
370#endif
371
372// These used to run on Windows: http://crbug.com/396373
373#if defined(OS_MACOSX)
374// Test a browser hang due to special case of multiple
375// plugin instances indulged in sync calls across renderer.
376IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(MultipleInstancesSyncCalls)) {
377  LoadAndWait(GetURL("multiple_instances_sync_calls.html"));
378}
379
380IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(GetURLRequestFailWrite)) {
381  GURL url(net::URLRequestMockHTTPJob::GetMockUrl(
382      base::FilePath().AppendASCII("npapi").AppendASCII(
383          "plugin_url_request_fail_write.html")));
384  LoadAndWait(url);
385}
386#endif
387
388#if defined(OS_WIN)
389// Flaky on Windows x86.  http://crbug.com/388245
390IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_EnsureScriptingWorksInDestroy) {
391  LoadAndWait(GetURL("ensure_scripting_works_in_destroy.html"));
392}
393
394// This test uses a Windows Event to signal to the plugin that it should crash
395// on NP_Initialize.
396IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(NoHangIfInitCrashes)) {
397  HANDLE crash_event = CreateEvent(NULL, TRUE, FALSE, L"TestPluginCrashOnInit");
398  SetEvent(crash_event);
399  LoadAndWait(GetURL("no_hang_if_init_crashes.html"));
400  CloseHandle(crash_event);
401}
402#endif
403
404// If this flakes on Mac, use http://crbug.com/111508
405IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(PluginReferrerTest)) {
406  GURL url(net::URLRequestMockHTTPJob::GetMockUrl(
407      base::FilePath().AppendASCII("npapi").AppendASCII(
408          "plugin_url_request_referrer_test.html")));
409  LoadAndWait(url);
410}
411
412#if defined(OS_MACOSX)
413// Test is flaky, see http://crbug.com/134515.
414IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_PluginConvertPointTest) {
415  gfx::Rect bounds(50, 50, 400, 400);
416  SetWindowBounds(shell()->window(), bounds);
417
418  NavigateToURL(shell(), GetURL("convert_point.html"));
419
420  base::string16 expected_title(ASCIIToUTF16("OK"));
421  TitleWatcher title_watcher(shell()->web_contents(), expected_title);
422  title_watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
423  // TODO(stuartmorgan): When the automation system supports sending clicks,
424  // change the test to trigger on mouse-down rather than window focus.
425
426  // TODO: is this code still needed? It was here when it used to run in
427  // browser_tests.
428  //static_cast<WebContentsDelegate*>(shell())->
429  //    ActivateContents(shell()->web_contents());
430  EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
431}
432#endif
433
434IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(Flash)) {
435  TestPlugin("flash.html");
436}
437
438#if defined(OS_WIN)
439// Windows only test
440IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_FlashSecurity) {
441  TestPlugin("flash.html");
442}
443#endif  // defined(OS_WIN)
444
445#if defined(OS_WIN)
446// TODO(port) Port the following tests to platforms that have the required
447// plugins.
448// Flaky: http://crbug.com/55915
449IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_Quicktime) {
450  TestPlugin("quicktime.html");
451}
452
453// Disabled - http://crbug.com/44662
454IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(MediaPlayerNew)) {
455  TestPlugin("wmp_new.html");
456}
457
458// Disabled - http://crbug.com/44673
459IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(Real)) {
460  TestPlugin("real.html");
461}
462
463// http://crbug.com/320041
464#if (defined(OS_WIN) && defined(ARCH_CPU_X86_64)) || \
465    (defined(GOOGLE_CHROME_BUILD) && defined(OS_WIN))
466#define MAYBE_FlashOctetStream DISABLED_FlashOctetStream
467#else
468#define MAYBE_FlashOctetStream FlashOctetStream
469#endif
470IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE_FlashOctetStream) {
471  TestPlugin("flash-octet-stream.html");
472}
473
474#if defined(OS_WIN)
475// http://crbug.com/53926
476IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_FlashLayoutWhilePainting) {
477#else
478IN_PROC_BROWSER_TEST_F(PluginTest, FlashLayoutWhilePainting) {
479#endif
480  TestPlugin("flash-layout-while-painting.html");
481}
482
483// http://crbug.com/8690
484IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_Java) {
485  TestPlugin("Java.html");
486}
487
488// Flaky: http://crbug.com/55915
489IN_PROC_BROWSER_TEST_F(PluginTest, DISABLED_Silverlight) {
490  TestPlugin("silverlight.html");
491}
492#endif  // defined(OS_WIN)
493
494class TestResourceDispatcherHostDelegate
495    : public ResourceDispatcherHostDelegate {
496 public:
497  TestResourceDispatcherHostDelegate() : found_cookie_(false) {}
498
499  bool found_cookie() { return found_cookie_; }
500
501  void WaitForPluginRequest() {
502    if (found_cookie_)
503      return;
504
505    runner_ = new MessageLoopRunner;
506    runner_->Run();
507  }
508
509 private:
510  // ResourceDispatcherHostDelegate implementation:
511  virtual void OnResponseStarted(
512      net::URLRequest* request,
513      ResourceContext* resource_context,
514      ResourceResponse* response,
515      IPC::Sender* sender) OVERRIDE {
516    // The URL below comes from plugin_geturl_test.cc.
517    if (!EndsWith(request->url().spec(),
518                 "npapi/plugin_ref_target_page.html",
519                 true)) {
520      return;
521    }
522    net::HttpRequestHeaders headers;
523    bool found_cookie = false;
524    if (request->GetFullRequestHeaders(&headers) &&
525        headers.ToString().find("Cookie: blah") != std::string::npos) {
526      found_cookie = true;
527    }
528    BrowserThread::PostTask(
529        BrowserThread::UI,
530        FROM_HERE,
531        base::Bind(&TestResourceDispatcherHostDelegate::GotCookie,
532                   base::Unretained(this), found_cookie));
533  }
534
535  void GotCookie(bool found_cookie) {
536    found_cookie_ = found_cookie;
537    if (runner_.get())
538      runner_->QuitClosure().Run();
539  }
540
541  scoped_refptr<MessageLoopRunner> runner_;
542  bool found_cookie_;
543
544  DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcherHostDelegate);
545};
546
547// Ensure that cookies get sent with plugin requests.
548IN_PROC_BROWSER_TEST_F(PluginTest, MAYBE(Cookies)) {
549  // Create a new browser just to ensure that the plugin process' child_id is
550  // not equal to its type (PROCESS_TYPE_PLUGIN), as that was the error which
551  // caused this bug.
552  NavigateToURL(CreateBrowser(), GURL("about:blank"));
553
554  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
555  GURL url(embedded_test_server()->GetURL("/npapi/cookies.html"));
556
557  TestResourceDispatcherHostDelegate test_delegate;
558  ResourceDispatcherHostDelegate* old_delegate =
559      ResourceDispatcherHostImpl::Get()->delegate();
560  ResourceDispatcherHostImpl::Get()->SetDelegate(&test_delegate);
561  LoadAndWait(url);
562  test_delegate.WaitForPluginRequest();
563  ASSERT_TRUE(test_delegate.found_cookie());
564  ResourceDispatcherHostImpl::Get()->SetDelegate(old_delegate);
565}
566
567}  // namespace content
568