summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
diff options
context:
space:
mode:
authorKristian Monsen <kristianm@google.com>2011-05-11 20:53:37 +0100
committerKristian Monsen <kristianm@google.com>2011-05-16 13:54:48 +0100
commit21d179b334e59e9a3bfcaed4c4430bef1bc5759d (patch)
tree64e2bb6da27af6a5c93ca34f6051584aafbfcb9e /chrome/browser/ui/cocoa/applescript/tab_applescript.mm
parent0c63f00edd6ed0482fd5cbcea937ca088baf7858 (diff)
downloadexternal_chromium-21d179b334e59e9a3bfcaed4c4430bef1bc5759d.zip
external_chromium-21d179b334e59e9a3bfcaed4c4430bef1bc5759d.tar.gz
external_chromium-21d179b334e59e9a3bfcaed4c4430bef1bc5759d.tar.bz2
Merge Chromium at 10.0.621.0: Initial merge by git.
Change-Id: I070cc91c608dfa4a968a5a54c173260765ac8097
Diffstat (limited to 'chrome/browser/ui/cocoa/applescript/tab_applescript.mm')
-rw-r--r--chrome/browser/ui/cocoa/applescript/tab_applescript.mm296
1 files changed, 296 insertions, 0 deletions
diff --git a/chrome/browser/ui/cocoa/applescript/tab_applescript.mm b/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
new file mode 100644
index 0000000..3a10095
--- /dev/null
+++ b/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
@@ -0,0 +1,296 @@
+// 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.
+
+#import "chrome/browser/ui/cocoa/applescript/tab_applescript.h"
+
+#include "base/file_path.h"
+#include "base/logging.h"
+#import "base/scoped_nsobject.h"
+#include "base/sys_string_conversions.h"
+#include "base/utf_string_conversions.h"
+#include "chrome/browser/download/save_package.h"
+#include "chrome/browser/renderer_host/render_view_host.h"
+#include "chrome/browser/sessions/session_id.h"
+#include "chrome/browser/tab_contents/navigation_controller.h"
+#include "chrome/browser/tab_contents/navigation_entry.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/browser/ui/cocoa/applescript/error_applescript.h"
+#include "chrome/common/url_constants.h"
+#include "googleurl/src/gurl.h"
+
+@interface TabAppleScript()
+@property (nonatomic, copy) NSString* tempURL;
+@end
+
+@implementation TabAppleScript
+
+@synthesize tempURL = tempURL_;
+
+- (id)init {
+ if ((self = [super init])) {
+ SessionID session;
+ SessionID::id_type futureSessionIDOfTab = session.id() + 1;
+ // Holds the SessionID that the new tab is going to get.
+ scoped_nsobject<NSNumber> numID(
+ [[NSNumber alloc]
+ initWithInt:futureSessionIDOfTab]);
+ [self setUniqueID:numID];
+ [self setTempURL:@""];
+ }
+ return self;
+}
+
+- (void)dealloc {
+ [tempURL_ release];
+ [super dealloc];
+}
+
+- (id)initWithTabContent:(TabContents*)aTabContent {
+ if (!aTabContent) {
+ [self release];
+ return nil;
+ }
+
+ if ((self = [super init])) {
+ // It is safe to be weak, if a tab goes away (eg user closing a tab)
+ // the applescript runtime calls tabs in AppleScriptWindow and this
+ // particular tab is never returned.
+ tabContents_ = aTabContent;
+ scoped_nsobject<NSNumber> numID(
+ [[NSNumber alloc]
+ initWithInt:tabContents_->controller().session_id().id()]);
+ [self setUniqueID:numID];
+ }
+ return self;
+}
+
+- (void)setTabContent:(TabContents*)aTabContent {
+ DCHECK(aTabContent);
+ // It is safe to be weak, if a tab goes away (eg user closing a tab)
+ // the applescript runtime calls tabs in AppleScriptWindow and this
+ // particular tab is never returned.
+ tabContents_ = aTabContent;
+ scoped_nsobject<NSNumber> numID(
+ [[NSNumber alloc]
+ initWithInt:tabContents_->controller().session_id().id()]);
+ [self setUniqueID:numID];
+
+ [self setURL:[self tempURL]];
+}
+
+- (NSString*)URL {
+ if (!tabContents_) {
+ return nil;
+ }
+
+ NavigationEntry* entry = tabContents_->controller().GetActiveEntry();
+ if (!entry) {
+ return nil;
+ }
+ const GURL& url = entry->virtual_url();
+ return base::SysUTF8ToNSString(url.spec());
+}
+
+- (void)setURL:(NSString*)aURL {
+ // If a scripter sets a URL before the node is added save it at a temporary
+ // location.
+ if (!tabContents_) {
+ [self setTempURL:aURL];
+ return;
+ }
+
+ GURL url(base::SysNSStringToUTF8(aURL));
+ // check for valid url.
+ if (!url.is_empty() && !url.is_valid()) {
+ AppleScript::SetError(AppleScript::errInvalidURL);
+ return;
+ }
+
+ NavigationEntry* entry = tabContents_->controller().GetActiveEntry();
+ if (!entry)
+ return;
+
+ const GURL& previousURL = entry->virtual_url();
+ tabContents_->OpenURL(url,
+ previousURL,
+ CURRENT_TAB,
+ PageTransition::TYPED);
+}
+
+- (NSString*)title {
+ NavigationEntry* entry = tabContents_->controller().GetActiveEntry();
+ if (!entry)
+ return nil;
+
+ std::wstring title;
+ if (entry != NULL) {
+ title = UTF16ToWideHack(entry->title());
+ }
+
+ return base::SysWideToNSString(title);
+}
+
+- (NSNumber*)loading {
+ BOOL loadingValue = tabContents_->is_loading() ? YES : NO;
+ return [NSNumber numberWithBool:loadingValue];
+}
+
+- (void)handlesUndoScriptCommand:(NSScriptCommand*)command {
+ RenderViewHost* view = tabContents_->render_view_host();
+ if (!view) {
+ NOTREACHED();
+ return;
+ }
+
+ view->Undo();
+}
+
+- (void)handlesRedoScriptCommand:(NSScriptCommand*)command {
+ RenderViewHost* view = tabContents_->render_view_host();
+ if (!view) {
+ NOTREACHED();
+ return;
+ }
+
+ view->Redo();
+}
+
+- (void)handlesCutScriptCommand:(NSScriptCommand*)command {
+ RenderViewHost* view = tabContents_->render_view_host();
+ if (!view) {
+ NOTREACHED();
+ return;
+ }
+
+ view->Cut();
+}
+
+- (void)handlesCopyScriptCommand:(NSScriptCommand*)command {
+ RenderViewHost* view = tabContents_->render_view_host();
+ if (!view) {
+ NOTREACHED();
+ return;
+ }
+
+ view->Copy();
+}
+
+- (void)handlesPasteScriptCommand:(NSScriptCommand*)command {
+ RenderViewHost* view = tabContents_->render_view_host();
+ if (!view) {
+ NOTREACHED();
+ return;
+ }
+
+ view->Paste();
+}
+
+- (void)handlesSelectAllScriptCommand:(NSScriptCommand*)command {
+ RenderViewHost* view = tabContents_->render_view_host();
+ if (!view) {
+ NOTREACHED();
+ return;
+ }
+
+ view->SelectAll();
+}
+
+- (void)handlesGoBackScriptCommand:(NSScriptCommand*)command {
+ NavigationController& navigationController = tabContents_->controller();
+ if (navigationController.CanGoBack())
+ navigationController.GoBack();
+}
+
+- (void)handlesGoForwardScriptCommand:(NSScriptCommand*)command {
+ NavigationController& navigationController = tabContents_->controller();
+ if (navigationController.CanGoForward())
+ navigationController.GoForward();
+}
+
+- (void)handlesReloadScriptCommand:(NSScriptCommand*)command {
+ NavigationController& navigationController = tabContents_->controller();
+ const bool checkForRepost = true;
+ navigationController.Reload(checkForRepost);
+}
+
+- (void)handlesStopScriptCommand:(NSScriptCommand*)command {
+ RenderViewHost* view = tabContents_->render_view_host();
+ if (!view) {
+ // We tolerate Stop being called even before a view has been created.
+ // So just log a warning instead of a NOTREACHED().
+ DLOG(WARNING) << "Stop: no view for handle ";
+ return;
+ }
+
+ view->Stop();
+}
+
+- (void)handlesPrintScriptCommand:(NSScriptCommand*)command {
+ bool initiateStatus = tabContents_->PrintNow();
+ if (initiateStatus == false) {
+ AppleScript::SetError(AppleScript::errInitiatePrinting);
+ }
+}
+
+- (void)handlesSaveScriptCommand:(NSScriptCommand*)command {
+ NSDictionary* dictionary = [command evaluatedArguments];
+
+ NSURL* fileURL = [dictionary objectForKey:@"File"];
+ // Scripter has not specifed the location at which to save, so we prompt for
+ // it.
+ if (!fileURL) {
+ tabContents_->OnSavePage();
+ return;
+ }
+
+ FilePath mainFile(base::SysNSStringToUTF8([fileURL path]));
+ // We create a directory path at the folder within which the file exists.
+ // Eg. if main_file = '/Users/Foo/Documents/Google.html'
+ // then directory_path = '/Users/Foo/Documents/Google_files/'.
+ FilePath directoryPath = mainFile.RemoveExtension();
+ directoryPath = directoryPath.InsertBeforeExtension(std::string("_files/"));
+
+ NSString* saveType = [dictionary objectForKey:@"FileType"];
+
+ SavePackage::SavePackageType savePackageType =
+ SavePackage::SAVE_AS_COMPLETE_HTML;
+ if (saveType) {
+ if ([saveType isEqualToString:@"only html"]) {
+ savePackageType = SavePackage::SAVE_AS_ONLY_HTML;
+ } else if ([saveType isEqualToString:@"complete html"]) {
+ savePackageType = SavePackage::SAVE_AS_COMPLETE_HTML;
+ } else {
+ AppleScript::SetError(AppleScript::errInvalidSaveType);
+ return;
+ }
+ }
+
+ tabContents_->SavePage(mainFile, directoryPath, savePackageType);
+}
+
+
+- (void)handlesViewSourceScriptCommand:(NSScriptCommand*)command {
+ NavigationEntry* entry = tabContents_->controller().GetLastCommittedEntry();
+ if (entry) {
+ tabContents_->OpenURL(GURL(chrome::kViewSourceScheme + std::string(":") +
+ entry->url().spec()), GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK);
+ }
+}
+
+- (id)handlesExecuteJavascriptScriptCommand:(NSScriptCommand*)command {
+ RenderViewHost* view = tabContents_->render_view_host();
+ if (!view) {
+ NOTREACHED();
+ return nil;
+ }
+
+ std::wstring script = base::SysNSStringToWide(
+ [[command evaluatedArguments] objectForKey:@"javascript"]);
+ view->ExecuteJavascriptInWebFrame(L"", script);
+
+ // TODO(Shreyas): Figure out a way to get the response back.
+ return nil;
+}
+
+@end