diff --git a/mozilla/camino/src/websearch/OpenSearchParser.mm b/mozilla/camino/src/websearch/OpenSearchParser.mm index b0c722dde30..c138e0a0f4f 100644 --- a/mozilla/camino/src/websearch/OpenSearchParser.mm +++ b/mozilla/camino/src/websearch/OpenSearchParser.mm @@ -42,6 +42,7 @@ // XML element names we're interested in. static NSString *const kSearchEngineNameElement = @"ShortName"; static NSString *const kSearchEngineURLElement = @"Url"; +static NSString *const kSearchEngineURLParameterElement = @"Param"; // Template URL parameters static NSString *const kSearchTermsURLParameter = @"searchTerms"; @@ -72,7 +73,9 @@ static NSString *const kDefaultLanguage = @"*"; // '*' is defined in OS spec to { if ((self = [super init])) { [self setShouldParseContentsOfElements:[NSSet setWithObject:kSearchEngineNameElement]]; - [self setShouldParseAttributesOfElements:[NSSet setWithObject:kSearchEngineURLElement]]; + [self setShouldParseAttributesOfElements:[NSSet setWithObjects:kSearchEngineURLElement, + kSearchEngineURLParameterElement, + nil]]; mURLParametersAndKnownValues = [[NSDictionary alloc] initWithObjectsAndKeys: kSearchTermsToken, kSearchTermsURLParameter, @@ -118,6 +121,26 @@ static NSString *const kDefaultLanguage = @"*"; // '*' is defined in OS spec to [self setSearchEngineURL:searchURLTemplate]; } } + else if ([elementName isEqualToString:kSearchEngineURLParameterElement]) { + // Older drafts of the OpenSearch spec allow "" elements inside "". When used, only + // a base search URL template is specified, requiring us to manually append each query parameter. + + NSMutableString *searchURL = [NSMutableString stringWithString:[self searchEngineURL]]; + if (!searchURL) + return; + + NSString *paramName = [attributeDict objectForKey:@"name"]; + NSString *paramValue = [attributeDict objectForKey:@"value"]; + // Append the query param differently depending if it's the first one or not. + NSRange queryStartRange = [searchURL rangeOfString:@"?"]; + if (queryStartRange.location == NSNotFound) + [searchURL appendFormat:@"?%@=%@", paramName, paramValue]; + else + [searchURL appendFormat:@"&%@=%@", paramName, paramValue]; + + [self insertValuesForParametersInURLTemplate:searchURL]; + [self setSearchEngineURL:searchURL]; + } } - (void)foundContents:(NSString *)stringContents forElement:(NSString *)elementName