190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifndef CHROME_BROWSER_SAFE_JSON_PARSER_H_
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define CHROME_BROWSER_SAFE_JSON_PARSER_H_
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <string>
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/basictypes.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/callback.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/utility_process_host_client.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace base {
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ListValue;
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Value;
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace IPC {
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Message;
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// SafeJsonParser parses a given JSON safely via a utility process. The object
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// is ref-counted and kept alive after Start() is called until one of the two
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// callbacks is called.
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class SafeJsonParser : public content::UtilityProcessHostClient {
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef base::Callback<void(scoped_ptr<base::Value>)> SuccessCallback;
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef base::Callback<void(const std::string&)> ErrorCallback;
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SafeJsonParser(const std::string& unsafe_json,
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 const SuccessCallback& success_callback,
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 const ErrorCallback& error_callback);
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void Start();
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~SafeJsonParser();
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void StartWorkOnIOThread();
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void OnJSONParseSucceeded(const base::ListValue& wrapper);
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void OnJSONParseFailed(const std::string& error_message);
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ReportResults();
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ReportResultOnUIThread();
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Implementing pieces of the UtilityProcessHostClient interface.
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const std::string unsafe_json_;
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SuccessCallback success_callback_;
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ErrorCallback error_callback_;
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<base::Value> parsed_json_;
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string error_;
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SafeJsonParser);
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // CHROME_BROWSER_SAFE_JSON_PARSER_H_
63