15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_FRAME_TEST_NET_TEST_AUTOMATION_RESOURCE_MESSAGE_FILTER_H_
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_FRAME_TEST_NET_TEST_AUTOMATION_RESOURCE_MESSAGE_FILTER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/automation_provider.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/automation_resource_message_filter.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/url_request_automation_job.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Performs the same duties as AutomationResourceMessageFilter but with one
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// difference.  Instead of being tied to an IPC channel running on Chrome's
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IO thread, this instance runs on the unit test's IO thread (all URL request
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tests have their own IO loop) and is tied to an instance of
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AutomationProvider (TestAutomationProvider to be exact).
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Messages from the AutomationProvider that are destined to request objects
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// owned by this class are marshaled over to the request's IO thread instead
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of using the thread the messages are received on.  This way we allow the
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL request tests to run sequentially as they were written while still
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// allowing the automation layer to work as it normally does (i.e. process
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its messages on the receiving thread).
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestAutomationResourceMessageFilter
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public AutomationResourceMessageFilter {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestAutomationResourceMessageFilter(AutomationProvider* automation);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* message);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void OnRequestMessage(URLRequestAutomationJob* job,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               IPC::Message* msg);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add request to the list of outstanding requests.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RegisterRequest(URLRequestAutomationJob* job);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove request from the list of outstanding requests.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UnRegisterRequest(URLRequestAutomationJob* job);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutomationProvider* automation_;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // declare the request map.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct RequestJob {
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessageLoop* loop_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<URLRequestAutomationJob> job_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<int, RequestJob> RequestMap;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RequestMap requests_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Protects access to requests_.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Lock requests_lock_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_FRAME_TEST_NET_TEST_AUTOMATION_RESOURCE_MESSAGE_FILTER_H_
58