diff options
Diffstat (limited to 'webkit/tools/test_shell/test_shell_mac.mm')
-rw-r--r-- | webkit/tools/test_shell/test_shell_mac.mm | 592 |
1 files changed, 0 insertions, 592 deletions
diff --git a/webkit/tools/test_shell/test_shell_mac.mm b/webkit/tools/test_shell/test_shell_mac.mm deleted file mode 100644 index 26ffce6..0000000 --- a/webkit/tools/test_shell/test_shell_mac.mm +++ /dev/null @@ -1,592 +0,0 @@ -// Copyright (c) 2012 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. - -#include <ApplicationServices/ApplicationServices.h> -#import <Cocoa/Cocoa.h> -#import <objc/objc-runtime.h> -#include <sys/stat.h> - -#include "webkit/tools/test_shell/test_shell.h" - -#include "base/base_paths.h" -#include "base/basictypes.h" -#include "base/debug/debugger.h" -#include "base/file_util.h" -#include "base/files/file_path.h" -#include "base/logging.h" -#include "base/mac/bundle_locations.h" -#include "base/mac/mac_util.h" -#include "base/mac/scoped_nsautorelease_pool.h" -#include "base/message_loop.h" -#include "base/path_service.h" -#include "base/string16.h" -#include "base/strings/string_piece.h" -#include "base/utf_string_conversions.h" -#include "grit/webkit_resources.h" -#include "net/base/mime_util.h" -#include "skia/ext/bitmap_platform_device.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/base/resource/data_pack.h" -#include "ui/gfx/size.h" -#include "webkit/glue/webkit_glue.h" -#include "webkit/glue/webpreferences.h" -#include "webkit/plugins/npapi/plugin_list.h" -#include "webkit/tools/test_shell/mac/test_shell_webview.h" -#include "webkit/tools/test_shell/resource.h" -#include "webkit/tools/test_shell/simple_resource_loader_bridge.h" -#include "webkit/tools/test_shell/test_navigation_controller.h" -#include "webkit/tools/test_shell/test_shell_webkit_init.h" -#include "webkit/tools/test_shell/test_webview_delegate.h" - -#include "third_party/skia/include/core/SkBitmap.h" - -#import "mac/DumpRenderTreePasteboard.h" - -using WebKit::WebWidget; - -#define MAX_LOADSTRING 100 - -// Sizes for URL bar layout -#define BUTTON_HEIGHT 22 -#define BUTTON_WIDTH 72 -#define BUTTON_MARGIN 8 -#define URLBAR_HEIGHT 32 - -// Global Variables: - -// Content area size for newly created windows. -const int kTestWindowWidth = 800; -const int kTestWindowHeight = 600; - -// The W3C SVG layout tests use a different size than the other layout tests -const int kSVGTestWindowWidth = 480; -const int kSVGTestWindowHeight = 360; - -// Hide the window offscreen when in layout test mode. Mac OS X limits -// window positions to +/- 16000. -const int kTestWindowXLocation = -14000; -const int kTestWindowYLocation = -14000; - -// Data pack resource. This is a pointer to the mmapped resources file. -static ui::DataPack* g_resource_data_pack = NULL; - -// Define static member variables -base::LazyInstance <std::map<gfx::NativeWindow, TestShell *> > - TestShell::window_map_ = LAZY_INSTANCE_INITIALIZER; - -// Helper method for getting the path to the test shell resources directory. -base::FilePath GetResourcesFilePath() { - base::FilePath path; - // We need to know if we're bundled or not to know which path to use. - if (base::mac::AmIBundled()) { - PathService::Get(base::DIR_EXE, &path); - path = path.Append(base::FilePath::kParentDirectory); - return path.AppendASCII("Resources"); - } else { - PathService::Get(base::DIR_SOURCE_ROOT, &path); - path = path.AppendASCII("webkit"); - path = path.AppendASCII("tools"); - path = path.AppendASCII("test_shell"); - return path.AppendASCII("resources"); - } -} - -// Receives notification that the window is closing so that it can start the -// tear-down process. Is responsible for deleting itself when done. -@interface WindowDelegate : NSObject<NSWindowDelegate> { - @private - TestShellWebView* m_webView; -} -- (id)initWithWebView:(TestShellWebView*)view; -@end - -@implementation WindowDelegate - -- (id)initWithWebView:(TestShellWebView*)view { - if ((self = [super init])) { - m_webView = view; - } - return self; -} - -- (void)windowDidBecomeKey:(NSNotification*)notification { - [m_webView setIsActive:YES]; -} - -- (void)windowDidResignKey:(NSNotification*)notification { - [m_webView setIsActive:NO]; -} - -// Called when the window is about to close. Perform the self-destruction -// sequence by getting rid of the shell and removing it and the window from -// the various global lists. Instead of doing it here, however, we fire off -// a delayed call to |-cleanup:| to allow everything to get off the stack -// before we go deleting objects. By returning YES, we allow the window to be -// removed from the screen. -- (BOOL)windowShouldClose:(id)window { - m_webView = nil; - - // Try to make the window go away, but it may not when running layout - // tests due to the quirkyness of autorelease pools and having no main loop. - [window autorelease]; - - // clean ourselves up and do the work after clearing the stack of anything - // that might have the shell on it. - [self performSelectorOnMainThread:@selector(cleanup:) - withObject:window - waitUntilDone:NO]; - - return YES; -} - -// does the work of removing the window from our various bookkeeping lists -// and gets rid of the shell. -- (void)cleanup:(id)window { - TestShell::RemoveWindowFromList(window); - TestShell::DestroyAssociatedShell(window); - - [self release]; -} - -@end - -// Mac-specific stuff to do when the dtor is called. Nothing to do in our -// case. -void TestShell::PlatformCleanUp() { -} - -void TestShell::EnableUIControl(UIControl control, bool is_enabled) { - // TODO(darin): Implement me. -} - -// static -void TestShell::DestroyAssociatedShell(gfx::NativeWindow handle) { - WindowMap::iterator it = window_map_.Get().find(handle); - if (it != window_map_.Get().end()) { - // Break the view's association with its shell before deleting the shell. - TestShellWebView* web_view = - static_cast<TestShellWebView*>(it->second->m_webViewHost->view_handle()); - if ([web_view isKindOfClass:[TestShellWebView class]]) { - [web_view setShell:NULL]; - } - - delete it->second; - window_map_.Get().erase(it); - } else { - LOG(ERROR) << "Failed to find shell for window during destroy"; - } -} - -// static -void TestShell::PlatformShutdown() { - // for each window in the window list, release it and destroy its shell - for (WindowList::iterator it = TestShell::windowList()->begin(); - it != TestShell::windowList()->end(); - ++it) { - DestroyAssociatedShell(*it); - [*it release]; - } - // assert if we have anything left over, that would be bad. - DCHECK(window_map_.Get().empty()); - - // Dump the pasteboards we built up. - [DumpRenderTreePasteboard releaseLocalPasteboards]; -} - -// static -void TestShell::InitializeTestShell(bool layout_test_mode, - bool allow_external_pages) { - // This should move to a per-process platform-specific initialization function - // when one exists. - - window_list_ = new WindowList; - layout_test_mode_ = layout_test_mode; - allow_external_pages_ = allow_external_pages; - - web_prefs_ = new WebPreferences; - - // mmap the data pack which holds strings used by WebCore. This is only - // a fatal error if we're bundled, which means we might be running layout - // tests. This is a harmless failure for test_shell_tests. - g_resource_data_pack = new ui::DataPack(ui::SCALE_FACTOR_100P); - NSString *resource_path = - [base::mac::FrameworkBundle() pathForResource:@"test_shell" - ofType:@"pak"]; - base::FilePath resources_pak_path([resource_path fileSystemRepresentation]); - if (!g_resource_data_pack->LoadFromPath(resources_pak_path)) { - LOG(FATAL) << "failed to load test_shell.pak"; - } - - ResetWebPreferences(); - - // Load the Ahem font, which is used by layout tests. - NSString* ahem_path = [[base::mac::FrameworkBundle() resourcePath] - stringByAppendingPathComponent:@"AHEM____.TTF"]; - NSURL* ahem_path_url = [NSURL fileURLWithPath:ahem_path]; - CFErrorRef error; - if (!CTFontManagerRegisterFontsForURL((CFURLRef)ahem_path_url, - kCTFontManagerScopeProcess, &error)) { - DLOG(FATAL) << "CTFontManagerRegisterFontsForURL " - << [ahem_path fileSystemRepresentation] - << [[(NSError*)error description] UTF8String]; - } - - // Add <app bundle's parent dir>/plugins to the plugin path so we can load - // test plugins. - base::FilePath plugins_dir; - PathService::Get(base::DIR_EXE, &plugins_dir); - if (base::mac::AmIBundled()) { - plugins_dir = plugins_dir.AppendASCII("../../../plugins"); - } else { - plugins_dir = plugins_dir.AppendASCII("plugins"); - } - webkit::npapi::PluginList::Singleton()->AddExtraPluginDir(plugins_dir); -} - -NSButton* MakeTestButton(NSRect* rect, NSString* title, NSView* parent) { - NSButton* button = [[[NSButton alloc] initWithFrame:*rect] autorelease]; - [button setTitle:title]; - [button setBezelStyle:NSSmallSquareBezelStyle]; - [button setAutoresizingMask:(NSViewMaxXMargin | NSViewMinYMargin)]; - [parent addSubview:button]; - rect->origin.x += BUTTON_WIDTH; - return button; -} - -bool TestShell::Initialize(const GURL& starting_url) { - // Perform application initialization: - // send message to app controller? need to work this out - - // TODO(awalker): this is a straight recreation of windows test_shell.cc's - // window creation code--we should really pull this from the nib and grab - // references to the already-created subviews that way. - NSRect screen_rect = [[NSScreen mainScreen] visibleFrame]; - NSRect window_rect = { {0, screen_rect.size.height - kTestWindowHeight}, - {kTestWindowWidth, kTestWindowHeight} }; - m_mainWnd = [[NSWindow alloc] - initWithContentRect:window_rect - styleMask:(NSTitledWindowMask | - NSClosableWindowMask | - NSMiniaturizableWindowMask | - NSResizableWindowMask ) - backing:NSBackingStoreBuffered - defer:NO]; - [m_mainWnd setTitle:@"TestShell"]; - - // Add to our map - window_map_.Get()[m_mainWnd] = this; - - // Rely on the window delegate to clean us up rather than immediately - // releasing when the window gets closed. We use the delegate to do - // everything from the autorelease pool so the shell isn't on the stack - // during cleanup (ie, a window close from javascript). - [m_mainWnd setReleasedWhenClosed:NO]; - - // Create a webview. Note that |web_view| takes ownership of this shell so we - // will get cleaned up when it gets destroyed. - m_webViewHost.reset( - WebViewHost::Create([m_mainWnd contentView], - delegate_.get(), - 0, - *TestShell::web_prefs_)); - delegate_->RegisterDragDrop(); - TestShellWebView* web_view = - static_cast<TestShellWebView*>(m_webViewHost->view_handle()); - [web_view setShell:this]; - - // Create a window delegate to watch for when it's asked to go away. It will - // clean itself up so we don't need to hold a reference. - [m_mainWnd setDelegate:[[WindowDelegate alloc] initWithWebView:web_view]]; - - // create buttons - NSRect button_rect = [[m_mainWnd contentView] bounds]; - button_rect.origin.y = window_rect.size.height - URLBAR_HEIGHT + - (URLBAR_HEIGHT - BUTTON_HEIGHT) / 2; - button_rect.size.height = BUTTON_HEIGHT; - button_rect.origin.x += BUTTON_MARGIN; - button_rect.size.width = BUTTON_WIDTH; - - NSView* content = [m_mainWnd contentView]; - - NSButton* button = MakeTestButton(&button_rect, @"Back", content); - [button setTarget:web_view]; - [button setAction:@selector(goBack:)]; - - button = MakeTestButton(&button_rect, @"Forward", content); - [button setTarget:web_view]; - [button setAction:@selector(goForward:)]; - - // reload button - button = MakeTestButton(&button_rect, @"Reload", content); - [button setTarget:web_view]; - [button setAction:@selector(reload:)]; - - // stop button - button = MakeTestButton(&button_rect, @"Stop", content); - [button setTarget:web_view]; - [button setAction:@selector(stopLoading:)]; - - // text field for URL - button_rect.origin.x += BUTTON_MARGIN; - button_rect.size.width = [[m_mainWnd contentView] bounds].size.width - - button_rect.origin.x - BUTTON_MARGIN; - m_editWnd = [[NSTextField alloc] initWithFrame:button_rect]; - [[m_mainWnd contentView] addSubview:m_editWnd]; - [m_editWnd setAutoresizingMask:(NSViewWidthSizable | NSViewMinYMargin)]; - [m_editWnd setTarget:web_view]; - [m_editWnd setAction:@selector(takeURLStringValueFrom:)]; - [[m_editWnd cell] setWraps:NO]; - [[m_editWnd cell] setScrollable:YES]; - - // show the window - [m_mainWnd makeKeyAndOrderFront: nil]; - - // Load our initial content. - if (starting_url.is_valid()) - LoadURL(starting_url); - - if (IsSVGTestURL(starting_url)) { - SizeTo(kSVGTestWindowWidth, kSVGTestWindowHeight); - } else { - SizeToDefault(); - } - - return true; -} - -void TestShell::InteractiveSetFocus(WebWidgetHost* host, bool enable) { - if (enable) { - [[host->view_handle() window] makeKeyAndOrderFront:nil]; - } else { - // There is no way to resign key window status in Cocoa. Fake it by - // ordering the window out (transferring key status to another window) and - // then ordering the window back in, but without making it key. - [[host->view_handle() window] orderOut:nil]; - [[host->view_handle() window] orderFront:nil]; - } -} - -// static -void TestShell::DestroyWindow(gfx::NativeWindow windowHandle) { - // This code is like -cleanup: on our window delegate. This call needs to be - // able to force down a window for tests, so it closes down the window making - // sure it cleans up the window delegate and the test shells list of windows - // and map of windows to shells. - - TestShell::RemoveWindowFromList(windowHandle); - TestShell::DestroyAssociatedShell(windowHandle); - - id windowDelegate = [windowHandle delegate]; - DCHECK(windowDelegate); - [windowHandle setDelegate:nil]; - [windowDelegate release]; - - [windowHandle close]; - [windowHandle autorelease]; -} - -WebWidget* TestShell::CreatePopupWidget() { - DCHECK(!m_popupHost); - m_popupHost = WebWidgetHost::Create(webViewWnd(), popup_delegate_.get()); - - return m_popupHost->webwidget(); -} - -void TestShell::ClosePopup() { - // PostMessage(popupWnd(), WM_CLOSE, 0, 0); - m_popupHost = NULL; -} - -void TestShell::SizeTo(int width, int height) { - // WebViewHost::Create() sets the HTML content rect to start 32 pixels below - // the top of the window to account for the "toolbar". We need to match that - // here otherwise the HTML content area will be too short. - NSRect r = [m_mainWnd contentRectForFrameRect:[m_mainWnd frame]]; - r.size.width = width; - r.size.height = height + URLBAR_HEIGHT; - [m_mainWnd setFrame:[m_mainWnd frameRectForContentRect:r] display:YES]; -} - -void TestShell::ResizeSubViews() { - // handled by Cocoa for us -} - -/* static */ void TestShell::DumpAllBackForwardLists(base::string16* result) { - result->clear(); - for (WindowList::iterator iter = TestShell::windowList()->begin(); - iter != TestShell::windowList()->end(); iter++) { - NSWindow* window = *iter; - WindowMap::iterator it = window_map_.Get().find(window); - if (it != window_map_.Get().end()) - it->second->DumpBackForwardList(result); - else - LOG(ERROR) << "Failed to find shell for window during dump"; - } -} - -void TestShell::LoadURLForFrame(const GURL& url, - const base::string16& frame_name) { - if (!url.is_valid()) - return; - - if (IsSVGTestURL(url)) { - SizeTo(kSVGTestWindowWidth, kSVGTestWindowHeight); - } else { - // only resize back to the default when running tests - if (layout_test_mode()) - SizeToDefault(); - } - - navigation_controller_->LoadEntry( - new TestNavigationEntry(-1, url, frame_name)); -} - -bool TestShell::PromptForSaveFile(const wchar_t* prompt_title, - base::FilePath* result) -{ - NSSavePanel* save_panel = [NSSavePanel savePanel]; - - /* set up new attributes */ - [save_panel setAllowedFileTypes:@[@"txt"]]; - [save_panel setMessage: - [NSString stringWithUTF8String:WideToUTF8(prompt_title).c_str()]]; - - /* display the NSSavePanel */ - [save_panel setDirectoryURL:[NSURL fileURLWithPath:NSHomeDirectory()]]; - [save_panel setNameFieldStringValue:@""]; - if ([save_panel runModal] == NSFileHandlingPanelOKButton) { - *result = base::FilePath([[[save_panel URL] path] fileSystemRepresentation]); - return true; - } - return false; -} - -// static -std::string TestShell::RewriteLocalUrl(const std::string& url) { - // Convert file:///tmp/LayoutTests urls to the actual location on disk. - const char kPrefix[] = "file:///tmp/LayoutTests/"; - const int kPrefixLen = arraysize(kPrefix) - 1; - - std::string new_url(url); - if (url.compare(0, kPrefixLen, kPrefix, kPrefixLen) == 0) { - base::FilePath replace_path; - PathService::Get(base::DIR_SOURCE_ROOT, &replace_path); - replace_path = replace_path.Append( - "third_party/WebKit/LayoutTests/"); - new_url = std::string("file://") + replace_path.value() + - url.substr(kPrefixLen); - } - - return new_url; -} - -// static -void TestShell::ShowStartupDebuggingDialog() { - NSAlert* alert = [[[NSAlert alloc] init] autorelease]; - alert.messageText = @"Attach to me?"; - alert.informativeText = @"This would probably be a good time to attach your " - "debugger."; - [alert addButtonWithTitle:@"OK"]; - - [alert runModal]; -} - -base::StringPiece TestShell::ResourceProvider(int key) { - base::StringPiece res; - g_resource_data_pack->GetStringPiece(key, &res); - return res; -} - -//----------------------------------------------------------------------------- - -base::string16 TestShellWebKitInit::GetLocalizedString(int message_id) { - base::StringPiece res; - if (!g_resource_data_pack->GetStringPiece(message_id, &res)) { - LOG(FATAL) << "failed to load webkit string with id " << message_id; - } - - // Data packs hold strings as either UTF8 or UTF16. - base::string16 msg; - switch (g_resource_data_pack->GetTextEncodingType()) { - case ui::DataPack::UTF8: - msg = UTF8ToUTF16(res); - break; - case ui::DataPack::UTF16: - msg = base::string16(reinterpret_cast<const char16*>(res.data()), - res.length() / 2); - break; - case ui::DataPack::BINARY: - NOTREACHED(); - break; - } - - return msg; -} - -base::StringPiece TestShellWebKitInit::GetDataResource( - int resource_id, - ui::ScaleFactor scale_factor) { - switch (resource_id) { - case IDR_BROKENIMAGE: { - // Use webkit's broken image icon (16x16) - static std::string broken_image_data; - if (broken_image_data.empty()) { - base::FilePath path = GetResourcesFilePath(); - // In order to match WebKit's colors for the missing image, we have to - // use a PNG. The GIF doesn't have the color range needed to correctly - // match the TIFF they use in Safari. - path = path.AppendASCII("missingImage.png"); - bool success = file_util::ReadFileToString(path, &broken_image_data); - if (!success) { - LOG(FATAL) << "Failed reading: " << path.value(); - } - } - return broken_image_data; - } - case IDR_TEXTAREA_RESIZER: { - // Use webkit's text area resizer image. - static std::string resize_corner_data; - if (resize_corner_data.empty()) { - base::FilePath path = GetResourcesFilePath(); - path = path.AppendASCII("textAreaResizeCorner.png"); - bool success = file_util::ReadFileToString(path, &resize_corner_data); - if (!success) { - LOG(FATAL) << "Failed reading: " << path.value(); - } - } - return resize_corner_data; - } - - case IDR_SEARCH_CANCEL: - case IDR_SEARCH_CANCEL_PRESSED: - case IDR_SEARCH_MAGNIFIER: - case IDR_SEARCH_MAGNIFIER_RESULTS: - case IDR_INPUT_SPEECH: - case IDR_INPUT_SPEECH_RECORDING: - case IDR_INPUT_SPEECH_WAITING: - // TODO(flackr): Pass scale_factor to ResourceProvider. - return TestShell::ResourceProvider(resource_id); - - default: - break; - } - - return base::StringPiece(); -} - -namespace webkit_glue { - -bool DownloadUrl(const std::string& url, NSWindow* caller_window) { - return false; -} - -void DidLoadPlugin(const std::string& filename) { -} - -void DidUnloadPlugin(const std::string& filename) { -} - -} // namespace webkit_glue |