// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#ifndef ANDROID_WEBVIEW_NATIVE_STATE_SERIALIZER_H_
#define ANDROID_WEBVIEW_NATIVE_STATE_SERIALIZER_H_

#include "base/compiler_specific.h"

class Pickle;
class PickleIterator;

namespace content {

class NavigationEntry;
class WebContents;

}  // namespace content

namespace android_webview {

// Write and restore a WebContents to and from a pickle. Return true on
// success.

// Note that |pickle| may be changed even if function returns false.
bool WriteToPickle(const content::WebContents& web_contents,
                   Pickle* pickle) WARN_UNUSED_RESULT;

// |web_contents| will not be modified if function returns false.
bool RestoreFromPickle(PickleIterator* iterator,
                       content::WebContents* web_contents) WARN_UNUSED_RESULT;


namespace internal {
// Functions below are individual helper functiosn called by functions above.
// They are broken up for unit testing, and should not be called out side of
// tests.
bool WriteHeaderToPickle(Pickle* pickle) WARN_UNUSED_RESULT;
bool RestoreHeaderFromPickle(PickleIterator* iterator) WARN_UNUSED_RESULT;
bool WriteNavigationEntryToPickle(const content::NavigationEntry& entry,
                                  Pickle* pickle) WARN_UNUSED_RESULT;
bool RestoreNavigationEntryFromPickle(
    PickleIterator* iterator,
    content::NavigationEntry* entry) WARN_UNUSED_RESULT;

}  // namespace interanl

}  // namespace android_webview

#endif  // ANDROID_WEBVIEW_NATIVE_STATE_SERIALIZER_H_
