Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(646)

Unified Diff: webkit/glue/glue_serialize_deprecated.cc

Issue 16867005: Re-implement PageState serialization without a Blink API dependency. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Improvements based on Tom's feedback. Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/glue/glue_serialize_deprecated.h ('k') | webkit/glue/glue_serialize_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/glue/glue_serialize_deprecated.cc
diff --git a/webkit/glue/glue_serialize_deprecated.cc b/webkit/glue/glue_serialize_deprecated.cc
deleted file mode 100644
index 62d4c8984f289a7ac0670d77d8ccd614b560d87a..0000000000000000000000000000000000000000
--- a/webkit/glue/glue_serialize_deprecated.cc
+++ /dev/null
@@ -1,670 +0,0 @@
-// 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.
-
-#include "webkit/glue/glue_serialize_deprecated.h"
-
-#include <string>
-
-#include "base/pickle.h"
-#include "base/strings/utf_string_conversions.h"
-#include "googleurl/src/gurl.h"
-#include "third_party/WebKit/public/platform/WebData.h"
-#include "third_party/WebKit/public/platform/WebHTTPBody.h"
-#include "third_party/WebKit/public/platform/WebPoint.h"
-#include "third_party/WebKit/public/platform/WebString.h"
-#include "third_party/WebKit/public/platform/WebURL.h"
-#include "third_party/WebKit/public/platform/WebVector.h"
-#include "third_party/WebKit/public/web/WebHistoryItem.h"
-#include "third_party/WebKit/public/web/WebSerializedScriptValue.h"
-#include "ui/gfx/screen.h"
-#include "webkit/base/file_path_string_conversions.h"
-
-using WebKit::WebData;
-using WebKit::WebHistoryItem;
-using WebKit::WebHTTPBody;
-using WebKit::WebPoint;
-using WebKit::WebSerializedScriptValue;
-using WebKit::WebString;
-using WebKit::WebUChar;
-using WebKit::WebVector;
-
-namespace webkit_glue {
-
-namespace {
-
-enum IncludeFormData {
- NEVER_INCLUDE_FORM_DATA,
- INCLUDE_FORM_DATA_WITHOUT_PASSWORDS,
- ALWAYS_INCLUDE_FORM_DATA
-};
-
-struct SerializeObject {
- SerializeObject() : version(0) {}
- SerializeObject(const char* data, int len)
- : pickle(data, len), version(0) { iter = PickleIterator(pickle); }
-
- std::string GetAsString() {
- return std::string(static_cast<const char*>(pickle.data()), pickle.size());
- }
-
- Pickle pickle;
- mutable PickleIterator iter;
- mutable int version;
-};
-
-// TODO(mpcomplete): obsolete versions 1 and 2 after 1/1/2008.
-// Version ID used in reading/writing history items.
-// 1: Initial revision.
-// 2: Added case for NULL string versus "". Version 2 code can read Version 1
-// data, but not vice versa.
-// 3: Version 2 was broken, it stored number of WebUChars, not number of bytes.
-// This version checks and reads v1 and v2 correctly.
-// 4: Adds support for storing FormData::identifier().
-// 5: Adds support for empty FormData
-// 6: Adds support for documentSequenceNumbers
-// 7: Adds support for stateObject
-// 8: Adds support for file range and modification time
-// 9: Adds support for itemSequenceNumbers
-// 10: Adds support for blob
-// 11: Adds support for pageScaleFactor
-// 12: Adds support for hasPasswordData in HTTP body
-// 13: Adds support for URL (FileSystem URL)
-// 14: Adds list of referenced files, version written only for first item.
-// Should be const, but unit tests may modify it.
-//
-// NOTE: If the version is -1, then the pickle contains only a URL string.
-// See CreateHistoryStateForURL.
-//
-int kVersion = 14;
-
-// A bunch of convenience functions to read/write to SerializeObjects.
-// The serializers assume the input data is in the correct format and so does
-// no error checking.
-void WriteData(const void* data, int length, SerializeObject* obj) {
- obj->pickle.WriteData(static_cast<const char*>(data), length);
-}
-
-void ReadData(const SerializeObject* obj, const void** data, int* length) {
- const char* tmp;
- if (obj->pickle.ReadData(&obj->iter, &tmp, length)) {
- *data = tmp;
- } else {
- *data = NULL;
- *length = 0;
- }
-}
-
-bool ReadBytes(const SerializeObject* obj, const void** data, int length) {
- const char *tmp;
- if (!obj->pickle.ReadBytes(&obj->iter, &tmp, length))
- return false;
- *data = tmp;
- return true;
-}
-
-void WriteInteger(int data, SerializeObject* obj) {
- obj->pickle.WriteInt(data);
-}
-
-int ReadInteger(const SerializeObject* obj) {
- int tmp;
- if (obj->pickle.ReadInt(&obj->iter, &tmp))
- return tmp;
- return 0;
-}
-
-void ConsumeInteger(const SerializeObject* obj) {
- int unused ALLOW_UNUSED = ReadInteger(obj);
-}
-
-void WriteInteger64(int64 data, SerializeObject* obj) {
- obj->pickle.WriteInt64(data);
-}
-
-int64 ReadInteger64(const SerializeObject* obj) {
- int64 tmp = 0;
- obj->pickle.ReadInt64(&obj->iter, &tmp);
- return tmp;
-}
-
-void WriteReal(double data, SerializeObject* obj) {
- WriteData(&data, sizeof(double), obj);
-}
-
-double ReadReal(const SerializeObject* obj) {
- const void* tmp = NULL;
- int length = 0;
- double value = 0.0;
- ReadData(obj, &tmp, &length);
- if (tmp && length >= static_cast<int>(sizeof(double))) {
- // Use memcpy, as tmp may not be correctly aligned.
- memcpy(&value, tmp, sizeof(double));
- }
- return value;
-}
-
-void WriteBoolean(bool data, SerializeObject* obj) {
- obj->pickle.WriteInt(data ? 1 : 0);
-}
-
-bool ReadBoolean(const SerializeObject* obj) {
- bool tmp;
- if (obj->pickle.ReadBool(&obj->iter, &tmp))
- return tmp;
- return false;
-}
-
-void WriteGURL(const GURL& url, SerializeObject* obj) {
- obj->pickle.WriteString(url.possibly_invalid_spec());
-}
-
-GURL ReadGURL(const SerializeObject* obj) {
- std::string spec;
- if (obj->pickle.ReadString(&obj->iter, &spec))
- return GURL(spec);
- return GURL();
-}
-
-// Read/WriteString pickle the WebString as <int length><WebUChar* data>.
-// If length == -1, then the WebString itself is NULL (WebString()).
-// Otherwise the length is the number of WebUChars (not bytes) in the WebString.
-void WriteString(const WebString& str, SerializeObject* obj) {
- base::string16 string = str;
- const char16* data = string.data();
- size_t length_in_uchars = string.length();
- size_t length_in_bytes = length_in_uchars * sizeof(char16);
- switch (kVersion) {
- case 1:
- // Version 1 writes <length in bytes><string data>.
- // It saves WebString() and "" as "".
- obj->pickle.WriteInt(length_in_bytes);
- obj->pickle.WriteBytes(data, length_in_bytes);
- break;
- case 2:
- // Version 2 writes <length in WebUChar><string data>.
- // It uses -1 in the length field to mean WebString().
- if (str.isNull()) {
- obj->pickle.WriteInt(-1);
- } else {
- obj->pickle.WriteInt(length_in_uchars);
- obj->pickle.WriteBytes(data, length_in_bytes);
- }
- break;
- default:
- // Version 3+ writes <length in bytes><string data>.
- // It uses -1 in the length field to mean WebString().
- if (str.isNull()) {
- obj->pickle.WriteInt(-1);
- } else {
- obj->pickle.WriteInt(length_in_bytes);
- obj->pickle.WriteBytes(data, length_in_bytes);
- }
- break;
- }
-}
-
-// This reads a serialized WebString from obj. If a string can't be read,
-// WebString() is returned.
-const WebUChar* ReadStringNoCopy(const SerializeObject* obj, int* num_chars) {
- int length;
-
- // Versions 1, 2, and 3 all start with an integer.
- if (!obj->pickle.ReadInt(&obj->iter, &length))
- return NULL;
-
- // Starting with version 2, -1 means WebString().
- if (length == -1)
- return NULL;
-
- // In version 2, the length field was the length in WebUChars.
- // In version 1 and 3 it is the length in bytes.
- int bytes = length;
- if (obj->version == 2)
- bytes *= sizeof(WebUChar);
-
- const void* data;
- if (!ReadBytes(obj, &data, bytes))
- return NULL;
-
- if (num_chars)
- *num_chars = bytes / sizeof(WebUChar);
- return static_cast<const WebUChar*>(data);
-}
-
-WebString ReadString(const SerializeObject* obj) {
- int num_chars;
- const WebUChar* chars = ReadStringNoCopy(obj, &num_chars);
- return chars ? WebString(chars, num_chars) : WebString();
-}
-
-void ConsumeString(const SerializeObject* obj) {
- const WebUChar* unused ALLOW_UNUSED = ReadStringNoCopy(obj, NULL);
-}
-
-// Writes a Vector of Strings into a SerializeObject for serialization.
-void WriteStringVector(
- const WebVector<WebString>& data, SerializeObject* obj) {
- WriteInteger(static_cast<int>(data.size()), obj);
- for (size_t i = 0, c = data.size(); i < c; ++i) {
- unsigned ui = static_cast<unsigned>(i); // sigh
- WriteString(data[ui], obj);
- }
-}
-
-WebVector<WebString> ReadStringVector(const SerializeObject* obj) {
- int num_elements = ReadInteger(obj);
- WebVector<WebString> result(static_cast<size_t>(num_elements));
- for (int i = 0; i < num_elements; ++i)
- result[i] = ReadString(obj);
- return result;
-}
-
-void ConsumeStringVector(const SerializeObject* obj) {
- int num_elements = ReadInteger(obj);
- for (int i = 0; i < num_elements; ++i)
- ConsumeString(obj);
-}
-
-// Writes a FormData object into a SerializeObject for serialization.
-void WriteFormData(const WebHTTPBody& http_body, SerializeObject* obj) {
- WriteBoolean(!http_body.isNull(), obj);
-
- if (http_body.isNull())
- return;
-
- WriteInteger(static_cast<int>(http_body.elementCount()), obj);
- WebHTTPBody::Element element;
- for (size_t i = 0; http_body.elementAt(i, element); ++i) {
- WriteInteger(element.type, obj);
- if (element.type == WebHTTPBody::Element::TypeData) {
- WriteData(element.data.data(), static_cast<int>(element.data.size()),
- obj);
- } else if (element.type == WebHTTPBody::Element::TypeFile) {
- WriteString(element.filePath, obj);
- WriteInteger64(element.fileStart, obj);
- WriteInteger64(element.fileLength, obj);
- WriteReal(element.modificationTime, obj);
- } else if (element.type == WebHTTPBody::Element::TypeURL) {
- WriteGURL(element.url, obj);
- WriteInteger64(element.fileStart, obj);
- WriteInteger64(element.fileLength, obj);
- WriteReal(element.modificationTime, obj);
- } else {
- WriteGURL(element.url, obj);
- }
- }
- WriteInteger64(http_body.identifier(), obj);
- WriteBoolean(http_body.containsPasswordData(), obj);
-}
-
-WebHTTPBody ReadFormData(const SerializeObject* obj) {
- // In newer versions, an initial boolean indicates if we have form data.
- if (obj->version >= 5 && !ReadBoolean(obj))
- return WebHTTPBody();
-
- // In older versions, 0 elements implied no form data.
- int num_elements = ReadInteger(obj);
- if (num_elements == 0 && obj->version < 5)
- return WebHTTPBody();
-
- WebHTTPBody http_body;
- http_body.initialize();
-
- for (int i = 0; i < num_elements; ++i) {
- int type = ReadInteger(obj);
- if (type == WebHTTPBody::Element::TypeData) {
- const void* data;
- int length = -1;
- ReadData(obj, &data, &length);
- if (length >= 0)
- http_body.appendData(WebData(static_cast<const char*>(data), length));
- } else if (type == WebHTTPBody::Element::TypeFile) {
- WebString file_path = ReadString(obj);
- long long file_start = 0;
- long long file_length = -1;
- double modification_time = 0.0;
- if (obj->version >= 8) {
- file_start = ReadInteger64(obj);
- file_length = ReadInteger64(obj);
- modification_time = ReadReal(obj);
- }
- http_body.appendFileRange(file_path, file_start, file_length,
- modification_time);
- } else if (type == WebHTTPBody::Element::TypeURL) {
- GURL url = ReadGURL(obj);
- long long file_start = 0;
- long long file_length = -1;
- double modification_time = 0.0;
- file_start = ReadInteger64(obj);
- file_length = ReadInteger64(obj);
- modification_time = ReadReal(obj);
- http_body.appendURLRange(url, file_start, file_length,
- modification_time);
- } else if (obj->version >= 10) {
- GURL blob_url = ReadGURL(obj);
- http_body.appendBlob(blob_url);
- }
- }
- if (obj->version >= 4)
- http_body.setIdentifier(ReadInteger64(obj));
-
- if (obj->version >= 12)
- http_body.setContainsPasswordData(ReadBoolean(obj));
-
- return http_body;
-}
-
-// Writes the HistoryItem data into the SerializeObject object for
-// serialization.
-void WriteHistoryItem(
- const WebHistoryItem& item, SerializeObject* obj, bool is_top) {
- // WARNING: This data may be persisted for later use. As such, care must be
- // taken when changing the serialized format. If a new field needs to be
- // written, only adding at the end will make it easier to deal with loading
- // older versions. Similarly, this should NOT save fields with sensitive
- // data, such as password fields.
-
- if (kVersion >= 14) {
- if (is_top) {
- WriteInteger(kVersion, obj);
-
- // Insert the list of referenced files, so they can be extracted easily
- // from the serialized data (avoiding the need to call into Blink again).
- WriteStringVector(item.getReferencedFilePaths(), obj);
- }
- } else {
- WriteInteger(kVersion, obj);
- }
-
- WriteString(item.urlString(), obj);
- WriteString(item.originalURLString(), obj);
- WriteString(item.target(), obj);
- WriteString(item.parent(), obj);
- WriteString(item.title(), obj);
- WriteString(item.alternateTitle(), obj);
- WriteReal(item.lastVisitedTime(), obj);
- WriteInteger(item.scrollOffset().x, obj);
- WriteInteger(item.scrollOffset().y, obj);
- WriteBoolean(item.isTargetItem(), obj);
- WriteInteger(item.visitCount(), obj);
- WriteString(item.referrer(), obj);
-
- WriteStringVector(item.documentState(), obj);
-
- if (kVersion >= 11)
- WriteReal(item.pageScaleFactor(), obj);
- if (kVersion >= 9)
- WriteInteger64(item.itemSequenceNumber(), obj);
- if (kVersion >= 6)
- WriteInteger64(item.documentSequenceNumber(), obj);
- if (kVersion >= 7) {
- bool has_state_object = !item.stateObject().isNull();
- WriteBoolean(has_state_object, obj);
- if (has_state_object)
- WriteString(item.stateObject().toString(), obj);
- }
-
- WriteFormData(item.httpBody(), obj);
- WriteString(item.httpContentType(), obj);
- if (kVersion < 14)
- WriteString(item.referrer(), obj);
-
- // Subitems
- const WebVector<WebHistoryItem>& children = item.children();
- WriteInteger(static_cast<int>(children.size()), obj);
- for (size_t i = 0, c = children.size(); i < c; ++i)
- WriteHistoryItem(children[i], obj, false);
-}
-
-// Creates a new HistoryItem tree based on the serialized string.
-// Assumes the data is in the format returned by WriteHistoryItem.
-WebHistoryItem ReadHistoryItem(
- const SerializeObject* obj,
- IncludeFormData include_form_data,
- bool include_scroll_offset,
- bool is_top) {
- if (is_top) {
- obj->version = ReadInteger(obj);
-
- if (obj->version == -1) {
- GURL url = ReadGURL(obj);
- WebHistoryItem item;
- item.initialize();
- item.setURLString(WebString::fromUTF8(url.possibly_invalid_spec()));
- return item;
- }
-
- if (obj->version > kVersion || obj->version < 1)
- return WebHistoryItem();
-
- if (obj->version >= 14)
- ConsumeStringVector(obj); // Skip over list of referenced files.
- } else if (obj->version < 14) {
- ConsumeInteger(obj); // Skip over redundant version field.
- }
-
- WebHistoryItem item;
- item.initialize();
-
- item.setURLString(ReadString(obj));
- item.setOriginalURLString(ReadString(obj));
- item.setTarget(ReadString(obj));
- item.setParent(ReadString(obj));
- item.setTitle(ReadString(obj));
- item.setAlternateTitle(ReadString(obj));
- item.setLastVisitedTime(ReadReal(obj));
-
- int x = ReadInteger(obj);
- int y = ReadInteger(obj);
- if (include_scroll_offset)
- item.setScrollOffset(WebPoint(x, y));
-
- item.setIsTargetItem(ReadBoolean(obj));
- item.setVisitCount(ReadInteger(obj));
- item.setReferrer(ReadString(obj));
-
- item.setDocumentState(ReadStringVector(obj));
-
- if (obj->version >= 11)
- item.setPageScaleFactor(ReadReal(obj));
- if (obj->version >= 9)
- item.setItemSequenceNumber(ReadInteger64(obj));
- if (obj->version >= 6)
- item.setDocumentSequenceNumber(ReadInteger64(obj));
- if (obj->version >= 7) {
- bool has_state_object = ReadBoolean(obj);
- if (has_state_object) {
- item.setStateObject(
- WebSerializedScriptValue::fromString(ReadString(obj)));
- }
- }
-
- // The extra referrer string is read for backwards compat.
- const WebHTTPBody& http_body = ReadFormData(obj);
- const WebString& http_content_type = ReadString(obj);
-
- if (obj->version < 14)
- ConsumeString(obj); // Skip unused referrer string.
-
- if (include_form_data == ALWAYS_INCLUDE_FORM_DATA ||
- (include_form_data == INCLUDE_FORM_DATA_WITHOUT_PASSWORDS &&
- !http_body.isNull() && !http_body.containsPasswordData())) {
- // Include the full HTTP body.
- item.setHTTPBody(http_body);
- item.setHTTPContentType(http_content_type);
- } else if (!http_body.isNull()) {
- // Don't include the data in the HTTP body, but include its identifier. This
- // enables fetching data from the cache.
- WebHTTPBody empty_http_body;
- empty_http_body.initialize();
- empty_http_body.setIdentifier(http_body.identifier());
- item.setHTTPBody(empty_http_body);
- }
-
-#if defined(OS_ANDROID)
- if (obj->version == 11) {
- // Now-unused values that shipped in this version of Chrome for Android when
- // it was on a private branch.
- ReadReal(obj);
- ReadBoolean(obj);
-
- // In this version, pageScaleFactor included deviceScaleFactor and scroll
- // offsets were premultiplied by pageScaleFactor.
- if (item.pageScaleFactor()) {
- if (include_scroll_offset)
- item.setScrollOffset(
- WebPoint(item.scrollOffset().x / item.pageScaleFactor(),
- item.scrollOffset().y / item.pageScaleFactor()));
- item.setPageScaleFactor(item.pageScaleFactor() /
- gfx::Screen::GetNativeScreen()->GetPrimaryDisplay()
- .device_scale_factor());
- }
- }
-#endif
-
- // Subitems
- int num_children = ReadInteger(obj);
- for (int i = 0; i < num_children; ++i)
- item.appendToChildren(ReadHistoryItem(obj,
- include_form_data,
- include_scroll_offset,
- false));
-
- return item;
-}
-
-// Reconstruct a HistoryItem from a string, using our JSON Value deserializer.
-// This assumes that the given serialized string has all the required key,value
-// pairs, and does minimal error checking. The form data of the post is restored
-// if |include_form_data| is |ALWAYS_INCLUDE_FORM_DATA| or if the data doesn't
-// contain passwords and |include_form_data| is
-// |INCLUDE_FORM_DATA_WITHOUT_PASSWORDS|. Otherwise the form data is empty. If
-// |include_scroll_offset| is true, the scroll offset is restored.
-WebHistoryItem HistoryItemFromString(
- const std::string& serialized_item,
- IncludeFormData include_form_data,
- bool include_scroll_offset) {
- if (serialized_item.empty())
- return WebHistoryItem();
-
- SerializeObject obj(serialized_item.data(),
- static_cast<int>(serialized_item.length()));
- return ReadHistoryItem(&obj, include_form_data, include_scroll_offset, true);
-}
-
-void ToFilePathVector(const WebVector<WebString>& input,
- std::vector<base::FilePath>* output) {
- for (size_t i = 0; i < input.size(); ++i)
- output->push_back(webkit_base::WebStringToFilePath(input[i]));
-}
-
-} // namespace
-
-// Serialize a HistoryItem to a string, using our JSON Value serializer.
-std::string HistoryItemToString(const WebHistoryItem& item) {
- if (item.isNull())
- return std::string();
-
- SerializeObject obj;
- WriteHistoryItem(item, &obj, true);
- return obj.GetAsString();
-}
-
-WebHistoryItem HistoryItemFromString(const std::string& serialized_item) {
- return HistoryItemFromString(serialized_item, ALWAYS_INCLUDE_FORM_DATA, true);
-}
-
-std::vector<base::FilePath> FilePathsFromHistoryState(
- const std::string& content_state) {
- // TODO(darin): We should avoid using the WebKit API here, so that we do not
- // need to have WebKit initialized before calling this method.
-
- std::vector<base::FilePath> result;
-
- // In newer versions of the format, the set of referenced files is computed
- // at serialization time.
- SerializeObject obj(content_state.data(),
- static_cast<int>(content_state.length()));
- obj.version = ReadInteger(&obj);
-
- if (obj.version > kVersion || obj.version < 1)
- return result;
-
- if (obj.version >= 14) {
- ToFilePathVector(ReadStringVector(&obj), &result);
- } else {
- // TODO(darin): Delete this code path after we branch for M29.
- const WebHistoryItem& item =
- HistoryItemFromString(content_state, ALWAYS_INCLUDE_FORM_DATA, true);
- if (!item.isNull())
- ToFilePathVector(item.getReferencedFilePaths(), &result);
- }
- return result;
-}
-
-// For testing purposes only.
-void HistoryItemToVersionedString(const WebHistoryItem& item, int version,
- std::string* serialized_item) {
- if (item.isNull()) {
- serialized_item->clear();
- return;
- }
-
- // Temporarily change the version.
- int real_version = kVersion;
- kVersion = version;
-
- SerializeObject obj;
- WriteHistoryItem(item, &obj, true);
- *serialized_item = obj.GetAsString();
-
- kVersion = real_version;
-}
-
-int HistoryItemCurrentVersion() {
- return kVersion;
-}
-
-std::string RemovePasswordDataFromHistoryState(
- const std::string& content_state) {
- // TODO(darin): We should avoid using the WebKit API here, so that we do not
- // need to have WebKit initialized before calling this method.
- const WebHistoryItem& item =
- HistoryItemFromString(
- content_state, INCLUDE_FORM_DATA_WITHOUT_PASSWORDS, true);
- if (item.isNull()) {
- // Couldn't parse the string, return an empty string.
- return std::string();
- }
-
- return HistoryItemToString(item);
-}
-
-std::string RemoveScrollOffsetFromHistoryState(
- const std::string& content_state) {
- // TODO(darin): We should avoid using the WebKit API here, so that we do not
- // need to have WebKit initialized before calling this method.
- const WebHistoryItem& item =
- HistoryItemFromString(content_state, ALWAYS_INCLUDE_FORM_DATA, false);
- if (item.isNull()) {
- // Couldn't parse the string, return an empty string.
- return std::string();
- }
-
- return HistoryItemToString(item);
-}
-
-std::string CreateHistoryStateForURL(const GURL& url) {
- // We avoid using the WebKit API here, so that we do not need to have WebKit
- // initialized before calling this method. Instead, we write a simple
- // serialization of the given URL with a dummy version number of -1. This
- // will be interpreted by ReadHistoryItem as a request to create a default
- // WebHistoryItem.
- SerializeObject obj;
- WriteInteger(-1, &obj);
- WriteGURL(url, &obj);
- return obj.GetAsString();
-}
-
-} // namespace webkit_glue
« no previous file with comments | « webkit/glue/glue_serialize_deprecated.h ('k') | webkit/glue/glue_serialize_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698