blob: 826556d53c8935eb80642b5f3da63eb1b2bff873 [file] [log] [blame]
/*
* Copyright (C) 2016-2019 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "config.h"
#import "WebAutomationSession.h"
#if PLATFORM(COCOA)
#import <wtf/FileSystem.h>
#if PLATFORM(IOS_FAMILY)
#include <ImageIO/CGImageDestination.h>
#include <MobileCoreServices/UTCoreTypes.h>
#include <WebCore/KeyEventCodesIOS.h>
#endif
namespace WebKit {
using namespace WebCore;
Optional<String> WebAutomationSession::platformGetBase64EncodedPNGData(const ShareableBitmap::Handle& imageDataHandle)
{
auto bitmap = ShareableBitmap::create(imageDataHandle, SharedMemory::Protection::ReadOnly);
if (!bitmap)
return WTF::nullopt;
RetainPtr<CGImageRef> cgImage = bitmap->makeCGImage();
RetainPtr<NSMutableData> imageData = adoptNS([[NSMutableData alloc] init]);
RetainPtr<CGImageDestinationRef> destination = adoptCF(CGImageDestinationCreateWithData((CFMutableDataRef)imageData.get(), kUTTypePNG, 1, 0));
if (!destination)
return WTF::nullopt;
CGImageDestinationAddImage(destination.get(), cgImage.get(), 0);
CGImageDestinationFinalize(destination.get());
return String([imageData base64EncodedStringWithOptions:0]);
}
Optional<String> WebAutomationSession::platformGenerateLocalFilePathForRemoteFile(const String& remoteFilePath, const String& base64EncodedFileContents)
{
RetainPtr<NSData> fileContents = adoptNS([[NSData alloc] initWithBase64EncodedString:base64EncodedFileContents options:0]);
if (!fileContents) {
LOG_ERROR("WebAutomationSession: unable to decode base64-encoded file contents.");
return WTF::nullopt;
}
NSString *temporaryDirectory = FileSystem::createTemporaryDirectory(@"WebDriver");
NSURL *remoteFile = [NSURL fileURLWithPath:remoteFilePath isDirectory:NO];
NSString *localFilePath = [temporaryDirectory stringByAppendingPathComponent:remoteFile.lastPathComponent];
NSError *fileWriteError;
[fileContents.get() writeToFile:localFilePath options:NSDataWritingAtomic error:&fileWriteError];
if (fileWriteError) {
LOG_ERROR("WebAutomationSession: Error writing image data to temporary file: %@", fileWriteError);
return WTF::nullopt;
}
return String(localFilePath);
}
Optional<unichar> WebAutomationSession::charCodeForVirtualKey(Inspector::Protocol::Automation::VirtualKey key) const
{
switch (key) {
case Inspector::Protocol::Automation::VirtualKey::Shift:
case Inspector::Protocol::Automation::VirtualKey::Control:
case Inspector::Protocol::Automation::VirtualKey::Alternate:
case Inspector::Protocol::Automation::VirtualKey::Meta:
case Inspector::Protocol::Automation::VirtualKey::Command:
return WTF::nullopt;
case Inspector::Protocol::Automation::VirtualKey::Help:
return NSHelpFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Backspace:
return NSBackspaceCharacter;
case Inspector::Protocol::Automation::VirtualKey::Tab:
return NSTabCharacter;
case Inspector::Protocol::Automation::VirtualKey::Clear:
return NSClearLineFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Enter:
return NSEnterCharacter;
case Inspector::Protocol::Automation::VirtualKey::Pause:
return NSPauseFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Cancel:
// The 'cancel' key does not exist on Apple keyboards and has no keycode.
// According to the internet its functionality is similar to 'Escape'.
case Inspector::Protocol::Automation::VirtualKey::Escape:
return 0x1B;
case Inspector::Protocol::Automation::VirtualKey::PageUp:
return NSPageUpFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::PageDown:
return NSPageDownFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::End:
return NSEndFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Home:
return NSHomeFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::LeftArrow:
return NSLeftArrowFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::UpArrow:
return NSUpArrowFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::RightArrow:
return NSRightArrowFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::DownArrow:
return NSDownArrowFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Insert:
return NSInsertFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Delete:
return NSDeleteFunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Space:
return ' ';
case Inspector::Protocol::Automation::VirtualKey::Semicolon:
return ';';
case Inspector::Protocol::Automation::VirtualKey::Equals:
return '=';
case Inspector::Protocol::Automation::VirtualKey::Return:
return NSCarriageReturnCharacter;
case Inspector::Protocol::Automation::VirtualKey::NumberPad0:
return '0';
case Inspector::Protocol::Automation::VirtualKey::NumberPad1:
return '1';
case Inspector::Protocol::Automation::VirtualKey::NumberPad2:
return '2';
case Inspector::Protocol::Automation::VirtualKey::NumberPad3:
return '3';
case Inspector::Protocol::Automation::VirtualKey::NumberPad4:
return '4';
case Inspector::Protocol::Automation::VirtualKey::NumberPad5:
return '5';
case Inspector::Protocol::Automation::VirtualKey::NumberPad6:
return '6';
case Inspector::Protocol::Automation::VirtualKey::NumberPad7:
return '7';
case Inspector::Protocol::Automation::VirtualKey::NumberPad8:
return '8';
case Inspector::Protocol::Automation::VirtualKey::NumberPad9:
return '9';
case Inspector::Protocol::Automation::VirtualKey::NumberPadMultiply:
return '*';
case Inspector::Protocol::Automation::VirtualKey::NumberPadAdd:
return '+';
case Inspector::Protocol::Automation::VirtualKey::NumberPadSubtract:
return '-';
case Inspector::Protocol::Automation::VirtualKey::NumberPadSeparator:
// The 'Separator' key is only present on a few international keyboards.
// It is usually mapped to the same character as Decimal ('.' or ',').
case Inspector::Protocol::Automation::VirtualKey::NumberPadDecimal:
return '.';
case Inspector::Protocol::Automation::VirtualKey::NumberPadDivide:
return '/';
case Inspector::Protocol::Automation::VirtualKey::Function1:
return NSF1FunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Function2:
return NSF2FunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Function3:
return NSF3FunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Function4:
return NSF4FunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Function5:
return NSF5FunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Function6:
return NSF6FunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Function7:
return NSF7FunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Function8:
return NSF8FunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Function9:
return NSF9FunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Function10:
return NSF10FunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Function11:
return NSF11FunctionKey;
case Inspector::Protocol::Automation::VirtualKey::Function12:
return NSF12FunctionKey;
default:
return WTF::nullopt;
}
}
Optional<unichar> WebAutomationSession::charCodeIgnoringModifiersForVirtualKey(Inspector::Protocol::Automation::VirtualKey key) const
{
switch (key) {
case Inspector::Protocol::Automation::VirtualKey::NumberPadMultiply:
return '8';
case Inspector::Protocol::Automation::VirtualKey::NumberPadAdd:
return '=';
default:
return charCodeForVirtualKey(key);
}
}
} // namespace WebKit
#endif // PLATFORM(COCOA)