1// Copyright (c) 2011 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#ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_LOCALIZATION_PEER_H_
6#define CHROME_COMMON_EXTENSIONS_EXTENSION_LOCALIZATION_PEER_H_
7#pragma once
8
9#include <string>
10
11#include "ipc/ipc_message.h"
12#include "webkit/glue/resource_loader_bridge.h"
13
14// The ExtensionLocalizationPeer is a proxy to a
15// webkit_glue::ResourceLoaderBridge::Peer instance.  It is used to pre-process
16// CSS files requested by extensions to replace localization templates with the
17// appropriate localized strings.
18//
19// Call the factory method CreateExtensionLocalizationPeer() to obtain an
20// instance of ExtensionLocalizationPeer based on the original Peer.
21class ExtensionLocalizationPeer
22    : public webkit_glue::ResourceLoaderBridge::Peer {
23 public:
24  virtual ~ExtensionLocalizationPeer();
25
26  static ExtensionLocalizationPeer* CreateExtensionLocalizationPeer(
27      webkit_glue::ResourceLoaderBridge::Peer* peer,
28      IPC::Message::Sender* message_sender,
29      const std::string& mime_type,
30      const GURL& request_url);
31
32  // ResourceLoaderBridge::Peer methods.
33  virtual void OnUploadProgress(uint64 position, uint64 size);
34  virtual bool OnReceivedRedirect(
35      const GURL& new_url,
36      const webkit_glue::ResourceResponseInfo& info,
37      bool* has_new_first_party_for_cookies,
38      GURL* new_first_party_for_cookies);
39  virtual void OnReceivedResponse(
40      const webkit_glue::ResourceResponseInfo& info);
41  virtual void OnDownloadedData(int len) {}
42  virtual void OnReceivedData(const char* data,
43                              int data_length,
44                              int encoded_data_length);
45  virtual void OnCompletedRequest(const net::URLRequestStatus& status,
46                                  const std::string& security_info,
47                                  const base::Time& completion_time);
48
49 private:
50  friend class ExtensionLocalizationPeerTest;
51
52  // Use CreateExtensionLocalizationPeer to create an instance.
53  ExtensionLocalizationPeer(
54      webkit_glue::ResourceLoaderBridge::Peer* peer,
55      IPC::Message::Sender* message_sender,
56      const GURL& request_url);
57
58  // Loads message catalogs, and replaces all __MSG_some_name__ templates within
59  // loaded file.
60  void ReplaceMessages();
61
62  // Original peer that handles the request once we are done processing data_.
63  webkit_glue::ResourceLoaderBridge::Peer* original_peer_;
64
65  // We just pass though the response info. This holds the copy of the original.
66  webkit_glue::ResourceResponseInfo response_info_;
67
68  // Sends ExtensionHostMsg_GetMessageBundle message to the browser to fetch
69  // message catalog.
70  IPC::Message::Sender* message_sender_;
71
72  // Buffer for incoming data. We wait until OnCompletedRequest before using it.
73  std::string data_;
74
75  // Original request URL.
76  GURL request_url_;
77
78 private:
79  DISALLOW_COPY_AND_ASSIGN(ExtensionLocalizationPeer);
80};
81
82#endif  // CHROME_COMMON_EXTENSIONS_EXTENSION_LOCALIZATION_PEER_H_
83