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