| Index: chrome/browser/ui/cocoa/applescript/tab_applescript.mm
|
| diff --git a/chrome/browser/ui/cocoa/applescript/tab_applescript.mm b/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
|
| index 8d19f4b491f1e61f9ba7f7b69f34b2fe97fe896a..98fb76e5afca122900227fac5b913f2914139f92 100644
|
| --- a/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
|
| +++ b/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
|
| @@ -23,6 +23,101 @@
|
| #include "content/common/view_messages.h"
|
| #include "googleurl/src/gurl.h"
|
|
|
| +@interface AnyResultValue : NSObject {
|
| + @private
|
| + scoped_nsobject<NSAppleEventDescriptor> descriptor;
|
| +}
|
| +- (id)initWithDescriptor:(NSAppleEventDescriptor*)desc;
|
| +- (NSAppleEventDescriptor *)scriptingAnyDescriptor;
|
| +@end
|
| +
|
| +@implementation AnyResultValue
|
| +
|
| +- (id)initWithDescriptor:(NSAppleEventDescriptor*)desc {
|
| + if (self = [super init]) {
|
| + descriptor.reset([desc retain]);
|
| + }
|
| + return self;
|
| +}
|
| +
|
| +- (NSAppleEventDescriptor *)scriptingAnyDescriptor {
|
| + return descriptor.get();
|
| +}
|
| +
|
| +@end
|
| +
|
| +static NSAppleEventDescriptor* valueToDescriptor(Value* value) {
|
| + NSAppleEventDescriptor* descriptor = nil;
|
| + switch (value->GetType()) {
|
| + case Value::TYPE_NULL:
|
| + descriptor = [NSAppleEventDescriptor
|
| + descriptorWithTypeCode:cMissingValue];
|
| + break;
|
| + case Value::TYPE_BOOLEAN: {
|
| + bool bool_value;
|
| + value->GetAsBoolean(&bool_value);
|
| + descriptor = [NSAppleEventDescriptor descriptorWithBoolean:bool_value];
|
| + break;
|
| + }
|
| + case Value::TYPE_INTEGER: {
|
| + int int_value;
|
| + value->GetAsInteger(&int_value);
|
| + descriptor = [NSAppleEventDescriptor descriptorWithInt32:int_value];
|
| + break;
|
| + }
|
| + case Value::TYPE_DOUBLE: {
|
| + double double_value;
|
| + value->GetAsDouble(&double_value);
|
| + descriptor = [NSAppleEventDescriptor
|
| + descriptorWithDescriptorType:typeIEEE64BitFloatingPoint
|
| + bytes:&double_value
|
| + length:sizeof(double_value)];
|
| + break;
|
| + }
|
| + case Value::TYPE_STRING: {
|
| + std::string string_value;
|
| + value->GetAsString(&string_value);
|
| + descriptor = [NSAppleEventDescriptor descriptorWithString:
|
| + base::SysUTF8ToNSString(string_value)];
|
| + break;
|
| + }
|
| + case Value::TYPE_BINARY:
|
| + NOTREACHED();
|
| + break;
|
| + case Value::TYPE_DICTIONARY: {
|
| + DictionaryValue* dictionary_value = static_cast<DictionaryValue*>(value);
|
| + descriptor = [NSAppleEventDescriptor recordDescriptor];
|
| + NSAppleEventDescriptor* userRecord = [NSAppleEventDescriptor
|
| + listDescriptor];
|
| + for (DictionaryValue::key_iterator iter(dictionary_value->begin_keys());
|
| + iter != dictionary_value->end_keys(); ++iter) {
|
| + Value* item;
|
| + if (dictionary_value->Get(*iter, &item)) {
|
| + [userRecord insertDescriptor:[NSAppleEventDescriptor
|
| + descriptorWithString:base::SysUTF8ToNSString(*iter)] atIndex:0];
|
| + [userRecord insertDescriptor:valueToDescriptor(item) atIndex:0];
|
| + }
|
| + }
|
| + // Description of what keyASUserRecordFields does.
|
| + // http://www.mail-archive.com/cocoa-dev%40lists.apple.com/msg40149.html
|
| + [descriptor setDescriptor:userRecord forKeyword:keyASUserRecordFields];
|
| + break;
|
| + }
|
| + case Value::TYPE_LIST: {
|
| + ListValue* list_value;
|
| + value->GetAsList(&list_value);
|
| + descriptor = [NSAppleEventDescriptor listDescriptor];
|
| + for (unsigned i = 0; i < list_value->GetSize(); ++i) {
|
| + Value* item;
|
| + list_value->Get(i, &item);
|
| + [descriptor insertDescriptor:valueToDescriptor(item) atIndex:0];
|
| + }
|
| + break;
|
| + }
|
| + }
|
| + return descriptor;
|
| +}
|
| +
|
| @interface TabAppleScript()
|
| @property (nonatomic, copy) NSString* tempURL;
|
| @end
|
| @@ -301,10 +396,9 @@
|
|
|
| string16 script = base::SysNSStringToUTF16(
|
| [[command evaluatedArguments] objectForKey:@"javascript"]);
|
| - view->ExecuteJavascriptInWebFrame(string16(), script);
|
| -
|
| - // TODO(Shreyas): Figure out a way to get the response back.
|
| - return nil;
|
| + Value* value = view->ExecuteJavascriptAndGetValue(string16(), script);
|
| + NSAppleEventDescriptor* descriptor = valueToDescriptor(value);
|
| + return [[[AnyResultValue alloc] initWithDescriptor:descriptor] autorelease];
|
| }
|
|
|
| @end
|
|
|