dev 49
TRANSCRIPT
![Page 1: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/1.jpg)
Customizing BrowserField2 Advanced Components
Marcilio Mendonca
DEV49
September 29, 2010
![Page 2: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/2.jpg)
Session Surveys
• Remember to complete your breakout session evaluation in one of two ways:
– On your BlackBerry® smartphone – use the DEVCON 2010 mobile guide, from Pyxis
– Login to My Scheduler at one of the Cyber Zone locations or on your PC
![Page 3: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/3.jpg)
Why should Icare about
BrowserField2?
I seem to be happy with
BrowserField1 ...
What’s the Point?
![Page 4: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/4.jpg)
Source Code Snippet from a Real BrowserField1 Application
// Dealing with Low Level ComponentsrenderingSession = RenderingSession.getNewInstance();renderingSession.getRenderingOptions().setProperty(...)...browserContent = renderingSession.getBrowserContent(…)browserContent.finishLoading();
// Managing ThreadsPrimaryResourceFetchThread thread = new PrimaryResourceFetchThread();...// Managing Resource ConnectivityHttpConnection connection = Utilities.makeConnection(url, head, null);...// Managing HTTP Cookies_cookieManager.storeCookies(cookie, urlHost);...// Managing Page HistorygetHistoryPosition(BrowserContent browserField);...// Others: handling HTTP redirects, errors, UI issues
![Page 5: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/5.jpg)
Source Code Snippet from a Real BrowserField1 Application
// Dealing with Low Level ComponentsrenderingSession = RenderingSession.getNewInstance();renderingSession.getRenderingOptions().setProperty(...)...browserContent = renderingSession.getBrowserContent(…)browserContent.finishLoading();
// Managing ThreadsPrimaryResourceFetchThread thread = new PrimaryResourceFetchThread();...// Managing Resource ConnectivityHttpConnection connection = Utilities.makeConnection(url, head, null);...// Managing HTTP Cookies_cookieManager.storeCookies(cookie, urlHost);...// Managing Page HistorygetHistoryPosition(BrowserContent browserField);...// Others: handling HTTP redirects, errors, UI issues
Low Productivity!
- 1,279 lines of code- Too much focus on low-level “stuff”
![Page 6: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/6.jpg)
BrowserField1 Application Rewritten as a BrowserField2 Application
...Screen screen = new MainScreen();
// Manage the Specifics of Your BrowserFieldBrowserFieldConfig config = new BrowserFieldConfig();
// Create the BrowserFieldBrowserField browserField = new BrowserField(config);
// Request Web Content and Show it on the Screenscreen.add(browserField);Application.getApplication().pushScreen(screen);browserField.requestContent(“http://www.blackberry.com”);...
![Page 7: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/7.jpg)
BrowserField1 Application Rewritten as a BrowserField2 Application
...Screen screen = new MainScreen();
// Manage the Specifics of Your BrowserFieldBrowserFieldConfig config = new BrowserFieldConfig();
// Create the BrowserFieldBrowserField browserField = new BrowserField(config);
// Request Web Content and Show it on the Screenscreen.add(browserField);Application.getApplication().pushScreen(screen);browserField.requestContent(“http://www.blackberry.com”);...
HIGH Productivity!
- 30 lines of code- Focus on what matters: Your business!
![Page 8: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/8.jpg)
BrowserField2I can easily customize it!
BrowserField1
Make Up Your Mind!
![Page 9: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/9.jpg)
Agenda
1. Quick Overview of BrowserField2 API
2. Our Demo: BF2CUSTOM
3. Customizing BrowserField2 Advanced Components– BrowserFieldController
– BrowserFieldConnectionManager
– BrowserFieldErrorHandler
– BrowserField Debug API
4. BrowserField2 in BlackBerry OS 6.0
5. Summary
![Page 10: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/10.jpg)
Goal of This Presentation
To illustrate how advanced BrowserField2 components can be
customized to suit a variety of reported BF2 developer’s needs
![Page 11: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/11.jpg)
Quick Overview of BrowserField2
BrowserField 1 API- RenderingApplication- RenderingSession- BrowserContent
BrowserField 2 API
• The BrowserField 2 API (a.k.a. BF2) is a Public API release along with BlackBerry OS 5.0 that allows a developer to embed Web content into a BlackBerry Java application
• Advantages of BF2 over BF1: high productivity, strong integration with the Javascriptengine, built-in functionality (e.g., connectivity, cookie management, navigation history)
![Page 12: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/12.jpg)
![Page 13: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/13.jpg)
![Page 14: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/14.jpg)
BF2CUSTOM – OUR DEMOA BrowserField2 application that illustrates how to
customize BF2 advanced components
![Page 15: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/15.jpg)
BF2CUSTOM
![Page 16: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/16.jpg)
BF2CUSTOM – App Entry Point
// BF2 customization applicationpublic class BF2Custom extends UiApplication{
/*** Application Entry point*/ public static void main(String[] args) {
BF2Custom theApp = new BF2Custom(); theApp.enterEventDispatcher();
}
/*** Creates a new BF2Custon object*/public BF2Custom() {
// Push a screen onto the UI stack for rendering.pushScreen(new BF2CustomScreen());
} }
![Page 17: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/17.jpg)
BF2CUSTOM – BF2CustomScreen
// BF2 customization application screenfinal class BF2CustomScreen extends MainScreen {
BrowserField _browserField;
public BF2CustomScreen() {// Create the BrowserField_browserField = createBrowserField();
// Our Customizations will go here...
}
public void createBrowserField(){BrowserFieldConfig config = new BrowserFieldConfig();config.setProperty(...);return new BrowserField(config);
}// a couple of inner classes for customization go here
}
![Page 18: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/18.jpg)
What’s Being Covered?
BF2CUSTOM DEMO
BrowserFieldController- Overview- Extending the Default Controller- Creating a New Resource Handler
BrowserFieldConnectionManager- Overview - Specifying a New ConnectionFactory
BrowserFieldErrorHandler- Overview- Customizing Error Handling Display
BrowserFieldDebugger- Overview- On-Device Debugger Sample- Desktop Debugger Sample
![Page 19: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/19.jpg)
BrowserFieldControllerHandling navigation and resource requests
![Page 20: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/20.jpg)
BrowserFieldControllerHandling Navigation and Resource Requests
BrowserFieldController
BrowserField
Your BF2 Application
requestContent(“www.blackberry.com”)
handleNavigationRequest()
<<default implementation>>
ProtocolController
Navigation Request = Page Request (e.g., html)Resource Request = Page Resource Request (e.g., image, css, js)
YourBrowserFieldControler
either one
![Page 21: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/21.jpg)
ProtocolControllerExtending the Default Controller
• Requirement: BF2CUSTOM must enforce that only domains authorized by the user can be accessed• Solution: Extend ProtocolController and check if domain is accessible; if not, ask user to authorize or decline access
User has Authorized
![Page 22: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/22.jpg)
ProtocolControllerExtending the Default Controller
class MyProtocolController extends ProtocolController {
// Navigation Requestspublic void handleNavigationRequest(BrowserFieldRequest request) { boolean accessGrantedByUser = true;String domain = URI.create(request.getURL()).getHost();if ( !trustedDomains.contains(domain) && userHasAuthorizedAccess(domain) ){
trustedDomains.addElement(domain); } else { accessGrantedByUser = false; }if ( accessGrantedByUser ) {
super.handleNavigationRequest(request);}
}// Resource Requestspublic InputConnection handleResourceRequest(BrowserFieldRequest request) {...
}}// Attach new controller to the BrowserFieldProtocolController myController = new MyProtocolController(browserField);browserField.getConfig().setProperty(
BrowserFieldConfig.CONTROLLER, myController);
![Page 23: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/23.jpg)
ProtocolControllerUsing Handlers to Address Different Protocols
BrowserFieldController
<<default implementation>>
ProtocolController
TransportResourceHandler
DeviceResourceHandler
ModuleResourceHandler
http, https
file, data
local
your protocol
YourHandler- handleNavigation()- handleResource()
BrowserFieldNavigationRequestHandler
BrowserFieldResourceRequestHandler
BrowserFieldResourceHandler- handleNavigation()- handleResource()
![Page 24: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/24.jpg)
ProtocolControllerCreating a New Request Handler
• Requirement: BF2CUSTOM must handle the “shared:///” protocol to load resources from a “shared space”
• Solution: Create a New Navigation/Resource Request Handler
<html><head><title>BF2Custom</title></head><body><img src=“http://www.rim.com/img1.jpg”/><img src=“shared:///img2.jpg”/><a href=“shared:///bf2custom_index.html”>Click here</a>
</body></html>
![Page 25: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/25.jpg)
ProtocolControllerCreating a New Request Handler
class SharedResourcesHandler implements BrowserFieldNavigationRequestHandler, BrowserFieldResourceRequestHandler {
public void handleNavigation(BrowserFieldRequest request) {InputConnection connection = handleResource(request);if ( connection != null ) {
browserField.displayContent(connection, "shared:///");}
}
public InputConnection handleResource(BrowserFieldRequest request) { return getInputConnectionForSharedSpace(request);
}
public InputConnection getInputConnectionForSharedSpace(request) { ... // Helper method
}}
// Attach the handler to your controllerSharedResourcesHandler handler = new SharedResourcesHandler(browserField);myController.setNavigationRequestHandler("shared", handler);myController.setResourceRequestHandler("shared", handler);
![Page 26: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/26.jpg)
BrowserFieldControllerOther Possible Customization Scenarios
Cases where customizing the BrowserFieldController might be worth it:
• Controlling access to resources• Supporting new resource location protocols • Http basic authentication (401)• Caching• Logging & statistics
![Page 27: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/27.jpg)
BrowserFieldConnectionManagerConnecting to network resources
![Page 28: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/28.jpg)
BrowserFieldConnectionManagerConnecting to Resources via HTTP(S)
BrowserFieldConnectionManagerDefaultBrowserFieldConnectionManager
BrowserFieldControllerProtocolController/TransportResourceHandler 1. http://www.blackberry.com/bbtorch.png
2. makeRequest()
Internet
3. Connects to the resourcevia WIFI, BIS, MDS, cellular, …
4. InputConnection
![Page 29: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/29.jpg)
BrowserFieldConnectionManagerConnecting to Resources via HTTP(S)
BrowserFieldConnectionManager- InputConnection makeRequest(BrowserFieldRequest request)
<<default controller>>
ProtocolController
TransportResourceHandlerhttp, https
<<net.rim.device.api.io.transport>>
ConnectionFactory- setTimeLimit()- setAttemptsLimit()- setPreferredTransportTypes()- setDisallowedTransportTypes()
WIFI, MDS, BIS, TCP_CELLULAR, …
<<net.rim.device.api.io.transport>>
(Your)ConnectionFactory
BIS, WIFI,TCP_CELLULAR, MDS…
cookies, debugger
YourBrowserFieldConnectionManager- InputConnection makeRequest(BrowserFieldRequest request)
cookies, debugger
<<internal default implementation>>
DefaultBrowserFieldConnectionManager
![Page 30: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/30.jpg)
BrowserFieldConnectionManagerSpecifying Your Own ConnectionFactory
• Requirement: BF2CUSTOM needs to enforce a particular connection order, disallow certain types of connections and specify timeout values
• Solution: Create a ConnectionFactory and attach it to your BrowserField
// Create the factorypublic ConnectionFactory createCustomConnectionFactory() {
ConnectionFactory factory = new ConnectionFactory();// Set timeout parametersfactory.setAttemptsLimit(1);factory.setTimeLimit(5000);factory.setTimeoutSupported(true);// Specify the order of connectionsfactory.setPreferredTransportTypes( new int[] {
TransportInfo.TRANSPORT_TCP_WIFI, TransportInfo.TRANSPORT_BIS_B, TransportInfo.TRANSPORT_MDS, TransportInfo.TRANSPORT_WAP} );
// Disallow cellular connectionsfactory.setDisallowedTransportTypes( new int[]
{TransportInfo.TRANSPORT_TCP_CELLULAR} );}// Attach the factory to the BrowserFieldConnectionFactory factory = createCustomConnectionFactory();browserField.getConfig().setProperty(
BrowserFieldConfig.CONNECTION_FACTORY,factory);
![Page 31: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/31.jpg)
BrowserFieldErrorHandlerHandling BrowserField2 unexpected situations
![Page 32: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/32.jpg)
BrowserFieldErrorHandlerHandling BrowserField2 Unexpected Situations
BrowserFieldErrorHandler- displayContentError()- requestContentError()- resourceRequestError()- navigationRequestError()
Uses BrowserField to display errors
YourBrowserFieldErrorHandler- displayContentError()- requestContentError()- resourceRequestError()- navigationRequestError
(E.g., uses a Dialog to display errors)
BrowserField
![Page 33: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/33.jpg)
BrowserFieldErrorHandlerCustomizing BrowserField Error Handling
• Requirement: BF2CUSTOM needs to use a Dialog to notify users about BrowserField errors and to additionally save errors in a log file
• Solution: Extend BrowserFieldErrorHandler and attach it to your BrowserField
// Create the ErrorHandler classpublic class MyBrowserFieldErrorHandler extends BrowserFieldErrorHandler {public void displayContentError(String url, String errorMessage) {String error = "Error: (url=" + url + "): " + t.getMessage();Dialog.ask(Dialog.D_OK, error);logMessage(“BrowserFieldError: “ + error );
}public void displayContentError(String url, InputConnection connection, Throwable t) { displayContentError(url, t.getMessage());
}public void requestContentError(BrowserFieldRequest request, Throwable t){displayContentError(request.getURL(), t.getMessage());
}}// Attach the Error Handler to the BrowserFieldBrowserFieldErrorHandler eHandler = new MyBrowserFieldErrorHandler();browserField.getConfig().setProperty(BrowserFieldConfig.ERROR_HANDLER,eHandler);
![Page 34: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/34.jpg)
THE BrowserField2 DEBUG APIDebugging JavaScript in BrowserField2
![Page 35: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/35.jpg)
The BrowserField Debug APIDebugging BrowserField Scripts
BrowserFieldScript- getName()- getSourceLines()- setBreakpoint()- clearBreakpoint()
BrowserField
YourBrowserFieldDebugger- hitBreakpoint()- handleStep()- registerScript()- reportException()- notifyCompileError()- xmlHttpRequestRequest()BrowserFieldScriptObject
- getField()- enumerateFields()- getObjectClass()
BrowserFieldDebugContext- resume()- stepInto()- eval()- getFunctionName()- getLineNumber()
net.rim.device.api.browser.field2.debug
BrowserFieldDebugger
![Page 36: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/36.jpg)
The BrowserField Debug APIImplementing Your Own Debugger
public class MYBrowserFieldDebugger extends BrowserFieldDebugger {public void registerScript(BrowserFieldScript script) {
_scripts.add(script)}public void registerInlineScript(BrowserFieldScript script) {
_inlineScripts.add(script)}public void hitBreakpoint( BrowserFieldDebugContext context ) {
_currentContext = context;ScriptResource resource = findScriptResource( context );ScriptResourceScreen screen = new ScriptResourceScreen(resource);screen.setActive( context.getLineNumber() );screen.display( _contentScreen );
}public void stepOver() {
_currentContext.stepOver();}public Object eval(String expression) {
return _currentContext.eval(expression);}
}
// Attach the Debugger to the BrowserFieldbrowserField.setDebugger(new MyBrowserFieldDebugger());
![Page 37: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/37.jpg)
The BrowserField Debug APIOn-Device BrowserField Debugger Application
![Page 38: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/38.jpg)
The BrowserField Debug APIDesktop BrowserField Debugger Application
BrowserField
![Page 39: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/39.jpg)
BrowserField2 IN BLACKBERRY OS 6.0What’s new?
![Page 40: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/40.jpg)
BrowserField2 in BlackBerry OS 6.0What’s New?
• High-quality HTML rendering backed up by Webkit– 10x faster layout time, strong support for HTML5, 100% acid3
• Improved touch screen experience – pinch to zoom, text reflow
• State-of-the-Art Javascript Engine – 3.2x faster, more reliable
• The API’s interface did not change except for discontinuing the Debug API
Webkit
BlackBerryBrowser
BrowserFieldApplication
![Page 41: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/41.jpg)
Curious About Upcoming Debug Capabilities?
• Please refer to session DEV37 – Your Best Options for Web Development Tools
![Page 42: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/42.jpg)
Summary
1. Quick Overview of BrowserField2 API
2. Our Demo: BF2CUSTOM– Customizing advanced BF2 components
3. Customizing BrowserField2 Advanced Components– BrowserFieldController
– BrowserFieldConnectionManager
– BrowserFieldErrorHandler
– BrowserField Debug API
4. BrowserField2 in BlackBerry OS 6.0– High-quality HTML rendering, improved touch screen, state-of-the-
art Javascript Engine, same API but Debug API was discontinued
![Page 43: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/43.jpg)
Switch Now to BrowserField2and raise your
(and your team's) Productivity
to a new level!
Final Message
![Page 44: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/44.jpg)
For More Information
• Other sessions– DEV08: Creating Hybrid Applications – Building Web
Applications Using Java Components
– DEV37: Your Best Options for Web Development Tools
• BlackBerry DevZone website:– http://www.blackberry.com/developers
– Download BlackBerry development tools and simulators
– Developer Resource Center
– Web Community Forum
• Development community:– Developers Blog: http://devblog.blackberry.com
– Twitter: http://twitter.com/BlackBerryDev
![Page 45: Dev 49](https://reader034.vdocuments.site/reader034/viewer/2022051513/5477c6065806b524198b466d/html5/thumbnails/45.jpg)
Thank You
Marcilio Mendonca
DEV49
September 29, 2010