diff --git a/suite/browser/public/nsISearchService.idl b/suite/browser/public/nsISearchService.idl index afa01670a0a7..fdecb226daed 100755 --- a/suite/browser/public/nsISearchService.idl +++ b/suite/browser/public/nsISearchService.idl @@ -37,6 +37,7 @@ interface nsILocalSearchService : nsISupports [scriptable, uuid(6bd1d803-1c67-11d3-9820-ed1b357eb3c4)] interface nsIInternetSearchService : nsISupports { + string GetInternetSearchURL(in string searchEngineURI, in wstring searchStr); void FindInternetSearchResults(in string url); void Stop(); void ClearResults(); diff --git a/suite/browser/src/nsInternetSearchService.cpp b/suite/browser/src/nsInternetSearchService.cpp index be02edea27d2..2301f4be0a57 100755 --- a/suite/browser/src/nsInternetSearchService.cpp +++ b/suite/browser/src/nsInternetSearchService.cpp @@ -1120,6 +1120,56 @@ NS_NewInternetSearchService(nsISupports* aOuter, REFNSIID aIID, void** aResult) +NS_IMETHODIMP +InternetSearchDataSource::GetInternetSearchURL(const char *searchEngineURI, + const PRUnichar *searchStr, char **resultURL) +{ + if (!resultURL) return(NS_ERROR_NULL_POINTER); + *resultURL = nsnull; + + // if we haven't already, load in the engines + if (mEngineListBuilt == PR_FALSE) DeferredInit(); + + nsresult rv; + nsCOMPtr engine; + if (NS_FAILED(rv = gRDFService->GetResource(searchEngineURI, getter_AddRefs(engine)))) + return(rv); + if (!engine) return(NS_ERROR_UNEXPECTED); + + // if its a engine from a search category, then get its "#Name", + // and try to map from that back to the real engine reference + if (isSearchCategoryEngineURI(engine)) + { + nsCOMPtr trueEngine; + rv = resolveSearchCategoryEngineURI(engine, getter_AddRefs(trueEngine)); + if (NS_FAILED(rv) || (!trueEngine)) return(NS_ERROR_UNEXPECTED); + engine = trueEngine; + } + + nsAutoString data; + if (NS_FAILED(rv = FindData(engine, data))) return(rv); + if (data.Length() < 1) return(NS_ERROR_UNEXPECTED); + + nsAutoString action, input, method, text(searchStr), userVar; + if (NS_FAILED(rv = GetData(data, "search", "action", action))) return(rv); + if (NS_FAILED(rv = GetData(data, "search", "method", method))) return(rv); + if (NS_FAILED(rv = GetInputs(data, userVar, text, input))) return(rv); + if (input.Length() < 1) return(NS_ERROR_UNEXPECTED); + + // we can only handle HTTP GET + if (!method.EqualsIgnoreCase("get")) return(NS_ERROR_UNEXPECTED); + // HTTP Get method support + action += "?"; + action += input; + + // return a copy of the resulting search URL + *resultURL = action.ToNewCString(); + + return(NS_OK); +} + + + NS_IMETHODIMP InternetSearchDataSource::FindInternetSearchResults(const char *url) { diff --git a/xpfe/components/search/public/nsISearchService.idl b/xpfe/components/search/public/nsISearchService.idl index afa01670a0a7..fdecb226daed 100755 --- a/xpfe/components/search/public/nsISearchService.idl +++ b/xpfe/components/search/public/nsISearchService.idl @@ -37,6 +37,7 @@ interface nsILocalSearchService : nsISupports [scriptable, uuid(6bd1d803-1c67-11d3-9820-ed1b357eb3c4)] interface nsIInternetSearchService : nsISupports { + string GetInternetSearchURL(in string searchEngineURI, in wstring searchStr); void FindInternetSearchResults(in string url); void Stop(); void ClearResults(); diff --git a/xpfe/components/search/src/nsInternetSearchService.cpp b/xpfe/components/search/src/nsInternetSearchService.cpp index be02edea27d2..2301f4be0a57 100755 --- a/xpfe/components/search/src/nsInternetSearchService.cpp +++ b/xpfe/components/search/src/nsInternetSearchService.cpp @@ -1120,6 +1120,56 @@ NS_NewInternetSearchService(nsISupports* aOuter, REFNSIID aIID, void** aResult) +NS_IMETHODIMP +InternetSearchDataSource::GetInternetSearchURL(const char *searchEngineURI, + const PRUnichar *searchStr, char **resultURL) +{ + if (!resultURL) return(NS_ERROR_NULL_POINTER); + *resultURL = nsnull; + + // if we haven't already, load in the engines + if (mEngineListBuilt == PR_FALSE) DeferredInit(); + + nsresult rv; + nsCOMPtr engine; + if (NS_FAILED(rv = gRDFService->GetResource(searchEngineURI, getter_AddRefs(engine)))) + return(rv); + if (!engine) return(NS_ERROR_UNEXPECTED); + + // if its a engine from a search category, then get its "#Name", + // and try to map from that back to the real engine reference + if (isSearchCategoryEngineURI(engine)) + { + nsCOMPtr trueEngine; + rv = resolveSearchCategoryEngineURI(engine, getter_AddRefs(trueEngine)); + if (NS_FAILED(rv) || (!trueEngine)) return(NS_ERROR_UNEXPECTED); + engine = trueEngine; + } + + nsAutoString data; + if (NS_FAILED(rv = FindData(engine, data))) return(rv); + if (data.Length() < 1) return(NS_ERROR_UNEXPECTED); + + nsAutoString action, input, method, text(searchStr), userVar; + if (NS_FAILED(rv = GetData(data, "search", "action", action))) return(rv); + if (NS_FAILED(rv = GetData(data, "search", "method", method))) return(rv); + if (NS_FAILED(rv = GetInputs(data, userVar, text, input))) return(rv); + if (input.Length() < 1) return(NS_ERROR_UNEXPECTED); + + // we can only handle HTTP GET + if (!method.EqualsIgnoreCase("get")) return(NS_ERROR_UNEXPECTED); + // HTTP Get method support + action += "?"; + action += input; + + // return a copy of the resulting search URL + *resultURL = action.ToNewCString(); + + return(NS_OK); +} + + + NS_IMETHODIMP InternetSearchDataSource::FindInternetSearchResults(const char *url) {