I made a simple browser with Swift last version and xcode 8.3.3.
I want to be able to enter in fullscreen when there is an html5 video (like on youtube).
I get "full screen is unavailable" on youtube right now.
Same problem with the old WebView... on iOS it work.
EDIT. Maybe it's just not possible. I tried to look at JavaFX WebView and WPF WebBrowser and they have the same limitation. Actually one guy was able to allow full screen for a youtube video on WPF WebBrowser but only by creating a full html page:
Playing youtube in full screen in WebBrowser control
And of course I cannot create a webpage for every video in a page (at least I don't know how, if you know please tell me).
ORIGINAL MESSAGE:
I made a simple browser with Swift last version and xcode 8.3.3.
Everything is working but I'm not able to activate plugins like I can do with the old WebView.
Since I'm on a mac I should be able to activate plugins (I understand that it's not possible on iOS) am I wrong?
Also (and here I got the same problem in the old WebView) there is no way to activate fullscreen for html5 videos (at least I don't know how).
#IBOutlet weak var webView: WKWebView!
let urlString = "http://myurl.com/"
self.webView.load(NSURLRequest(url: NSURL(string: urlString)! as URL) as URLRequest!)
self.webView.configuration.preferences.plugInsEnabled = true
This is the really basic code to get a basic browser working. But there is no option to enable plugin in the Interface Builder for WKWebView and I really don't know how to allow fullscreen for html5 videos (like youtube).
EDIT. Ok I finally found an answer for the plugin part:
self.webView.configuration.preferences.plugInsEnabled = true
really easy but it was difficult to understand where to find it I had to go here:
https://developer.apple.com/documentation/webkit/webpreferences
and take a guess...
Update for macOS 12.3
Starting on iOS 15.4 and macOS 12.3 WKPreferences has the new property isElementFullscreenEnabled. Now it is very simple:
myWebView.configuration.preferences.isElementFullscreenEnabled = true
Original answer (pre macOS 12.3)
Instead of using private APIs you can do this by changing the property with KVO in the configuration.
Using Swift 5:
let configuration = WKWebViewConfiguration()
configuration.preferences.setValue(true, forKey: "fullScreenEnabled")
let webView = WKWebView(frame: .zero, configuration: configuration)
Tested on macOS 10.15 and 11
To allow WKWebView to use fullscreen HTML you need to access private API's (see https://github.com/WebKit/webkit/blob/master/Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm#L232-L240) in WKPreferences. Since you're using Swift in your bridging header add:
#import <WebKit/WebKit.h>
#interface WKPreferences ()
-(void)_setFullScreenEnabled:(BOOL)fullScreenEnabled;
#end
And simply call it:
let webView = WKWebView(frame: view.frame)
webView.configuration.preferences._setFullScreenEnabled(true)
If you notice strange resizing of the web view once you exit fullscreen I found that this fixes the issue for me:
webView.autoresizingMask = [.width, .height]
view.addSubview(webView)
webView.translatesAutoresizingMaskIntoConstraints = false
webView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
webView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
Note: Since you're accessing private API this would be rejected on the Mac App Store.
The solution posted by #SoneeJohn was clear, but it involved using a bridging header. I'd never manually worked with Objective-C or modified private Swift frameworks before. I didn't know what keywords to use. And, the resources I found seemed more involved and focused on creating an original framework - not altering an existing framework. I don't know if this is the proper implementation, but it got full-screen mode to work in web view.
Steps
There are photos that reference each of the following steps in the next section.
Click your "Project" in XCode
Click "Add a target"
Click "Cocoa Framework"
Click "Next"
Enter a title into "Product Name"
Click "Finish"
Click "Add items" in "Linked Frameworks and Libraries"
Enter "WebKit" into the "Search"
Click "WebKit.framework"
Click "Add"
Click your "Project.h" file
Add the "Import" code from the solution
#import <WebKit/WebKit.h>
Add the "Full Screen" code from the solution
#interface WKPreferences ()
-(void)_setFullScreenEnabled:(BOOL)fullScreenEnabled;
#end
Import your "Project Framework" into your swift file
Implement the "Full Screen" code into your web view
webView.configuration.preferences._setFullScreenEnabled(true)
I had to change my user agent to Safari 11 for the full-screen mode to work properly.
webView.customUserAgent = """
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13) AppleWebKit/604.1.31 (KHTML, like Gecko) Version/11.0 Safari/604.1.31
"""
The answer is that there is no answer. No API right now on mac to get fullscreen html5. I tried to make the same app on windows and the current WebView of UWP is able to go fullscreen (the old WebBrowser of WPF is not able to go fullscreen).
I think the only way to get it, it's to submit a feedback to apple.
Related
Does anybody know, how to change the appearance of the title bar and/or toolbar of a simple & small one-window cocoa macOS application without accessing the Xcode or installing third party applications? It's for a screen recording video project, I want to do.
I know, that there are possibilities within the applications info.plist (for example changing the app title inside the top macOS Menu Bar) but I would like to be able to change the apps window title itself and/or colors and/or fonts inside the window title bar or toolbar if possible.
Opening the app in another container window or via terminal or Applescript and adding custom parameters or even an overlay in the right position to change the styling would be okay if this is possible?
Can somebody point me in the right direction?
Thank you very much!
in short: Nibs
Nib File Viewer works until Xcode 10
saving, recompiling if possible
good luck
I'm trying to create XCTestCase to test reordering in my outline view (in OS X app). When I use UI Test Recording feature, Xcode prints this:
window.outlines.staticTexts["<cell which I want to move>"].click()
I tried dragging the cell both inside or outside outline view, Xcode generates the same useless code.
Does anyone know how to test drag & drop correctly in Xcode 7?
Not sure if this is new, but in Xcode 7.2, if you look at the header for XCUIElement, there's a clickForDuration(thenDragToElement:) function for OS X. Seems to work for me with NSOutlineView.
This is from the header...
/*!
* Clicks and holds for a specified duration (generally long enough to start a drag operation) then drags
* to the other element.
*/
public func clickForDuration(duration: NSTimeInterval, thenDragToElement otherElement: XCUIElement)
With Xcode 9.4.1
Swift:
func press(forDuration duration: TimeInterval, thenDragTo otherElement: XCUIElement)
Example:
let ele: XCUIElement = XCUIApplication()!.otherElements.matching(identifier: "element_identifier").element(boundBy: 0)
ele.press(forDuration: <timeIntervalInSec>, thenDragTo: <destination_XCUIElement>)
Refer: API Doc
Same issue. No solution. Looks like accessibility does not support d-n-d, and Apple docs say: Provide alternatives for drag-and-drop operations.
The only thing I can suggest is to try checking the accessibility features of the code being tested. UI Testing needs to have accessibility information to be able to understand what is happening in the UI. See the Apple WWDC15 UI Testing video at about 39:30 into the video for an example of how to fix issues where UI recording can't properly generate code.
I am trying to customize user experience from the plugin I am working on, my goal is to provide a kiosk style using the options available in COCOA NSApplication, the code is like following:
// Hide the dock tile and the menu bar:
NSApplicationPresentationOptions options =
NSApplicationPresentationHideDock + NSApplicationPresentationHideMenuBar;
[NSApp setPresentationOptions:options];
I have tested this code using a normal cocoa application and it works fine but when I embed this code in a function inside a "Firebreath PlugIn" nothing happens although the firebreath builds correctly and the other functions I have works normally.
some ideas? this is about system security restrictions maybe?? if so how to enable it? I don't know why this doesn't work if other cocoa functions works fine.
I am developing over Mac OS X Lion with XCODE 4.2
My guess is that you can't get tot he NSApplication because you are in a different process; you might be able to create a fake one or something like that with a new NSWindow to make it work, but since you're in a different process from the browser there is no way to access the browser's NSApp or other similar objects.
When I was using Chrome to download something in Lion, a badge with downloading progress which dynamically updates itself is shown on my dock.
How may one go about achieving that?
I think you are looking for this piece of code:
[[[NSApplication sharedApplication] dockTile] setBadgeLabel:#"My String"];
Here you can find all the information you need (it's the NSDockTile Class Reference).
I want to develop a plugin with Safari. Now I wan to make a demo for add a button into it's MainWindow or menu into it's MenuBar. I have seen to Document WebKitPluginProgTopic and the sample:/Developer/Examples/Webkit/WebKitMoviePlugIn . But they didn't tell the full process of make a plugin with safari and how to add some menu or button in the safari window . Someone can give me some advice or simple code to resolve this problem, Thank you very much!
The plug-in architecture isn't thought for enhancing the browser but to support special media formats like flash or quicktime. The problem is that the plugin is only loaded when the corresponding media type is found.
Agile Web Solutions have found a way to load the plug-in all sites in 1Password and insert code into Safari. They've documented it in their blog. For other means of injecting code have a look at this question: InputManager plug-ins in Snow Leopard.
I haven't got any experience in building menus programmatically, but it should work like this:
NSMenu *newMenu = [[[NSMenu alloc] initWithTitle:#"MyMenu"] autorelease];
NSMenu *mainMenu = [NSApp mainMenu];
[mainMenu addItem:newMenu];
Changing the windows isn't that easy. Your best guess is probably [NSApp orderedWindows], which exists only for scripting purposes, but should be usefull to your task.