WebCore/ChangeLog

 12009-10-07 Brian Weinstein <bweinstein@apple.com>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 Fixes <http://webkit.org/b/30104>.
 6 Inspector should show cookies of sub-resources on the page.
 7
 8 This function implements showing cookies for all sub-resources of a page.
 9 When the page is loaded, it populates the Storage Panel with a list of all
 10 domains that were loaded as part of the full page load (iframes, ads, etc).
 11 When the user selects one of the domains, the inspector calls back into the
 12 controller, and the controller combines all of the cookies from that domain
 13 into a list, and sends that list is sent back to the controller to render.
 14
 15 A domain now needs to be passed into CookieItemsView, and CookieSidebarTreeElement.
 16
 17 As a result of a previous patch, we now have detailed cookie information for
 18 both Windows on CFNetwork and Mac.
 19
 20 * bindings/js/ScriptObject.cpp:
 21 (WebCore::ScriptObject::set):
 22 * bindings/js/ScriptObject.h:
 23 * inspector/InspectorBackend.cpp:
 24 (WebCore::InspectorBackend::getCookies):
 25 (WebCore::InspectorBackend::deleteCookie):
 26 * inspector/InspectorBackend.h:
 27 * inspector/InspectorBackend.idl:
 28 * inspector/InspectorController.cpp:
 29 (WebCore::InspectorController::populateScriptObjects):
 30 (WebCore::InspectorController::didFinishLoading):
 31 (WebCore::InspectorController::getCookies):
 32 (WebCore::InspectorController::buildArrayForCookies):
 33 (WebCore::InspectorController::buildObjectForCookie):
 34 (WebCore::InspectorController::deleteCookie):
 35 * inspector/InspectorController.h:
 36 * inspector/InspectorDOMAgent.cpp:
 37 * inspector/InspectorDOMAgent.h:
 38 * inspector/InspectorFrontend.cpp:
 39 (WebCore::InspectorFrontend::addCookieDomainForDocument):
 40 * inspector/InspectorFrontend.h:
 41 * inspector/front-end/CookieItemsView.js:
 42 (WebInspector.CookieItemsView):
 43 (WebInspector.CookieItemsView.prototype.update):
 44 (WebInspector.CookieItemsView.prototype._deleteButtonClicked):
 45 * inspector/front-end/DOMAgent.js:
 46 (WebInspector.Cookies.getCookiesAsync):
 47 * inspector/front-end/StoragePanel.js:
 48 (WebInspector.StoragePanel):
 49 (WebInspector.StoragePanel.prototype.reset):
 50 (WebInspector.StoragePanel.prototype.addCookieDomain):
 51 (WebInspector.StoragePanel.prototype.showCookies):
 52 (WebInspector.CookieSidebarTreeElement):
 53 (WebInspector.CookieSidebarTreeElement.prototype.onselect):
 54 * inspector/front-end/inspector.js:
 55 (WebInspector.addCookieDomain):
 56 * platform/Cookie.h:
 57 (WebCore::CookieHash::hash):
 58 (WebCore::CookieHash::equal):
 59 (WTF::):
 60
1612009-10-07 Dave Hyatt <hyatt@apple.com>
262
363 Reviewed by Adam Roben.
49258

WebCore/bindings/js/ScriptObject.cpp

@@bool ScriptObject::set(const char* name,
103103 return handleException(m_scriptState);
104104}
105105
 106bool ScriptObject::set(const char* name, unsigned value)
 107{
 108 JSLock lock(SilenceAssertionsOnly);
 109 PutPropertySlot slot;
 110 jsObject()->put(m_scriptState, Identifier(m_scriptState, name), jsNumber(m_scriptState, value), slot);
 111 return handleException(m_scriptState);
 112}
 113
106114bool ScriptObject::set(const char* name, bool value)
107115{
108116 JSLock lock(SilenceAssertionsOnly);
49210

WebCore/bindings/js/ScriptObject.h

@@namespace WebCore {
5252 bool set(const char* name, double);
5353 bool set(const char* name, long long);
5454 bool set(const char* name, int);
 55 bool set(const char* name, unsigned);
5556 bool set(const char* name, bool);
5657
5758 static ScriptObject createNew(ScriptState*);
49210

WebCore/inspector/InspectorBackend.cpp

@@void InspectorBackend::copyNode(long nod
451451 Pasteboard::generalPasteboard()->writePlainText(markup);
452452}
453453
454 void InspectorBackend::getCookies(long callId)
 454void InspectorBackend::getCookies(long callId, const String& domain)
455455{
456  if (InspectorDOMAgent* domAgent = inspectorDOMAgent())
457  domAgent->getCookies(callId);
 456 if (!m_inspectorController)
 457 return;
 458 m_inspectorController->getCookies(callId, domain);
458459}
459460
460 void InspectorBackend::deleteCookie(const String& cookieName)
 461void InspectorBackend::deleteCookie(const String& cookieName, const String& domain)
461462{
462463 if (!m_inspectorController)
463464 return;
464  m_inspectorController->deleteCookie(cookieName);
 465 m_inspectorController->deleteCookie(cookieName, domain);
465466}
466467
467468void InspectorBackend::highlight(long nodeId)
49210

WebCore/inspector/InspectorBackend.h

@@public:
138138 void getEventListenersForNode(long callId, long nodeId);
139139 void copyNode(long nodeId);
140140
141  void getCookies(long callId);
142  void deleteCookie(const String& cookieName);
 141 void getCookies(long callId, const String& domain);
 142 void deleteCookie(const String& cookieName, const String& domain);
143143
144144 // Generic code called from custom implementations.
145145 void highlight(long nodeId);
49210

WebCore/inspector/InspectorBackend.idl

@@module core {
109109 void getEventListenersForNode(in long callId, in long nodeId);
110110 void copyNode(in long nodeId);
111111
112  void getCookies(in long callId);
113  void deleteCookie(in DOMString cookieName);
 112 void getCookies(in long callId, in DOMString domain);
 113 void deleteCookie(in DOMString cookieName, in DOMString domain);
114114
115115 // Called from InjectedScript.
116116 [Custom] DOMObject nodeForId(in long nodeId);
49210

WebCore/inspector/InspectorController.cpp

3636#include "CachedResource.h"
3737#include "Console.h"
3838#include "ConsoleMessage.h"
 39#include "Cookie.h"
3940#include "CookieJar.h"
4041#include "Document.h"
4142#include "DocumentLoader.h"

7677#include "TextEncoding.h"
7778#include "TextIterator.h"
7879#include <wtf/CurrentTime.h>
 80#include <wtf/ListHashSet.h>
7981#include <wtf/RefCounted.h>
8082#include <wtf/StdLibExtras.h>
8183

@@void InspectorController::populateScript
652654 m_domAgent->setDocument(m_inspectedPage->mainFrame()->document());
653655
654656 ResourcesMap::iterator resourcesEnd = m_resources.end();
655  for (ResourcesMap::iterator it = m_resources.begin(); it != resourcesEnd; ++it)
 657 for (ResourcesMap::iterator it = m_resources.begin(); it != resourcesEnd; ++it) {
656658 it->second->createScriptObject(m_frontend.get());
657 
 659 m_frontend->addCookieDomainForDocument(it->second->frame()->document());
 660 }
 661
658662 unsigned messageCount = m_consoleMessages.size();
659663 for (unsigned i = 0; i < messageCount; ++i)
660664 m_consoleMessages[i]->addToConsole(m_frontend.get());

@@void InspectorController::didFinishLoadi
972976
973977 addResource(resource.get());
974978
975  if (m_frontend)
 979 if (m_frontend) {
976980 resource->updateScriptObject(m_frontend.get());
 981 m_frontend->addCookieDomainForDocument(resource->frame()->document());
 982 }
977983}
978984
979985void InspectorController::didFailLoading(DocumentLoader*, unsigned long identifier, const ResourceError& /*error*/)

@@void InspectorController::didOpenDatabas
11251131}
11261132#endif
11271133
 1134void InspectorController::getCookies(long callId, const String& host)
 1135{
 1136 if (!m_frontend)
 1137 return;
 1138
 1139 // If we can get raw cookies.
 1140 ListHashSet<Cookie> rawCookiesList;
 1141
 1142 // If we can't get raw cookies - fall back to String representation
 1143 String stringCookiesList;
 1144
 1145 // Return value to getRawCookies should be the same for every call because
 1146 // the return value is platform/network backend specific, and the call will
 1147 // always return the same true/false value.
 1148 bool rawCookiesImplemented = false;
 1149
 1150 ResourcesMap::iterator resourcesEnd = m_resources.end();
 1151 for (ResourcesMap::iterator it = m_resources.begin(); it != resourcesEnd; ++it) {
 1152 Document* document = it->second->frame()->document();
 1153 if (document->url().host() == host) {
 1154 Vector<Cookie> docCookiesList;
 1155 rawCookiesImplemented = getRawCookies(document, document->cookieURL(), docCookiesList);
 1156
 1157 if (!rawCookiesImplemented)
 1158 // FIXME: We need duplication checking for the String representation of cookies.
 1159 stringCookiesList += document->cookie();
 1160 else {
 1161 int cookiesSize = docCookiesList.size();
 1162 for (int i = 0; i < cookiesSize; i++) {
 1163 if (!rawCookiesList.contains(docCookiesList[i]))
 1164 rawCookiesList.add(docCookiesList[i]);
 1165 }
 1166 }
 1167 }
 1168 }
 1169
 1170 if (!rawCookiesImplemented)
 1171 m_frontend->didGetCookies(callId, m_frontend->newScriptArray(), stringCookiesList);
 1172 else
 1173 m_frontend->didGetCookies(callId, buildArrayForCookies(rawCookiesList), String());
 1174}
 1175
 1176ScriptArray InspectorController::buildArrayForCookies(ListHashSet<Cookie>& cookiesList)
 1177{
 1178 ScriptArray cookies = m_frontend->newScriptArray();
 1179
 1180 ListHashSet<Cookie>::iterator end = cookiesList.end();
 1181 ListHashSet<Cookie>::iterator it = cookiesList.begin();
 1182 for (int i = 0; it != end; ++it, i++) {
 1183 cookies.set(i, buildObjectForCookie(*it));
 1184 }
 1185 return cookies;
 1186}
 1187
 1188ScriptObject InspectorController::buildObjectForCookie(const Cookie& cookie)
 1189{
 1190 ScriptObject value = m_frontend->newScriptObject();
 1191 value.set("name", cookie.name);
 1192 value.set("value", cookie.value);
 1193 value.set("domain", cookie.domain);
 1194 value.set("path", cookie.path);
 1195 value.set("expires", cookie.expires);
 1196 value.set("size", (cookie.name.length() + cookie.value.length()));
 1197 value.set("httpOnly", cookie.httpOnly);
 1198 value.set("secure", cookie.secure);
 1199 value.set("session", cookie.session);
 1200 return value;
 1201}
 1202
11281203#if ENABLE(DOM_STORAGE)
11291204void InspectorController::didUseDOMStorage(StorageArea* storageArea, bool isLocalStorage, Frame* frame)
11301205{

@@void InspectorController::resetInjectedS
17091784 function.call();
17101785}
17111786
1712 void InspectorController::deleteCookie(const String& cookieName)
 1787void InspectorController::deleteCookie(const String& cookieName, const String& domain)
17131788{
1714  Document* document = m_inspectedPage->mainFrame()->document();
1715  WebCore::deleteCookie(document, document->cookieURL(), cookieName);
 1789 ResourcesMap::iterator resourcesEnd = m_resources.end();
 1790 for (ResourcesMap::iterator it = m_resources.begin(); it != resourcesEnd; ++it) {
 1791 Document* document = it->second->frame()->document();
 1792 if (document->url().host() == domain)
 1793 WebCore::deleteCookie(document, document->cookieURL(), cookieName);
 1794 }
17161795}
17171796
17181797} // namespace WebCore
49210

WebCore/inspector/InspectorController.h

3030#define InspectorController_h
3131
3232#include "Console.h"
 33#include "Cookie.h"
3334#include "PlatformString.h"
 35#include "ScriptArray.h"
3436#include "ScriptObject.h"
3537#include "ScriptState.h"
3638#include "ScriptValue.h"

3941
4042#include <wtf/HashMap.h>
4143#include <wtf/HashSet.h>
 44#include <wtf/ListHashSet.h>
4245#include <wtf/RefCounted.h>
4346#include <wtf/Vector.h>
4447

@@public:
232235
233236 void mainResourceFiredLoadEvent(DocumentLoader*, const KURL&);
234237 void mainResourceFiredDOMContentEvent(DocumentLoader*, const KURL&);
 238
 239 void getCookies(long callId, const String& url);
235240
236241#if ENABLE(DATABASE)
237242 void didOpenDatabase(Database*, const String& domain, const String& name, const String& version);

@@private:
307312
308313 void resetInjectedScript();
309314
310  void deleteCookie(const String& cookieName);
 315 void deleteCookie(const String& cookieName, const String& domain);
311316
312317#if ENABLE(JAVASCRIPT_DEBUGGER)
313318 void startUserInitiatedProfilingSoon();

@@private:
317322#if ENABLE(DOM_STORAGE)
318323 InspectorDOMStorageResource* getDOMStorageResourceForId(int storageId);
319324#endif
 325
 326 ScriptObject buildObjectForCookie(const Cookie&);
 327 ScriptArray buildArrayForCookies(ListHashSet<Cookie>&);
320328
321329 void focusNode();
322330
49210

WebCore/inspector/InspectorDOMAgent.cpp

@@void InspectorDOMAgent::getEventListener
438438 m_frontend->didGetEventListenersForNode(callId, nodeId, listenersArray);
439439}
440440
441 void InspectorDOMAgent::getCookies(long callId)
442 {
443  Document* doc = mainFrameDocument();
444  Vector<Cookie> cookiesList;
445  bool isImplemented = getRawCookies(doc, doc->cookieURL(), cookiesList);
446 
447  if (!isImplemented)
448  m_frontend->didGetCookies(callId, m_frontend->newScriptArray(), doc->cookie());
449  else
450  m_frontend->didGetCookies(callId, buildArrayForCookies(cookiesList), String());
451 }
452 
453441ScriptObject InspectorDOMAgent::buildObjectForNode(Node* node, int depth, NodeToIdMap* nodesMap)
454442{
455443 ScriptObject value = m_frontend->newScriptObject();

@@ScriptObject InspectorDOMAgent::buildObj
549537 return value;
550538}
551539
552 ScriptObject InspectorDOMAgent::buildObjectForCookie(const Cookie& cookie)
553 {
554  ScriptObject value = m_frontend->newScriptObject();
555  value.set("name", cookie.name);
556  value.set("value", cookie.value);
557  value.set("domain", cookie.domain);
558  value.set("path", cookie.path);
559  value.set("expires", cookie.expires);
560  value.set("size", static_cast<int>(cookie.name.length() + cookie.value.length()));
561  value.set("httpOnly", cookie.httpOnly);
562  value.set("secure", cookie.secure);
563  value.set("session", cookie.session);
564  return value;
565 }
566 
567 ScriptArray InspectorDOMAgent::buildArrayForCookies(const Vector<Cookie>& cookiesList)
568 {
569  ScriptArray cookies = m_frontend->newScriptArray();
570  unsigned length = cookiesList.size();
571  for (unsigned i = 0; i < length; ++i) {
572  const Cookie& cookie = cookiesList[i];
573  cookies.set(i, buildObjectForCookie(cookie));
574  }
575  return cookies;
576 }
577 
578540Node* InspectorDOMAgent::innerFirstChild(Node* node)
579541{
580542 if (node->isFrameOwnerElement()) {
49210

WebCore/inspector/InspectorDOMAgent.h

@@namespace WebCore {
5353 class Node;
5454 class Page;
5555
56  struct Cookie;
57 
5856 struct EventListenerInfo {
5957 EventListenerInfo(Node* node, const AtomicString& eventType, const EventListenerVector& eventListenerVector)
6058 : node(node)

@@namespace WebCore {
8886 void removeAttribute(long callId, long elementId, const String& name);
8987 void setTextNodeValue(long callId, long nodeId, const String& value);
9088 void getEventListenersForNode(long callId, long nodeId);
91  void getCookies(long callId);
9289
9390 // Methods called from the InspectorController.
9491 void setDocument(Document* document);

@@namespace WebCore {
116113
117114 ScriptObject buildObjectForEventListener(const RegisteredEventListener& registeredEventListener, const AtomicString& eventType, Node* node);
118115
119  ScriptObject buildObjectForCookie(const Cookie& cookie);
120  ScriptArray buildArrayForCookies(const Vector<Cookie>& cookiesList);
121 
122116 // We represent embedded doms as a part of the same hierarchy. Hence we treat children of frame owners differently.
123117 // We also skip whitespace text nodes conditionally. Following methods encapsulate these specifics.
124118 Node* innerFirstChild(Node* node);
49210

WebCore/inspector/InspectorFrontend.cpp

@@void InspectorFrontend::removeResource(l
125125 function->call();
126126}
127127
 128void InspectorFrontend::addCookieDomainForDocument(Document* document)
 129{
 130 OwnPtr<ScriptFunctionCall> function(newFunctionCall("addCookieDomain"));
 131 function->appendArgument(document->url().host());
 132 function->call();
 133}
 134
128135void InspectorFrontend::updateFocusedNode(long long nodeId)
129136{
130137 OwnPtr<ScriptFunctionCall> function(newFunctionCall("updateFocusedNode"));
49210

WebCore/inspector/InspectorFrontend.h

@@namespace WebCore {
7070 bool updateResource(long long identifier, const ScriptObject& resourceObj);
7171 void removeResource(long long identifier);
7272
 73 void addCookieDomainForDocument(Document*);
 74
7375 void updateFocusedNode(long long nodeId);
7476 void setAttachedWindow(bool attached);
7577 void showPanel(int panel);
49210

WebCore/inspector/front-end/CookieItemsView.js

2727 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828 */
2929
30 WebInspector.CookieItemsView = function()
 30WebInspector.CookieItemsView = function(cookieDomain)
3131{
3232 WebInspector.View.call(this);
3333

@@WebInspector.CookieItemsView = function(
4040
4141 this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
4242 this.refreshButton.addEventListener("click", this._refreshButtonClicked.bind(this), false);
 43
 44 this._cookieDomain = cookieDomain;
4345}
4446
4547WebInspector.CookieItemsView.prototype = {

@@WebInspector.CookieItemsView.prototype =
8385 }
8486 }
8587
86  WebInspector.Cookies.getCookiesAsync(callback);
 88 WebInspector.Cookies.getCookiesAsync(callback, this._cookieDomain);
8789 },
8890
8991 dataGridForCookies: function(cookies)

@@WebInspector.CookieItemsView.prototype =
260262 return;
261263
262264 var cookie = this._dataGrid.selectedNode.cookie;
263  InspectorController.deleteCookie(cookie.name);
 265 InspectorController.deleteCookie(cookie.name, this._cookieDomain);
264266 this.update();
265267 },
266268
49210

WebCore/inspector/front-end/DOMAgent.js

@@WebInspector.DOMAgent.prototype = {
437437
438438WebInspector.Cookies = {}
439439
440 WebInspector.Cookies.getCookiesAsync = function(callback)
 440WebInspector.Cookies.getCookiesAsync = function(callback, cookieDomain)
441441{
442442 function mycallback(cookies, cookiesString) {
443443 if (cookiesString)

@@WebInspector.Cookies.getCookiesAsync = f
446446 callback(cookies, true);
447447 }
448448 var callId = WebInspector.Callback.wrap(mycallback);
449  InspectorController.getCookies(callId);
 449 InspectorController.getCookies(callId, cookieDomain);
450450}
451451
452452WebInspector.Cookies.buildCookiesFromString = function(rawCookieString)
49210

WebCore/inspector/front-end/StoragePanel.js

@@WebInspector.StoragePanel = function(dat
6363 this.sidebarTree.appendChild(this.cookieListTreeElement);
6464 this.cookieListTreeElement.expand();
6565
66  this.cookieTreeElement = new WebInspector.CookieSidebarTreeElement();
67  this.cookieListTreeElement.appendChild(this.cookieTreeElement);
68 
6966 this.storageViews = document.createElement("div");
7067 this.storageViews.id = "storage-views";
7168 this.element.appendChild(this.storageViews);

@@WebInspector.StoragePanel.prototype = {
120117
121118 this._domStorage = [];
122119
123  delete this._cookieView;
 120 this._cookieDomains = {};
 121 this._cookieView = {};
124122
125123 this.databasesListTreeElement.removeChildren();
126124 this.localStorageListTreeElement.removeChildren();
127125 this.sessionStorageListTreeElement.removeChildren();
 126 this.cookieListTreeElement.removeChildren();
 127
128128 this.storageViews.removeChildren();
129129
130130 this.storageViewStatusBarItemsContainer.removeChildren();

@@WebInspector.StoragePanel.prototype = {
146146 database._databasesTreeElement = databaseTreeElement;
147147 this.databasesListTreeElement.appendChild(databaseTreeElement);
148148 },
 149
 150 addCookieDomain: function(domain)
 151 {
 152 // Eliminate duplicate domains from the list.
 153 if (this._cookieDomains[domain] !== undefined)
 154 return;
 155
 156 var cookieDomainTreeElement = new WebInspector.CookieSidebarTreeElement(domain);
 157 this.cookieListTreeElement.appendChild(cookieDomainTreeElement);
 158 this._cookieDomains[domain] = domain;
 159 },
149160
150161 addDOMStorage: function(domStorage)
151162 {

@@WebInspector.StoragePanel.prototype = {
240251 this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]);
241252 },
242253
243  showCookies: function()
 254 showCookies: function(cookieDomain)
244255 {
245256 if (this.visibleView)
246257 this.visibleView.hide();
247258
248  var view = this._cookieView;
 259 var view = this._cookieView[cookieDomain];
249260 if (!view) {
250  view = new WebInspector.CookieItemsView();
251  this._cookieView = view;
 261 view = new WebInspector.CookieItemsView(cookieDomain);
 262 this._cookieView[cookieDomain] = view;
252263 }
253264
254265 view.show(this.storageViews);

@@WebInspector.DOMStorageSidebarTreeElemen
572583
573584WebInspector.DOMStorageSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
574585
575 WebInspector.CookieSidebarTreeElement = function()
 586WebInspector.CookieSidebarTreeElement = function(cookieDomain)
576587{
577  WebInspector.SidebarTreeElement.call(this, "cookie-sidebar-tree-item", null, "", null, false);
 588 WebInspector.SidebarTreeElement.call(this, "cookie-sidebar-tree-item", cookieDomain, "", null, false);
 589 this._cookieDomain = cookieDomain;
578590
579591 this.refreshTitles();
580592}

@@WebInspector.CookieSidebarTreeElement =
582594WebInspector.CookieSidebarTreeElement.prototype = {
583595 onselect: function()
584596 {
585  WebInspector.panels.storage.showCookies();
586  },
587 
588  get mainTitle()
589  {
590  return WebInspector.UIString("Cookies");
591  },
592 
593  set mainTitle(x)
594  {
595  // Do nothing.
 597 WebInspector.panels.storage.showCookies(this._cookieDomain);
596598 },
597599
598600 get subtitle()
49210

WebCore/inspector/front-end/inspector.js

@@WebInspector.addDatabase = function(payl
10411041 this.panels.storage.addDatabase(database);
10421042}
10431043
 1044WebInspector.addCookieDomain = function(domain)
 1045{
 1046 this.panels.storage.addCookieDomain(domain);
 1047}
 1048
10441049WebInspector.addDOMStorage = function(payload)
10451050{
10461051 var domStorage = new WebInspector.DOMStorage(
49210

WebCore/platform/Cookie.h

2727#define Cookie_h
2828
2929#include "PlatformString.h"
 30#include "StringHash.h"
3031
3132namespace WebCore {
3233

@@namespace WebCore {
5859 bool session;
5960 };
6061
 62 struct CookieHash {
 63 static unsigned hash(Cookie key)
 64 {
 65 return StringHash::hash(key.name) + StringHash::hash(key.domain) + StringHash::hash(key.path) + key.secure;
 66 }
 67
 68 static bool equal(Cookie a, Cookie b)
 69 {
 70 return a.name == b.name && a.domain == b.domain && a.path == b.path && a.secure == b.secure;
 71 }
 72 };
 73}
 74
 75namespace WTF {
 76 template<typename T> struct DefaultHash;
 77 template<> struct DefaultHash<WebCore::Cookie> {
 78 typedef WebCore::CookieHash Hash;
 79 };
6180}
6281
6382#endif
49210