// Copyright (c) 2010 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. #define NO_NSPR_10_SUPPORT #include "chrome_frame/np_utils.h" #include "chrome_frame/np_browser_functions.h" #include "chrome_frame/ns_associate_iid_win.h" #include "chrome_frame/scoped_ns_ptr_win.h" #include "third_party/xulrunner-sdk/win/include/xpcom/nsXPCOM.h" #include "third_party/xulrunner-sdk/win/include/xpcom/nsIServiceManager.h" #include "third_party/xulrunner-sdk/win/include/necko/nsICookieService.h" #include "third_party/xulrunner-sdk/win/include/necko/nsIIOService.h" #include "third_party/xulrunner-sdk/win/sdk/include/nsIURI.h" #include "third_party/xulrunner-sdk/win/sdk/include/nsStringAPI.h" ASSOCIATE_IID(NS_ISERVICEMANAGER_IID_STR, nsIServiceManager); namespace { nsIID IID_nsIIOService = NS_IIOSERVICE_IID; nsIID IID_nsICookieService = NS_ICOOKIESERVICE_IID; nsIID IID_nsIUri = NS_IURI_IID; const char kMozillaIOServiceContractID[] = "@mozilla.org/network/io-service;1"; const char kMozillaCookieServiceContractID[] = "@mozilla.org/cookieService;1"; bool GetXPCOMCookieServiceAndURI(NPP instance, const std::string& url, nsICookieService** cookie_service, nsIURI** uri) { DCHECK(cookie_service); DCHECK(uri); ScopedNsPtr service_manager; NPError nperr = NS_GetServiceManager(service_manager.Receive()); if (nperr != NPERR_NO_ERROR || !service_manager.get()) { NPError nperr = npapi::GetValue(instance, NPNVserviceManager, service_manager.Receive()); if (nperr != NPERR_NO_ERROR || !service_manager.get()) { return false; } } ScopedNsPtr io_service; service_manager->GetServiceByContractID( kMozillaIOServiceContractID, nsIIOService::GetIID(), reinterpret_cast(io_service.Receive())); if (!io_service.get()) { NOTREACHED() << "Failed to get nsIIOService"; return false; } ScopedNsPtr nsi_cookie_service; service_manager->GetServiceByContractID( kMozillaCookieServiceContractID, nsICookieService::GetIID(), reinterpret_cast(nsi_cookie_service.Receive())); if (!io_service.get()) { NOTREACHED() << "Failed to get nsICookieService"; return false; } nsCString url_string; url_string.Assign(url.c_str()); ScopedNsPtr nsi_uri; io_service->NewURI(url_string, NULL, NULL, nsi_uri.Receive()); if (!nsi_uri.get()) { NOTREACHED() << "Failed to covert url to nsIURI"; return false; } *cookie_service = nsi_cookie_service.Detach(); *uri = nsi_uri.Detach(); return true; } } // namespace namespace np_utils { std::string GetLocation(NPP instance, NPObject* window) { if (!window) { // Can fail if the browser is closing (seen in Opera). return ""; } std::string result; ScopedNpVariant href; ScopedNpVariant location; bool ok = npapi::GetProperty(instance, window, npapi::GetStringIdentifier("location"), &location); DCHECK(ok); DCHECK(location.type == NPVariantType_Object); if (ok) { ok = npapi::GetProperty(instance, location.value.objectValue, npapi::GetStringIdentifier("href"), &href); DCHECK(ok); DCHECK(href.type == NPVariantType_String); if (ok) { result.assign(href.value.stringValue.UTF8Characters, href.value.stringValue.UTF8Length); } } return result; } bool GetCookiesUsingXPCOMCookieService(NPP instance, const std::string& url, std::string* cookie_string) { DCHECK(cookie_string); ScopedNsPtr cookie_service; ScopedNsPtr uri; if (!GetXPCOMCookieServiceAndURI(instance, url, cookie_service.Receive(), uri.Receive())) return false; nsCString cookie_value; nsresult ret = cookie_service->GetCookieString(uri, NULL, getter_Copies(cookie_value)); if (NS_SUCCEEDED(ret)) { *cookie_string = cookie_value.get(); } return NS_SUCCEEDED(ret); } bool SetCookiesUsingXPCOMCookieService(NPP instance, const std::string& url, const std::string& cookie_string) { ScopedNsPtr cookie_service; ScopedNsPtr uri; if (!GetXPCOMCookieServiceAndURI(instance, url, cookie_service.Receive(), uri.Receive())) { return false; } nsCString cookie_value; nsresult ret = cookie_service->SetCookieString(uri, NULL, cookie_string.c_str(), NULL); return NS_SUCCEEDED(ret); } } // namespace np_utils