From 52d374bc9aa173e138dae047158e997a90697d38 Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Fri, 11 Oct 2013 14:49:52 +0000 Subject: [PATCH] Remove the CEF1 trunk folder. Any future development will be in the 1453 branch. git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@1454 5089003a-bbd8-11dd-ad1f-f1f9622dbc98 --- cef1/AUTHORS.txt | 27 - cef1/CHROMIUM_BUILD_COMPATIBILITY.txt | 21 - cef1/DEPS | 7 - cef1/LICENSE.txt | 29 - cef1/VERSION | 1 - cef1/cef.gyp | 861 ----- cef1/cef.gypi | 30 - cef1/cef_create_projects.bat | 2 - cef1/cef_create_projects.sh | 2 - cef1/cef_paths.gypi | 345 -- cef1/cef_paths2.gypi | 177 - cef1/include/capi/cef_app_capi.h | 137 - cef1/include/capi/cef_base_capi.h | 85 - cef1/include/capi/cef_browser_capi.h | 330 -- cef1/include/capi/cef_client_capi.h | 161 - cef1/include/capi/cef_command_line_capi.h | 169 - cef1/include/capi/cef_content_filter_capi.h | 80 - cef1/include/capi/cef_cookie_capi.h | 158 - cef1/include/capi/cef_display_handler_capi.h | 123 - cef1/include/capi/cef_dom_capi.h | 441 --- cef1/include/capi/cef_download_handler_capi.h | 77 - cef1/include/capi/cef_drag_data_capi.h | 136 - cef1/include/capi/cef_drag_handler_capi.h | 84 - cef1/include/capi/cef_find_handler_capi.h | 77 - cef1/include/capi/cef_focus_handler_capi.h | 93 - cef1/include/capi/cef_frame_capi.h | 217 -- cef1/include/capi/cef_geolocation_capi.h | 80 - .../capi/cef_geolocation_handler_capi.h | 104 - cef1/include/capi/cef_jsdialog_handler_capi.h | 92 - cef1/include/capi/cef_keyboard_handler_capi.h | 82 - .../include/capi/cef_life_span_handler_capi.h | 114 - cef1/include/capi/cef_load_handler_capi.h | 99 - cef1/include/capi/cef_menu_handler_capi.h | 88 - cef1/include/capi/cef_nplugin_capi.h | 49 - cef1/include/capi/cef_origin_whitelist_capi.h | 105 - .../capi/cef_permission_handler_capi.h | 72 - cef1/include/capi/cef_print_handler_capi.h | 96 - cef1/include/capi/cef_proxy_handler_capi.h | 69 - cef1/include/capi/cef_render_handler_capi.h | 120 - cef1/include/capi/cef_request_capi.h | 261 -- cef1/include/capi/cef_request_handler_capi.h | 159 - .../capi/cef_resource_bundle_handler_capi.h | 95 - cef1/include/capi/cef_response_capi.h | 119 - cef1/include/capi/cef_scheme_capi.h | 240 -- cef1/include/capi/cef_stream_capi.h | 224 -- cef1/include/capi/cef_task_capi.h | 96 - cef1/include/capi/cef_url_capi.h | 67 - cef1/include/capi/cef_v8_capi.h | 815 ----- .../include/capi/cef_v8context_handler_capi.h | 92 - cef1/include/capi/cef_web_plugin_capi.h | 110 - cef1/include/capi/cef_web_urlrequest_capi.h | 143 - cef1/include/capi/cef_xml_reader_capi.h | 278 -- cef1/include/capi/cef_zip_reader_capi.h | 148 - cef1/include/capi/cef_zoom_handler_capi.h | 83 - cef1/include/cef_app.h | 139 - cef1/include/cef_application_mac.h | 120 - cef1/include/cef_base.h | 154 - cef1/include/cef_browser.h | 344 -- cef1/include/cef_client.h | 196 -- cef1/include/cef_command_line.h | 160 - cef1/include/cef_content_filter.h | 68 - cef1/include/cef_cookie.h | 147 - cef1/include/cef_display_handler.h | 124 - cef1/include/cef_dom.h | 429 --- cef1/include/cef_download_handler.h | 65 - cef1/include/cef_drag_data.h | 120 - cef1/include/cef_drag_handler.h | 77 - cef1/include/cef_find_handler.h | 68 - cef1/include/cef_focus_handler.h | 88 - cef1/include/cef_frame.h | 220 -- cef1/include/cef_geolocation.h | 66 - cef1/include/cef_geolocation_handler.h | 94 - cef1/include/cef_jsdialog_handler.h | 87 - cef1/include/cef_keyboard_handler.h | 76 - cef1/include/cef_life_span_handler.h | 105 - cef1/include/cef_load_handler.h | 94 - cef1/include/cef_menu_handler.h | 80 - cef1/include/cef_nplugin.h | 119 - cef1/include/cef_origin_whitelist.h | 102 - cef1/include/cef_permission_handler.h | 64 - cef1/include/cef_print_handler.h | 91 - cef1/include/cef_proxy_handler.h | 57 - cef1/include/cef_render_handler.h | 121 - cef1/include/cef_request.h | 255 -- cef1/include/cef_request_handler.h | 171 - cef1/include/cef_resource_bundle_handler.h | 82 - cef1/include/cef_response.h | 104 - cef1/include/cef_runnable.h | 346 -- cef1/include/cef_scheme.h | 231 -- cef1/include/cef_stream.h | 210 -- cef1/include/cef_task.h | 89 - cef1/include/cef_url.h | 60 - cef1/include/cef_v8.h | 851 ----- cef1/include/cef_v8context_handler.h | 85 - cef1/include/cef_web_plugin.h | 97 - cef1/include/cef_web_urlrequest.h | 135 - cef1/include/cef_xml_reader.h | 268 -- cef1/include/cef_zip_reader.h | 141 - cef1/include/cef_zoom_handler.h | 72 - cef1/include/internal/cef_build.h | 129 - cef1/include/internal/cef_export.h | 55 - cef1/include/internal/cef_linux.h | 149 - cef1/include/internal/cef_mac.h | 178 - cef1/include/internal/cef_nplugin_types.h | 90 - cef1/include/internal/cef_ptr.h | 199 -- cef1/include/internal/cef_string.h | 113 - cef1/include/internal/cef_string_list.h | 88 - cef1/include/internal/cef_string_map.h | 97 - cef1/include/internal/cef_string_multimap.h | 105 - cef1/include/internal/cef_string_types.h | 204 -- cef1/include/internal/cef_string_wrappers.h | 712 ---- cef1/include/internal/cef_time.h | 88 - cef1/include/internal/cef_tuple.h | 1082 ------- cef1/include/internal/cef_types.h | 1205 ------- cef1/include/internal/cef_types_linux.h | 88 - cef1/include/internal/cef_types_mac.h | 116 - cef1/include/internal/cef_types_win.h | 110 - cef1/include/internal/cef_types_wrappers.h | 686 ---- cef1/include/internal/cef_win.h | 186 -- cef1/include/wrapper/cef_byte_read_handler.h | 88 - cef1/include/wrapper/cef_xml_object.h | 188 -- cef1/include/wrapper/cef_zip_archive.h | 132 - cef1/libcef/browser_appcache_system.cc | 464 --- cef1/libcef/browser_appcache_system.h | 137 - cef1/libcef/browser_database_system.cc | 313 -- cef1/libcef/browser_database_system.h | 101 - cef1/libcef/browser_devtools_agent.cc | 127 - cef1/libcef/browser_devtools_agent.h | 65 - cef1/libcef/browser_devtools_callargs.cc | 27 - cef1/libcef/browser_devtools_callargs.h | 29 - cef1/libcef/browser_devtools_client.cc | 87 - cef1/libcef/browser_devtools_client.h | 55 - .../libcef/browser_devtools_scheme_handler.cc | 131 - cef1/libcef/browser_devtools_scheme_handler.h | 16 - cef1/libcef/browser_dom_storage_system.cc | 308 -- cef1/libcef/browser_dom_storage_system.h | 80 - cef1/libcef/browser_drag_delegate_win.cc | 371 --- cef1/libcef/browser_drag_delegate_win.h | 101 - cef1/libcef/browser_file_system.cc | 461 --- cef1/libcef/browser_file_system.h | 166 - cef1/libcef/browser_file_writer.cc | 203 -- cef1/libcef/browser_file_writer.h | 53 - cef1/libcef/browser_impl.cc | 1716 ---------- cef1/libcef/browser_impl.h | 508 --- cef1/libcef/browser_impl_gtk.cc | 239 -- cef1/libcef/browser_impl_mac.mm | 215 -- cef1/libcef/browser_impl_win.cc | 594 ---- cef1/libcef/browser_navigation_controller.cc | 255 -- cef1/libcef/browser_navigation_controller.h | 211 -- cef1/libcef/browser_network_delegate.cc | 123 - cef1/libcef/browser_network_delegate.h | 65 - cef1/libcef/browser_request_context.cc | 332 -- cef1/libcef/browser_request_context.h | 68 - cef1/libcef/browser_request_context_proxy.cc | 39 - cef1/libcef/browser_request_context_proxy.h | 28 - cef1/libcef/browser_resource_loader_bridge.cc | 1176 ------- cef1/libcef/browser_resource_loader_bridge.h | 40 - cef1/libcef/browser_settings.cc | 156 - cef1/libcef/browser_settings.h | 18 - cef1/libcef/browser_socket_stream_bridge.cc | 239 -- cef1/libcef/browser_socket_stream_bridge.h | 36 - cef1/libcef/browser_thread_stub.cc | 84 - cef1/libcef/browser_tooltip_mac.h | 13 - cef1/libcef/browser_webblobregistry_impl.cc | 128 - cef1/libcef/browser_webblobregistry_impl.h | 50 - cef1/libcef/browser_webcookiejar_impl.cc | 139 - cef1/libcef/browser_webcookiejar_impl.h | 36 - cef1/libcef/browser_webkit_glue.cc | 158 - cef1/libcef/browser_webkit_glue.h | 57 - cef1/libcef/browser_webkit_glue_win.cc | 15 - cef1/libcef/browser_webkit_init.cc | 298 -- cef1/libcef/browser_webkit_init.h | 110 - cef1/libcef/browser_webview_delegate.cc | 1341 -------- cef1/libcef/browser_webview_delegate.h | 399 --- cef1/libcef/browser_webview_delegate_gtk.cc | 573 ---- cef1/libcef/browser_webview_delegate_mac.mm | 610 ---- cef1/libcef/browser_webview_delegate_win.cc | 952 ------ cef1/libcef/browser_webview_mac.h | 107 - cef1/libcef/browser_webview_mac.mm | 852 ----- cef1/libcef/browser_zoom_map.cc | 35 - cef1/libcef/browser_zoom_map.h | 43 - cef1/libcef/cef_context.cc | 615 ---- cef1/libcef/cef_context.h | 155 - cef1/libcef/cef_process.cc | 133 - cef1/libcef/cef_process.h | 122 - cef1/libcef/cef_process_io_thread.cc | 78 - cef1/libcef/cef_process_io_thread.h | 46 - cef1/libcef/cef_process_sub_thread.cc | 31 - cef1/libcef/cef_process_sub_thread.h | 37 - cef1/libcef/cef_process_ui_thread.cc | 257 -- cef1/libcef/cef_process_ui_thread.h | 62 - cef1/libcef/cef_process_ui_thread_gtk.cc | 13 - cef1/libcef/cef_process_ui_thread_mac.mm | 30 - cef1/libcef/cef_process_ui_thread_win.cc | 54 - cef1/libcef/cef_string_list.cc | 58 - cef1/libcef/cef_string_map.cc | 92 - cef1/libcef/cef_string_multimap.cc | 116 - cef1/libcef/cef_string_types.cc | 269 -- cef1/libcef/cef_thread.cc | 284 -- cef1/libcef/cef_thread.h | 197 -- cef1/libcef/cef_time.cc | 93 - cef1/libcef/cef_time_util.h | 16 - cef1/libcef/command_line_impl.cc | 115 - cef1/libcef/cookie_manager_impl.cc | 287 -- cef1/libcef/cookie_manager_impl.h | 41 - cef1/libcef/cookie_store_proxy.cc | 90 - cef1/libcef/cookie_store_proxy.h | 44 - cef1/libcef/dom_document_impl.cc | 262 -- cef1/libcef/dom_document_impl.h | 65 - cef1/libcef/dom_event_impl.cc | 156 - cef1/libcef/dom_event_impl.h | 42 - cef1/libcef/dom_node_impl.cc | 460 --- cef1/libcef/dom_node_impl.h | 62 - cef1/libcef/download_util.cc | 191 -- cef1/libcef/download_util.h | 30 - cef1/libcef/drag_data_impl.cc | 63 - cef1/libcef/drag_data_impl.h | 37 - cef1/libcef/drag_download_file.cc | 138 - cef1/libcef/drag_download_file.h | 92 - cef1/libcef/drag_download_util.cc | 114 - cef1/libcef/drag_download_util.h | 67 - cef1/libcef/external_popup_menu_mac.h | 38 - cef1/libcef/external_popup_menu_mac.mm | 90 - cef1/libcef/external_protocol_handler.h | 23 - cef1/libcef/external_protocol_handler_gtk.cc | 17 - cef1/libcef/external_protocol_handler_mac.mm | 17 - cef1/libcef/external_protocol_handler_win.cc | 53 - cef1/libcef/geolocation_client.cc | 355 -- cef1/libcef/geolocation_client.h | 96 - cef1/libcef/geolocation_impl.cc | 83 - cef1/libcef/http_header_utils.cc | 47 - cef1/libcef/http_header_utils.h | 37 - cef1/libcef/nplugin_impl.cc | 79 - cef1/libcef/origin_whitelist_impl.cc | 102 - cef1/libcef/printing/print_settings.cc | 266 -- cef1/libcef/printing/print_settings.h | 180 -- cef1/libcef/printing/win_printing_context.cc | 606 ---- cef1/libcef/printing/win_printing_context.h | 151 - cef1/libcef/request_impl.cc | 614 ---- cef1/libcef/request_impl.h | 136 - cef1/libcef/response_impl.cc | 115 - cef1/libcef/response_impl.h | 48 - cef1/libcef/scheme_impl.cc | 775 ----- cef1/libcef/scheme_registrar_impl.cc | 77 - cef1/libcef/scheme_registrar_impl.h | 53 - cef1/libcef/simple_clipboard_impl.cc | 111 - cef1/libcef/simple_clipboard_impl.h | 47 - cef1/libcef/sqlite_diagnostics_stub.cc | 20 - cef1/libcef/stream_impl.cc | 309 -- cef1/libcef/stream_impl.h | 154 - cef1/libcef/task_impl.cc | 49 - cef1/libcef/tracker.h | 129 - cef1/libcef/url_impl.cc | 68 - cef1/libcef/v8_impl.cc | 1739 ---------- cef1/libcef/v8_impl.h | 300 -- cef1/libcef/web_drag_source_gtk.cc | 415 --- cef1/libcef/web_drag_source_gtk.h | 109 - cef1/libcef/web_drag_source_mac.h | 91 - cef1/libcef/web_drag_source_mac.mm | 426 --- cef1/libcef/web_drag_source_win.cc | 100 - cef1/libcef/web_drag_source_win.h | 58 - cef1/libcef/web_drag_utils_gtk.cc | 42 - cef1/libcef/web_drag_utils_gtk.h | 23 - cef1/libcef/web_drag_utils_mac.h | 37 - cef1/libcef/web_drag_utils_mac.mm | 109 - cef1/libcef/web_drag_utils_win.cc | 61 - cef1/libcef/web_drag_utils_win.h | 22 - cef1/libcef/web_drop_target_gtk.cc | 317 -- cef1/libcef/web_drop_target_gtk.h | 95 - cef1/libcef/web_drop_target_mac.h | 69 - cef1/libcef/web_drop_target_mac.mm | 263 -- cef1/libcef/web_drop_target_win.cc | 187 -- cef1/libcef/web_drop_target_win.h | 69 - cef1/libcef/web_plugin_impl.cc | 105 - cef1/libcef/web_urlrequest_impl.cc | 304 -- cef1/libcef/web_urlrequest_impl.h | 44 - cef1/libcef/webview_host.cc | 19 - cef1/libcef/webview_host.h | 84 - cef1/libcef/webview_host_gtk.cc | 70 - cef1/libcef/webview_host_mac.mm | 97 - cef1/libcef/webview_host_win.cc | 100 - cef1/libcef/webwidget_host.cc | 222 -- cef1/libcef/webwidget_host.h | 291 -- cef1/libcef/webwidget_host_gtk.cc | 460 --- cef1/libcef/webwidget_host_mac.mm | 569 ---- cef1/libcef/webwidget_host_win.cc | 1014 ------ cef1/libcef/xml_reader_impl.cc | 446 --- cef1/libcef/xml_reader_impl.h | 73 - cef1/libcef/zip_reader_impl.cc | 280 -- cef1/libcef/zip_reader_impl.h | 55 - cef1/libcef_dll/cef_logging.h | 22 - cef1/libcef_dll/cpptoc/app_cpptoc.cc | 83 - cef1/libcef_dll/cpptoc/app_cpptoc.h | 36 - cef1/libcef_dll/cpptoc/base_cpptoc.h | 146 - cef1/libcef_dll/cpptoc/browser_cpptoc.cc | 772 ----- cef1/libcef_dll/cpptoc/browser_cpptoc.h | 38 - cef1/libcef_dll/cpptoc/client_cpptoc.cc | 317 -- cef1/libcef_dll/cpptoc/client_cpptoc.h | 36 - cef1/libcef_dll/cpptoc/command_line_cpptoc.cc | 316 -- cef1/libcef_dll/cpptoc/command_line_cpptoc.h | 37 - .../cpptoc/content_filter_cpptoc.cc | 108 - .../libcef_dll/cpptoc/content_filter_cpptoc.h | 37 - .../cpptoc/cookie_manager_cpptoc.cc | 200 -- .../libcef_dll/cpptoc/cookie_manager_cpptoc.h | 37 - .../cpptoc/cookie_visitor_cpptoc.cc | 70 - .../libcef_dll/cpptoc/cookie_visitor_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/cpptoc.h | 160 - .../cpptoc/display_handler_cpptoc.cc | 233 -- .../cpptoc/display_handler_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/domdocument_cpptoc.cc | 303 -- cef1/libcef_dll/cpptoc/domdocument_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/domevent_cpptoc.cc | 159 - cef1/libcef_dll/cpptoc/domevent_cpptoc.h | 36 - .../cpptoc/domevent_listener_cpptoc.cc | 49 - .../cpptoc/domevent_listener_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/domnode_cpptoc.cc | 479 --- cef1/libcef_dll/cpptoc/domnode_cpptoc.h | 36 - cef1/libcef_dll/cpptoc/domvisitor_cpptoc.cc | 48 - cef1/libcef_dll/cpptoc/domvisitor_cpptoc.h | 36 - .../cpptoc/download_handler_cpptoc.cc | 65 - .../cpptoc/download_handler_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/drag_data_cpptoc.cc | 216 -- cef1/libcef_dll/cpptoc/drag_data_cpptoc.h | 36 - cef1/libcef_dll/cpptoc/drag_handler_cpptoc.cc | 87 - cef1/libcef_dll/cpptoc/drag_handler_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/find_handler_cpptoc.cc | 62 - cef1/libcef_dll/cpptoc/find_handler_cpptoc.h | 37 - .../libcef_dll/cpptoc/focus_handler_cpptoc.cc | 97 - cef1/libcef_dll/cpptoc/focus_handler_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/frame_cpptoc.cc | 415 --- cef1/libcef_dll/cpptoc/frame_cpptoc.h | 40 - .../cpptoc/geolocation_callback_cpptoc.cc | 45 - .../cpptoc/geolocation_callback_cpptoc.h | 37 - .../cpptoc/geolocation_handler_cpptoc.cc | 91 - .../cpptoc/geolocation_handler_cpptoc.h | 37 - .../cpptoc/get_geolocation_callback_cpptoc.cc | 57 - .../cpptoc/get_geolocation_callback_cpptoc.h | 37 - .../cpptoc/jsdialog_handler_cpptoc.cc | 152 - .../cpptoc/jsdialog_handler_cpptoc.h | 37 - .../cpptoc/keyboard_handler_cpptoc.cc | 59 - .../cpptoc/keyboard_handler_cpptoc.h | 37 - .../cpptoc/life_span_handler_cpptoc.cc | 191 -- .../cpptoc/life_span_handler_cpptoc.h | 39 - cef1/libcef_dll/cpptoc/load_handler_cpptoc.cc | 120 - cef1/libcef_dll/cpptoc/load_handler_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/menu_handler_cpptoc.cc | 110 - cef1/libcef_dll/cpptoc/menu_handler_cpptoc.h | 37 - .../cpptoc/permission_handler_cpptoc.cc | 67 - .../cpptoc/permission_handler_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/post_data_cpptoc.cc | 148 - cef1/libcef_dll/cpptoc/post_data_cpptoc.h | 36 - .../cpptoc/post_data_element_cpptoc.cc | 165 - .../cpptoc/post_data_element_cpptoc.h | 37 - .../libcef_dll/cpptoc/print_handler_cpptoc.cc | 164 - cef1/libcef_dll/cpptoc/print_handler_cpptoc.h | 37 - .../libcef_dll/cpptoc/proxy_handler_cpptoc.cc | 63 - cef1/libcef_dll/cpptoc/proxy_handler_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/read_handler_cpptoc.cc | 100 - cef1/libcef_dll/cpptoc/read_handler_cpptoc.h | 37 - .../cpptoc/render_handler_cpptoc.cc | 250 -- .../libcef_dll/cpptoc/render_handler_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/request_cpptoc.cc | 295 -- cef1/libcef_dll/cpptoc/request_cpptoc.h | 36 - .../cpptoc/request_handler_cpptoc.cc | 396 --- .../cpptoc/request_handler_cpptoc.h | 37 - .../cpptoc/resource_bundle_handler_cpptoc.cc | 98 - .../cpptoc/resource_bundle_handler_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/response_cpptoc.cc | 196 -- cef1/libcef_dll/cpptoc/response_cpptoc.h | 36 - .../cpptoc/scheme_handler_callback_cpptoc.cc | 70 - .../cpptoc/scheme_handler_callback_cpptoc.h | 37 - .../cpptoc/scheme_handler_cpptoc.cc | 150 - .../libcef_dll/cpptoc/scheme_handler_cpptoc.h | 37 - .../cpptoc/scheme_handler_factory_cpptoc.cc | 64 - .../cpptoc/scheme_handler_factory_cpptoc.h | 37 - .../cpptoc/scheme_registrar_cpptoc.cc | 55 - .../cpptoc/scheme_registrar_cpptoc.h | 37 - .../libcef_dll/cpptoc/stream_reader_cpptoc.cc | 157 - cef1/libcef_dll/cpptoc/stream_reader_cpptoc.h | 37 - .../libcef_dll/cpptoc/stream_writer_cpptoc.cc | 139 - cef1/libcef_dll/cpptoc/stream_writer_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/task_cpptoc.cc | 42 - cef1/libcef_dll/cpptoc/task_cpptoc.h | 36 - cef1/libcef_dll/cpptoc/v8accessor_cpptoc.cc | 126 - cef1/libcef_dll/cpptoc/v8accessor_cpptoc.h | 36 - cef1/libcef_dll/cpptoc/v8context_cpptoc.cc | 243 -- cef1/libcef_dll/cpptoc/v8context_cpptoc.h | 36 - .../cpptoc/v8context_handler_cpptoc.cc | 134 - .../cpptoc/v8context_handler_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/v8exception_cpptoc.cc | 154 - cef1/libcef_dll/cpptoc/v8exception_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/v8handler_cpptoc.cc | 99 - cef1/libcef_dll/cpptoc/v8handler_cpptoc.h | 36 - .../libcef_dll/cpptoc/v8stack_frame_cpptoc.cc | 157 - cef1/libcef_dll/cpptoc/v8stack_frame_cpptoc.h | 37 - .../libcef_dll/cpptoc/v8stack_trace_cpptoc.cc | 94 - cef1/libcef_dll/cpptoc/v8stack_trace_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/v8value_cpptoc.cc | 973 ------ cef1/libcef_dll/cpptoc/v8value_cpptoc.h | 36 - .../cpptoc/web_plugin_info_cpptoc.cc | 94 - .../cpptoc/web_plugin_info_cpptoc.h | 37 - .../cpptoc/web_urlrequest_client_cpptoc.cc | 174 - .../cpptoc/web_urlrequest_client_cpptoc.h | 37 - .../cpptoc/web_urlrequest_cpptoc.cc | 86 - .../libcef_dll/cpptoc/web_urlrequest_cpptoc.h | 37 - .../libcef_dll/cpptoc/write_handler_cpptoc.cc | 101 - cef1/libcef_dll/cpptoc/write_handler_cpptoc.h | 37 - cef1/libcef_dll/cpptoc/xml_reader_cpptoc.cc | 558 ---- cef1/libcef_dll/cpptoc/xml_reader_cpptoc.h | 36 - cef1/libcef_dll/cpptoc/zip_reader_cpptoc.cc | 249 -- cef1/libcef_dll/cpptoc/zip_reader_cpptoc.h | 36 - cef1/libcef_dll/cpptoc/zoom_handler_cpptoc.cc | 97 - cef1/libcef_dll/cpptoc/zoom_handler_cpptoc.h | 37 - cef1/libcef_dll/ctocpp/app_ctocpp.cc | 69 - cef1/libcef_dll/ctocpp/app_ctocpp.h | 44 - cef1/libcef_dll/ctocpp/base_ctocpp.h | 98 - cef1/libcef_dll/ctocpp/browser_ctocpp.cc | 591 ---- cef1/libcef_dll/ctocpp/browser_ctocpp.h | 87 - cef1/libcef_dll/ctocpp/client_ctocpp.cc | 248 -- cef1/libcef_dll/ctocpp/client_ctocpp.h | 55 - cef1/libcef_dll/ctocpp/command_line_ctocpp.cc | 292 -- cef1/libcef_dll/ctocpp/command_line_ctocpp.h | 56 - .../ctocpp/content_filter_ctocpp.cc | 84 - .../libcef_dll/ctocpp/content_filter_ctocpp.h | 44 - .../ctocpp/cookie_manager_ctocpp.cc | 175 - .../libcef_dll/ctocpp/cookie_manager_ctocpp.h | 52 - .../ctocpp/cookie_visitor_ctocpp.cc | 47 - .../libcef_dll/ctocpp/cookie_visitor_ctocpp.h | 43 - cef1/libcef_dll/ctocpp/ctocpp.h | 113 - .../ctocpp/display_handler_ctocpp.cc | 210 -- .../ctocpp/display_handler_ctocpp.h | 58 - cef1/libcef_dll/ctocpp/domdocument_ctocpp.cc | 255 -- cef1/libcef_dll/ctocpp/domdocument_ctocpp.h | 57 - cef1/libcef_dll/ctocpp/domevent_ctocpp.cc | 131 - cef1/libcef_dll/ctocpp/domevent_ctocpp.h | 47 - .../ctocpp/domevent_listener_ctocpp.cc | 40 - .../ctocpp/domevent_listener_ctocpp.h | 42 - cef1/libcef_dll/ctocpp/domnode_ctocpp.cc | 423 --- cef1/libcef_dll/ctocpp/domnode_ctocpp.h | 66 - cef1/libcef_dll/ctocpp/domvisitor_ctocpp.cc | 40 - cef1/libcef_dll/ctocpp/domvisitor_ctocpp.h | 40 - .../ctocpp/download_handler_ctocpp.cc | 53 - .../ctocpp/download_handler_ctocpp.h | 43 - cef1/libcef_dll/ctocpp/drag_data_ctocpp.cc | 195 -- cef1/libcef_dll/ctocpp/drag_data_ctocpp.h | 51 - cef1/libcef_dll/ctocpp/drag_handler_ctocpp.cc | 77 - cef1/libcef_dll/ctocpp/drag_handler_ctocpp.h | 45 - cef1/libcef_dll/ctocpp/find_handler_ctocpp.cc | 47 - cef1/libcef_dll/ctocpp/find_handler_ctocpp.h | 44 - .../libcef_dll/ctocpp/focus_handler_ctocpp.cc | 85 - cef1/libcef_dll/ctocpp/focus_handler_ctocpp.h | 46 - cef1/libcef_dll/ctocpp/frame_ctocpp.cc | 368 --- cef1/libcef_dll/ctocpp/frame_ctocpp.h | 71 - .../ctocpp/geolocation_callback_ctocpp.cc | 34 - .../ctocpp/geolocation_callback_ctocpp.h | 42 - .../ctocpp/geolocation_handler_ctocpp.cc | 78 - .../ctocpp/geolocation_handler_ctocpp.h | 46 - .../ctocpp/get_geolocation_callback_ctocpp.cc | 36 - .../ctocpp/get_geolocation_callback_ctocpp.h | 42 - .../ctocpp/jsdialog_handler_ctocpp.cc | 123 - .../ctocpp/jsdialog_handler_ctocpp.h | 50 - .../ctocpp/keyboard_handler_ctocpp.cc | 50 - .../ctocpp/keyboard_handler_ctocpp.h | 44 - .../ctocpp/life_span_handler_ctocpp.cc | 138 - .../ctocpp/life_span_handler_ctocpp.h | 51 - cef1/libcef_dll/ctocpp/load_handler_ctocpp.cc | 103 - cef1/libcef_dll/ctocpp/load_handler_ctocpp.h | 48 - cef1/libcef_dll/ctocpp/menu_handler_ctocpp.cc | 85 - cef1/libcef_dll/ctocpp/menu_handler_ctocpp.h | 47 - .../ctocpp/permission_handler_ctocpp.cc | 56 - .../ctocpp/permission_handler_ctocpp.h | 43 - cef1/libcef_dll/ctocpp/post_data_ctocpp.cc | 136 - cef1/libcef_dll/ctocpp/post_data_ctocpp.h | 44 - .../ctocpp/post_data_element_ctocpp.cc | 140 - .../ctocpp/post_data_element_ctocpp.h | 48 - .../libcef_dll/ctocpp/print_handler_ctocpp.cc | 94 - cef1/libcef_dll/ctocpp/print_handler_ctocpp.h | 49 - .../libcef_dll/ctocpp/proxy_handler_ctocpp.cc | 41 - cef1/libcef_dll/ctocpp/proxy_handler_ctocpp.h | 43 - cef1/libcef_dll/ctocpp/read_handler_ctocpp.cc | 85 - cef1/libcef_dll/ctocpp/read_handler_ctocpp.h | 45 - .../ctocpp/render_handler_ctocpp.cc | 186 -- .../libcef_dll/ctocpp/render_handler_ctocpp.h | 54 - cef1/libcef_dll/ctocpp/request_ctocpp.cc | 264 -- cef1/libcef_dll/ctocpp/request_ctocpp.h | 53 - .../ctocpp/request_handler_ctocpp.cc | 320 -- .../ctocpp/request_handler_ctocpp.h | 64 - .../ctocpp/resource_bundle_handler_ctocpp.cc | 56 - .../ctocpp/resource_bundle_handler_ctocpp.h | 44 - cef1/libcef_dll/ctocpp/response_ctocpp.cc | 176 - cef1/libcef_dll/ctocpp/response_ctocpp.h | 48 - .../ctocpp/scheme_handler_callback_ctocpp.cc | 53 - .../ctocpp/scheme_handler_callback_ctocpp.h | 44 - .../ctocpp/scheme_handler_ctocpp.cc | 107 - .../libcef_dll/ctocpp/scheme_handler_ctocpp.h | 48 - .../ctocpp/scheme_handler_factory_ctocpp.cc | 54 - .../ctocpp/scheme_handler_factory_ctocpp.h | 43 - .../ctocpp/scheme_registrar_ctocpp.cc | 46 - .../ctocpp/scheme_registrar_ctocpp.h | 43 - .../libcef_dll/ctocpp/stream_reader_ctocpp.cc | 141 - cef1/libcef_dll/ctocpp/stream_reader_ctocpp.h | 45 - .../libcef_dll/ctocpp/stream_writer_ctocpp.cc | 123 - cef1/libcef_dll/ctocpp/stream_writer_ctocpp.h | 45 - cef1/libcef_dll/ctocpp/task_ctocpp.cc | 33 - cef1/libcef_dll/ctocpp/task_ctocpp.h | 40 - cef1/libcef_dll/ctocpp/v8accessor_ctocpp.cc | 99 - cef1/libcef_dll/ctocpp/v8accessor_ctocpp.h | 43 - cef1/libcef_dll/ctocpp/v8context_ctocpp.cc | 207 -- cef1/libcef_dll/ctocpp/v8context_ctocpp.h | 48 - .../ctocpp/v8context_handler_ctocpp.cc | 121 - .../ctocpp/v8context_handler_ctocpp.h | 49 - cef1/libcef_dll/ctocpp/v8exception_ctocpp.cc | 133 - cef1/libcef_dll/ctocpp/v8exception_ctocpp.h | 49 - cef1/libcef_dll/ctocpp/v8handler_ctocpp.cc | 84 - cef1/libcef_dll/ctocpp/v8handler_ctocpp.h | 42 - .../libcef_dll/ctocpp/v8stack_frame_ctocpp.cc | 134 - cef1/libcef_dll/ctocpp/v8stack_frame_ctocpp.h | 49 - .../libcef_dll/ctocpp/v8stack_trace_ctocpp.cc | 78 - cef1/libcef_dll/ctocpp/v8stack_trace_ctocpp.h | 44 - cef1/libcef_dll/ctocpp/v8value_ctocpp.cc | 874 ----- cef1/libcef_dll/ctocpp/v8value_ctocpp.h | 89 - .../ctocpp/web_plugin_info_ctocpp.cc | 83 - .../ctocpp/web_plugin_info_ctocpp.h | 45 - .../ctocpp/web_urlrequest_client_ctocpp.cc | 155 - .../ctocpp/web_urlrequest_client_ctocpp.h | 54 - .../ctocpp/web_urlrequest_ctocpp.cc | 73 - .../libcef_dll/ctocpp/web_urlrequest_ctocpp.h | 43 - .../libcef_dll/ctocpp/write_handler_ctocpp.cc | 85 - cef1/libcef_dll/ctocpp/write_handler_ctocpp.h | 45 - cef1/libcef_dll/ctocpp/xml_reader_ctocpp.cc | 501 --- cef1/libcef_dll/ctocpp/xml_reader_ctocpp.h | 70 - cef1/libcef_dll/ctocpp/zip_reader_ctocpp.cc | 220 -- cef1/libcef_dll/ctocpp/zip_reader_ctocpp.h | 52 - cef1/libcef_dll/ctocpp/zoom_handler_ctocpp.cc | 76 - cef1/libcef_dll/ctocpp/zoom_handler_ctocpp.h | 45 - cef1/libcef_dll/libcef_dll.cc | 491 --- cef1/libcef_dll/libcef_dll.rc | 122 - cef1/libcef_dll/libcef_dll2.cc | 21 - cef1/libcef_dll/resource.h | 23 - cef1/libcef_dll/transfer_util.cpp | 72 - cef1/libcef_dll/transfer_util.h | 37 - .../wrapper/cef_byte_read_handler.cc | 64 - cef1/libcef_dll/wrapper/cef_xml_object.cc | 456 --- cef1/libcef_dll/wrapper/cef_zip_archive.cc | 162 - cef1/libcef_dll/wrapper/libcef_dll_wrapper.cc | 461 --- .../libcef_dll/wrapper/libcef_dll_wrapper2.cc | 10 - cef1/patch/README.txt | 20 - cef1/patch/patch.cfg | 40 - cef1/patch/patches/build.patch | 27 - cef1/patch/patches/gyp_331.patch | 22 - cef1/patch/patches/message_loop_443.patch | 13 - cef1/patch/patches/spi_webcore_364.patch | 39 - cef1/patch/patches/webkit_933.patch | 13 - cef1/patch/patches/zlib.patch | 13 - cef1/tests/cefclient/binding_test.cpp | 159 - cef1/tests/cefclient/binding_test.h | 22 - cef1/tests/cefclient/cefclient.cpp | 633 ---- cef1/tests/cefclient/cefclient.h | 54 - cef1/tests/cefclient/cefclient.rc | 184 -- cef1/tests/cefclient/cefclient_gtk.cpp | 375 --- cef1/tests/cefclient/cefclient_mac.mm | 525 --- cef1/tests/cefclient/cefclient_switches.cpp | 96 - cef1/tests/cefclient/cefclient_switches.h | 95 - cef1/tests/cefclient/cefclient_win.cpp | 732 ----- cef1/tests/cefclient/client_handler.cpp | 472 --- cef1/tests/cefclient/client_handler.h | 259 -- cef1/tests/cefclient/client_handler_gtk.cpp | 71 - cef1/tests/cefclient/client_handler_mac.mm | 96 - cef1/tests/cefclient/client_handler_win.cpp | 95 - cef1/tests/cefclient/client_popup_handler.cpp | 30 - cef1/tests/cefclient/client_popup_handler.h | 39 - cef1/tests/cefclient/clientplugin.cpp | 185 -- cef1/tests/cefclient/clientplugin.h | 21 - cef1/tests/cefclient/download_handler.cpp | 218 -- cef1/tests/cefclient/download_handler.h | 27 - cef1/tests/cefclient/extension_test.cpp | 97 - cef1/tests/cefclient/extension_test.h | 16 - .../mac/English.lproj/InfoPlist.strings | 3 - .../cefclient/mac/English.lproj/MainMenu.xib | 2880 ----------------- cef1/tests/cefclient/mac/Info.plist | 28 - cef1/tests/cefclient/mac/cefclient.icns | Bin 55080 -> 0 bytes cef1/tests/cefclient/osrenderer.cpp | 249 -- cef1/tests/cefclient/osrenderer.h | 57 - cef1/tests/cefclient/osrplugin.cpp | 703 ---- cef1/tests/cefclient/osrplugin.h | 33 - cef1/tests/cefclient/osrplugin_test.cpp | 137 - cef1/tests/cefclient/osrplugin_test.h | 21 - cef1/tests/cefclient/osrtest_mac.h | 15 - cef1/tests/cefclient/osrtest_mac.mm | 739 ----- cef1/tests/cefclient/performance_test.cpp | 98 - cef1/tests/cefclient/performance_test.h | 23 - cef1/tests/cefclient/performance_test_setup.h | 99 - .../cefclient/performance_test_tests.cpp | 328 -- cef1/tests/cefclient/plugin_test.cpp | 27 - cef1/tests/cefclient/plugin_test.h | 16 - cef1/tests/cefclient/res/binding.html | 22 - cef1/tests/cefclient/res/cefclient.ico | Bin 23558 -> 0 bytes cef1/tests/cefclient/res/dialogs.html | 43 - cef1/tests/cefclient/res/domaccess.html | 13 - cef1/tests/cefclient/res/extension.html | 15 - cef1/tests/cefclient/res/localstorage.html | 24 - cef1/tests/cefclient/res/logo.png | Bin 19879 -> 0 bytes cef1/tests/cefclient/res/logoball.png | Bin 7181 -> 0 bytes cef1/tests/cefclient/res/modaldialog.html | 78 - cef1/tests/cefclient/res/modalmain.html | 58 - cef1/tests/cefclient/res/osrplugin.html | 55 - cef1/tests/cefclient/res/osrtest.html | 41 - cef1/tests/cefclient/res/other_tests.html | 31 - cef1/tests/cefclient/res/performance.html | 293 -- cef1/tests/cefclient/res/plugin.html | 10 - cef1/tests/cefclient/res/small.ico | Bin 23558 -> 0 bytes cef1/tests/cefclient/res/transparency.html | 63 - cef1/tests/cefclient/res/uiplugin.html | 57 - cef1/tests/cefclient/res/xmlhttprequest.html | 19 - cef1/tests/cefclient/resource.h | 79 - cef1/tests/cefclient/resource_util.h | 23 - cef1/tests/cefclient/resource_util_linux.cpp | 29 - cef1/tests/cefclient/resource_util_mac.mm | 59 - cef1/tests/cefclient/resource_util_posix.cpp | 59 - cef1/tests/cefclient/resource_util_win.cpp | 96 - cef1/tests/cefclient/scheme_test.cpp | 157 - cef1/tests/cefclient/scheme_test.h | 21 - cef1/tests/cefclient/string_util.cpp | 74 - cef1/tests/cefclient/string_util.h | 21 - cef1/tests/cefclient/uiplugin.cpp | 288 -- cef1/tests/cefclient/uiplugin.h | 30 - cef1/tests/cefclient/uiplugin_test.cpp | 106 - cef1/tests/cefclient/uiplugin_test.h | 16 - cef1/tests/cefclient/util.h | 37 - cef1/tests/unittests/command_line_unittest.cc | 112 - .../unittests/content_filter_unittest.cc | 219 -- cef1/tests/unittests/cookie_unittest.cc | 961 ------ cef1/tests/unittests/dom_unittest.cc | 260 -- cef1/tests/unittests/geolocation_unittest.cc | 203 -- .../mac/English.lproj/InfoPlist.strings | 3 - .../unittests/mac/English.lproj/MainMenu.xib | 2880 ----------------- cef1/tests/unittests/mac/Info.plist | 28 - cef1/tests/unittests/mac/unittests.icns | Bin 55080 -> 0 bytes cef1/tests/unittests/navigation_unittest.cc | 619 ---- cef1/tests/unittests/request_unittest.cc | 278 -- cef1/tests/unittests/run_all_unittests.cc | 127 - cef1/tests/unittests/run_all_unittests_mac.mm | 45 - .../unittests/scheme_handler_unittest.cc | 971 ------ cef1/tests/unittests/stream_unittest.cc | 363 --- cef1/tests/unittests/string_unittest.cc | 340 -- cef1/tests/unittests/test_handler.cc | 114 - cef1/tests/unittests/test_handler.h | 130 - cef1/tests/unittests/test_suite.cc | 204 -- cef1/tests/unittests/test_suite.h | 37 - cef1/tests/unittests/url_unittest.cc | 183 -- cef1/tests/unittests/v8_unittest.cc | 1949 ----------- .../unittests/web_urlrequest_unittest.cc | 523 --- cef1/tests/unittests/xml_reader_unittest.cc | 642 ---- cef1/tests/unittests/zip_reader_unittest.cc | 253 -- cef1/tools/automate/automate-git.py | 404 --- cef1/tools/automate/automate.README.txt | 99 - cef1/tools/automate/automate.py | 480 --- cef1/tools/build_projects.bat | 48 - cef1/tools/build_projects.sh | 18 - cef1/tools/cef_parser.py | 1849 ----------- cef1/tools/check_revision.py | 87 - cef1/tools/check_style.bat | 2 - cef1/tools/check_style.py | 129 - cef1/tools/check_style.sh | 2 - cef1/tools/date_util.py | 13 - cef1/tools/distrib/README-TRANSFER.txt | 5 - cef1/tools/distrib/README.client.txt | 12 - cef1/tools/distrib/README.footer.txt | 6 - cef1/tools/distrib/README.header.txt | 12 - cef1/tools/distrib/cefclient.gyp | 237 -- cef1/tools/distrib/linux/README.minimal.txt | 17 - cef1/tools/distrib/linux/README.redistrib.txt | 31 - cef1/tools/distrib/linux/README.standard.txt | 34 - cef1/tools/distrib/linux/build.sh | 8 - cef1/tools/distrib/mac/README.minimal.txt | 17 - cef1/tools/distrib/mac/README.redistrib.txt | 33 - cef1/tools/distrib/mac/README.standard.txt | 36 - cef1/tools/distrib/mac/transfer.cfg | 29 - cef1/tools/distrib/transfer.cfg | 64 - cef1/tools/distrib/win/README.minimal.txt | 19 - cef1/tools/distrib/win/README.redistrib.txt | 43 - cef1/tools/distrib/win/README.standard.txt | 46 - cef1/tools/distrib/win/d3dcompiler_43.dll | Bin 2106216 -> 0 bytes cef1/tools/distrib/win/d3dx9_43.dll | Bin 1998168 -> 0 bytes cef1/tools/file_util.py | 130 - cef1/tools/gclient_hook.py | 30 - cef1/tools/gclient_util.py | 45 - cef1/tools/git_util.py | 24 - cef1/tools/gyp_cef | 156 - cef1/tools/make_capi_header.py | 174 - cef1/tools/make_cppdocs.bat | 18 - cef1/tools/make_cpptoc_header.py | 106 - cef1/tools/make_cpptoc_impl.py | 563 ---- cef1/tools/make_ctocpp_header.py | 122 - cef1/tools/make_ctocpp_impl.py | 576 ---- cef1/tools/make_distrib.bat | 2 - cef1/tools/make_distrib.py | 662 ---- cef1/tools/make_distrib.sh | 2 - cef1/tools/make_gypi_file.py | 108 - cef1/tools/make_version_header.bat | 2 - cef1/tools/make_version_header.py | 133 - cef1/tools/patch.bat | 2 - cef1/tools/patch.sh | 2 - cef1/tools/patch_util.py | 560 ---- cef1/tools/patcher.README.txt | 32 - cef1/tools/patcher.py | 98 - cef1/tools/repack_locales.py | 180 -- cef1/tools/revision.py | 19 - cef1/tools/svn_util.py | 57 - cef1/tools/translator.README.txt | 1697 ---------- cef1/tools/translator.bat | 3 - cef1/tools/translator.py | 163 - cef1/tools/translator.sh | 2 - 713 files changed, 115672 deletions(-) delete mode 100644 cef1/AUTHORS.txt delete mode 100644 cef1/CHROMIUM_BUILD_COMPATIBILITY.txt delete mode 100644 cef1/DEPS delete mode 100644 cef1/LICENSE.txt delete mode 100644 cef1/VERSION delete mode 100644 cef1/cef.gyp delete mode 100644 cef1/cef.gypi delete mode 100644 cef1/cef_create_projects.bat delete mode 100755 cef1/cef_create_projects.sh delete mode 100644 cef1/cef_paths.gypi delete mode 100644 cef1/cef_paths2.gypi delete mode 100644 cef1/include/capi/cef_app_capi.h delete mode 100644 cef1/include/capi/cef_base_capi.h delete mode 100644 cef1/include/capi/cef_browser_capi.h delete mode 100644 cef1/include/capi/cef_client_capi.h delete mode 100644 cef1/include/capi/cef_command_line_capi.h delete mode 100644 cef1/include/capi/cef_content_filter_capi.h delete mode 100644 cef1/include/capi/cef_cookie_capi.h delete mode 100644 cef1/include/capi/cef_display_handler_capi.h delete mode 100644 cef1/include/capi/cef_dom_capi.h delete mode 100644 cef1/include/capi/cef_download_handler_capi.h delete mode 100644 cef1/include/capi/cef_drag_data_capi.h delete mode 100644 cef1/include/capi/cef_drag_handler_capi.h delete mode 100644 cef1/include/capi/cef_find_handler_capi.h delete mode 100644 cef1/include/capi/cef_focus_handler_capi.h delete mode 100644 cef1/include/capi/cef_frame_capi.h delete mode 100644 cef1/include/capi/cef_geolocation_capi.h delete mode 100644 cef1/include/capi/cef_geolocation_handler_capi.h delete mode 100644 cef1/include/capi/cef_jsdialog_handler_capi.h delete mode 100644 cef1/include/capi/cef_keyboard_handler_capi.h delete mode 100644 cef1/include/capi/cef_life_span_handler_capi.h delete mode 100644 cef1/include/capi/cef_load_handler_capi.h delete mode 100644 cef1/include/capi/cef_menu_handler_capi.h delete mode 100644 cef1/include/capi/cef_nplugin_capi.h delete mode 100644 cef1/include/capi/cef_origin_whitelist_capi.h delete mode 100644 cef1/include/capi/cef_permission_handler_capi.h delete mode 100644 cef1/include/capi/cef_print_handler_capi.h delete mode 100644 cef1/include/capi/cef_proxy_handler_capi.h delete mode 100644 cef1/include/capi/cef_render_handler_capi.h delete mode 100644 cef1/include/capi/cef_request_capi.h delete mode 100644 cef1/include/capi/cef_request_handler_capi.h delete mode 100644 cef1/include/capi/cef_resource_bundle_handler_capi.h delete mode 100644 cef1/include/capi/cef_response_capi.h delete mode 100644 cef1/include/capi/cef_scheme_capi.h delete mode 100644 cef1/include/capi/cef_stream_capi.h delete mode 100644 cef1/include/capi/cef_task_capi.h delete mode 100644 cef1/include/capi/cef_url_capi.h delete mode 100644 cef1/include/capi/cef_v8_capi.h delete mode 100644 cef1/include/capi/cef_v8context_handler_capi.h delete mode 100644 cef1/include/capi/cef_web_plugin_capi.h delete mode 100644 cef1/include/capi/cef_web_urlrequest_capi.h delete mode 100644 cef1/include/capi/cef_xml_reader_capi.h delete mode 100644 cef1/include/capi/cef_zip_reader_capi.h delete mode 100644 cef1/include/capi/cef_zoom_handler_capi.h delete mode 100644 cef1/include/cef_app.h delete mode 100644 cef1/include/cef_application_mac.h delete mode 100644 cef1/include/cef_base.h delete mode 100644 cef1/include/cef_browser.h delete mode 100644 cef1/include/cef_client.h delete mode 100644 cef1/include/cef_command_line.h delete mode 100644 cef1/include/cef_content_filter.h delete mode 100644 cef1/include/cef_cookie.h delete mode 100644 cef1/include/cef_display_handler.h delete mode 100644 cef1/include/cef_dom.h delete mode 100644 cef1/include/cef_download_handler.h delete mode 100644 cef1/include/cef_drag_data.h delete mode 100644 cef1/include/cef_drag_handler.h delete mode 100644 cef1/include/cef_find_handler.h delete mode 100644 cef1/include/cef_focus_handler.h delete mode 100644 cef1/include/cef_frame.h delete mode 100644 cef1/include/cef_geolocation.h delete mode 100644 cef1/include/cef_geolocation_handler.h delete mode 100644 cef1/include/cef_jsdialog_handler.h delete mode 100644 cef1/include/cef_keyboard_handler.h delete mode 100644 cef1/include/cef_life_span_handler.h delete mode 100644 cef1/include/cef_load_handler.h delete mode 100644 cef1/include/cef_menu_handler.h delete mode 100644 cef1/include/cef_nplugin.h delete mode 100644 cef1/include/cef_origin_whitelist.h delete mode 100644 cef1/include/cef_permission_handler.h delete mode 100644 cef1/include/cef_print_handler.h delete mode 100644 cef1/include/cef_proxy_handler.h delete mode 100644 cef1/include/cef_render_handler.h delete mode 100644 cef1/include/cef_request.h delete mode 100644 cef1/include/cef_request_handler.h delete mode 100644 cef1/include/cef_resource_bundle_handler.h delete mode 100644 cef1/include/cef_response.h delete mode 100644 cef1/include/cef_runnable.h delete mode 100644 cef1/include/cef_scheme.h delete mode 100644 cef1/include/cef_stream.h delete mode 100644 cef1/include/cef_task.h delete mode 100644 cef1/include/cef_url.h delete mode 100644 cef1/include/cef_v8.h delete mode 100644 cef1/include/cef_v8context_handler.h delete mode 100644 cef1/include/cef_web_plugin.h delete mode 100644 cef1/include/cef_web_urlrequest.h delete mode 100644 cef1/include/cef_xml_reader.h delete mode 100644 cef1/include/cef_zip_reader.h delete mode 100644 cef1/include/cef_zoom_handler.h delete mode 100644 cef1/include/internal/cef_build.h delete mode 100644 cef1/include/internal/cef_export.h delete mode 100644 cef1/include/internal/cef_linux.h delete mode 100644 cef1/include/internal/cef_mac.h delete mode 100644 cef1/include/internal/cef_nplugin_types.h delete mode 100644 cef1/include/internal/cef_ptr.h delete mode 100644 cef1/include/internal/cef_string.h delete mode 100644 cef1/include/internal/cef_string_list.h delete mode 100644 cef1/include/internal/cef_string_map.h delete mode 100644 cef1/include/internal/cef_string_multimap.h delete mode 100644 cef1/include/internal/cef_string_types.h delete mode 100644 cef1/include/internal/cef_string_wrappers.h delete mode 100644 cef1/include/internal/cef_time.h delete mode 100644 cef1/include/internal/cef_tuple.h delete mode 100644 cef1/include/internal/cef_types.h delete mode 100644 cef1/include/internal/cef_types_linux.h delete mode 100644 cef1/include/internal/cef_types_mac.h delete mode 100644 cef1/include/internal/cef_types_win.h delete mode 100644 cef1/include/internal/cef_types_wrappers.h delete mode 100644 cef1/include/internal/cef_win.h delete mode 100644 cef1/include/wrapper/cef_byte_read_handler.h delete mode 100644 cef1/include/wrapper/cef_xml_object.h delete mode 100644 cef1/include/wrapper/cef_zip_archive.h delete mode 100644 cef1/libcef/browser_appcache_system.cc delete mode 100644 cef1/libcef/browser_appcache_system.h delete mode 100644 cef1/libcef/browser_database_system.cc delete mode 100644 cef1/libcef/browser_database_system.h delete mode 100644 cef1/libcef/browser_devtools_agent.cc delete mode 100644 cef1/libcef/browser_devtools_agent.h delete mode 100644 cef1/libcef/browser_devtools_callargs.cc delete mode 100644 cef1/libcef/browser_devtools_callargs.h delete mode 100644 cef1/libcef/browser_devtools_client.cc delete mode 100644 cef1/libcef/browser_devtools_client.h delete mode 100644 cef1/libcef/browser_devtools_scheme_handler.cc delete mode 100644 cef1/libcef/browser_devtools_scheme_handler.h delete mode 100644 cef1/libcef/browser_dom_storage_system.cc delete mode 100644 cef1/libcef/browser_dom_storage_system.h delete mode 100644 cef1/libcef/browser_drag_delegate_win.cc delete mode 100644 cef1/libcef/browser_drag_delegate_win.h delete mode 100644 cef1/libcef/browser_file_system.cc delete mode 100644 cef1/libcef/browser_file_system.h delete mode 100644 cef1/libcef/browser_file_writer.cc delete mode 100644 cef1/libcef/browser_file_writer.h delete mode 100644 cef1/libcef/browser_impl.cc delete mode 100644 cef1/libcef/browser_impl.h delete mode 100644 cef1/libcef/browser_impl_gtk.cc delete mode 100644 cef1/libcef/browser_impl_mac.mm delete mode 100644 cef1/libcef/browser_impl_win.cc delete mode 100644 cef1/libcef/browser_navigation_controller.cc delete mode 100644 cef1/libcef/browser_navigation_controller.h delete mode 100644 cef1/libcef/browser_network_delegate.cc delete mode 100644 cef1/libcef/browser_network_delegate.h delete mode 100644 cef1/libcef/browser_request_context.cc delete mode 100644 cef1/libcef/browser_request_context.h delete mode 100644 cef1/libcef/browser_request_context_proxy.cc delete mode 100644 cef1/libcef/browser_request_context_proxy.h delete mode 100644 cef1/libcef/browser_resource_loader_bridge.cc delete mode 100644 cef1/libcef/browser_resource_loader_bridge.h delete mode 100644 cef1/libcef/browser_settings.cc delete mode 100644 cef1/libcef/browser_settings.h delete mode 100644 cef1/libcef/browser_socket_stream_bridge.cc delete mode 100644 cef1/libcef/browser_socket_stream_bridge.h delete mode 100644 cef1/libcef/browser_thread_stub.cc delete mode 100644 cef1/libcef/browser_tooltip_mac.h delete mode 100644 cef1/libcef/browser_webblobregistry_impl.cc delete mode 100644 cef1/libcef/browser_webblobregistry_impl.h delete mode 100644 cef1/libcef/browser_webcookiejar_impl.cc delete mode 100644 cef1/libcef/browser_webcookiejar_impl.h delete mode 100644 cef1/libcef/browser_webkit_glue.cc delete mode 100644 cef1/libcef/browser_webkit_glue.h delete mode 100644 cef1/libcef/browser_webkit_glue_win.cc delete mode 100644 cef1/libcef/browser_webkit_init.cc delete mode 100644 cef1/libcef/browser_webkit_init.h delete mode 100644 cef1/libcef/browser_webview_delegate.cc delete mode 100644 cef1/libcef/browser_webview_delegate.h delete mode 100644 cef1/libcef/browser_webview_delegate_gtk.cc delete mode 100644 cef1/libcef/browser_webview_delegate_mac.mm delete mode 100644 cef1/libcef/browser_webview_delegate_win.cc delete mode 100644 cef1/libcef/browser_webview_mac.h delete mode 100644 cef1/libcef/browser_webview_mac.mm delete mode 100644 cef1/libcef/browser_zoom_map.cc delete mode 100644 cef1/libcef/browser_zoom_map.h delete mode 100644 cef1/libcef/cef_context.cc delete mode 100644 cef1/libcef/cef_context.h delete mode 100644 cef1/libcef/cef_process.cc delete mode 100644 cef1/libcef/cef_process.h delete mode 100644 cef1/libcef/cef_process_io_thread.cc delete mode 100644 cef1/libcef/cef_process_io_thread.h delete mode 100644 cef1/libcef/cef_process_sub_thread.cc delete mode 100644 cef1/libcef/cef_process_sub_thread.h delete mode 100644 cef1/libcef/cef_process_ui_thread.cc delete mode 100644 cef1/libcef/cef_process_ui_thread.h delete mode 100644 cef1/libcef/cef_process_ui_thread_gtk.cc delete mode 100644 cef1/libcef/cef_process_ui_thread_mac.mm delete mode 100644 cef1/libcef/cef_process_ui_thread_win.cc delete mode 100644 cef1/libcef/cef_string_list.cc delete mode 100644 cef1/libcef/cef_string_map.cc delete mode 100644 cef1/libcef/cef_string_multimap.cc delete mode 100644 cef1/libcef/cef_string_types.cc delete mode 100644 cef1/libcef/cef_thread.cc delete mode 100644 cef1/libcef/cef_thread.h delete mode 100644 cef1/libcef/cef_time.cc delete mode 100644 cef1/libcef/cef_time_util.h delete mode 100644 cef1/libcef/command_line_impl.cc delete mode 100644 cef1/libcef/cookie_manager_impl.cc delete mode 100644 cef1/libcef/cookie_manager_impl.h delete mode 100644 cef1/libcef/cookie_store_proxy.cc delete mode 100644 cef1/libcef/cookie_store_proxy.h delete mode 100644 cef1/libcef/dom_document_impl.cc delete mode 100644 cef1/libcef/dom_document_impl.h delete mode 100644 cef1/libcef/dom_event_impl.cc delete mode 100644 cef1/libcef/dom_event_impl.h delete mode 100644 cef1/libcef/dom_node_impl.cc delete mode 100644 cef1/libcef/dom_node_impl.h delete mode 100644 cef1/libcef/download_util.cc delete mode 100644 cef1/libcef/download_util.h delete mode 100644 cef1/libcef/drag_data_impl.cc delete mode 100644 cef1/libcef/drag_data_impl.h delete mode 100644 cef1/libcef/drag_download_file.cc delete mode 100644 cef1/libcef/drag_download_file.h delete mode 100644 cef1/libcef/drag_download_util.cc delete mode 100644 cef1/libcef/drag_download_util.h delete mode 100644 cef1/libcef/external_popup_menu_mac.h delete mode 100644 cef1/libcef/external_popup_menu_mac.mm delete mode 100644 cef1/libcef/external_protocol_handler.h delete mode 100644 cef1/libcef/external_protocol_handler_gtk.cc delete mode 100644 cef1/libcef/external_protocol_handler_mac.mm delete mode 100644 cef1/libcef/external_protocol_handler_win.cc delete mode 100644 cef1/libcef/geolocation_client.cc delete mode 100644 cef1/libcef/geolocation_client.h delete mode 100644 cef1/libcef/geolocation_impl.cc delete mode 100644 cef1/libcef/http_header_utils.cc delete mode 100644 cef1/libcef/http_header_utils.h delete mode 100644 cef1/libcef/nplugin_impl.cc delete mode 100644 cef1/libcef/origin_whitelist_impl.cc delete mode 100644 cef1/libcef/printing/print_settings.cc delete mode 100644 cef1/libcef/printing/print_settings.h delete mode 100644 cef1/libcef/printing/win_printing_context.cc delete mode 100644 cef1/libcef/printing/win_printing_context.h delete mode 100644 cef1/libcef/request_impl.cc delete mode 100644 cef1/libcef/request_impl.h delete mode 100644 cef1/libcef/response_impl.cc delete mode 100644 cef1/libcef/response_impl.h delete mode 100644 cef1/libcef/scheme_impl.cc delete mode 100644 cef1/libcef/scheme_registrar_impl.cc delete mode 100644 cef1/libcef/scheme_registrar_impl.h delete mode 100644 cef1/libcef/simple_clipboard_impl.cc delete mode 100644 cef1/libcef/simple_clipboard_impl.h delete mode 100644 cef1/libcef/sqlite_diagnostics_stub.cc delete mode 100644 cef1/libcef/stream_impl.cc delete mode 100644 cef1/libcef/stream_impl.h delete mode 100644 cef1/libcef/task_impl.cc delete mode 100644 cef1/libcef/tracker.h delete mode 100644 cef1/libcef/url_impl.cc delete mode 100644 cef1/libcef/v8_impl.cc delete mode 100644 cef1/libcef/v8_impl.h delete mode 100644 cef1/libcef/web_drag_source_gtk.cc delete mode 100644 cef1/libcef/web_drag_source_gtk.h delete mode 100644 cef1/libcef/web_drag_source_mac.h delete mode 100644 cef1/libcef/web_drag_source_mac.mm delete mode 100644 cef1/libcef/web_drag_source_win.cc delete mode 100644 cef1/libcef/web_drag_source_win.h delete mode 100644 cef1/libcef/web_drag_utils_gtk.cc delete mode 100644 cef1/libcef/web_drag_utils_gtk.h delete mode 100644 cef1/libcef/web_drag_utils_mac.h delete mode 100644 cef1/libcef/web_drag_utils_mac.mm delete mode 100644 cef1/libcef/web_drag_utils_win.cc delete mode 100644 cef1/libcef/web_drag_utils_win.h delete mode 100644 cef1/libcef/web_drop_target_gtk.cc delete mode 100644 cef1/libcef/web_drop_target_gtk.h delete mode 100644 cef1/libcef/web_drop_target_mac.h delete mode 100644 cef1/libcef/web_drop_target_mac.mm delete mode 100644 cef1/libcef/web_drop_target_win.cc delete mode 100644 cef1/libcef/web_drop_target_win.h delete mode 100644 cef1/libcef/web_plugin_impl.cc delete mode 100644 cef1/libcef/web_urlrequest_impl.cc delete mode 100644 cef1/libcef/web_urlrequest_impl.h delete mode 100644 cef1/libcef/webview_host.cc delete mode 100644 cef1/libcef/webview_host.h delete mode 100644 cef1/libcef/webview_host_gtk.cc delete mode 100644 cef1/libcef/webview_host_mac.mm delete mode 100644 cef1/libcef/webview_host_win.cc delete mode 100644 cef1/libcef/webwidget_host.cc delete mode 100644 cef1/libcef/webwidget_host.h delete mode 100644 cef1/libcef/webwidget_host_gtk.cc delete mode 100644 cef1/libcef/webwidget_host_mac.mm delete mode 100644 cef1/libcef/webwidget_host_win.cc delete mode 100644 cef1/libcef/xml_reader_impl.cc delete mode 100644 cef1/libcef/xml_reader_impl.h delete mode 100644 cef1/libcef/zip_reader_impl.cc delete mode 100644 cef1/libcef/zip_reader_impl.h delete mode 100644 cef1/libcef_dll/cef_logging.h delete mode 100644 cef1/libcef_dll/cpptoc/app_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/app_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/base_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/browser_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/browser_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/client_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/client_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/command_line_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/command_line_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/content_filter_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/content_filter_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/cookie_manager_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/cookie_manager_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/cookie_visitor_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/cookie_visitor_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/display_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/display_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/domdocument_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/domdocument_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/domevent_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/domevent_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/domevent_listener_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/domevent_listener_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/domnode_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/domnode_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/domvisitor_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/domvisitor_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/download_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/download_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/drag_data_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/drag_data_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/drag_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/drag_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/find_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/find_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/focus_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/focus_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/frame_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/frame_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/geolocation_callback_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/geolocation_callback_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/geolocation_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/geolocation_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/get_geolocation_callback_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/get_geolocation_callback_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/jsdialog_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/jsdialog_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/keyboard_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/keyboard_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/life_span_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/life_span_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/load_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/load_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/menu_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/menu_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/permission_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/permission_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/post_data_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/post_data_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/post_data_element_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/post_data_element_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/print_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/print_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/proxy_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/proxy_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/read_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/read_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/render_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/render_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/request_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/request_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/request_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/request_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/resource_bundle_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/resource_bundle_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/response_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/response_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/scheme_handler_callback_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/scheme_handler_callback_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/scheme_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/scheme_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/scheme_handler_factory_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/scheme_handler_factory_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/stream_reader_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/stream_reader_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/stream_writer_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/stream_writer_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/task_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/task_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/v8accessor_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/v8accessor_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/v8context_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/v8context_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/v8context_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/v8context_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/v8exception_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/v8exception_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/v8handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/v8handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/v8stack_frame_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/v8stack_frame_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/v8stack_trace_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/v8stack_trace_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/v8value_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/v8value_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/web_plugin_info_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/web_plugin_info_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/web_urlrequest_client_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/web_urlrequest_client_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/web_urlrequest_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/web_urlrequest_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/write_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/write_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/xml_reader_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/xml_reader_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/zip_reader_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/zip_reader_cpptoc.h delete mode 100644 cef1/libcef_dll/cpptoc/zoom_handler_cpptoc.cc delete mode 100644 cef1/libcef_dll/cpptoc/zoom_handler_cpptoc.h delete mode 100644 cef1/libcef_dll/ctocpp/app_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/app_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/base_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/browser_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/browser_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/client_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/client_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/command_line_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/command_line_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/content_filter_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/content_filter_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/cookie_manager_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/cookie_manager_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/cookie_visitor_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/cookie_visitor_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/display_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/display_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/domdocument_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/domdocument_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/domevent_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/domevent_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/domevent_listener_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/domevent_listener_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/domnode_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/domnode_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/domvisitor_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/domvisitor_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/download_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/download_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/drag_data_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/drag_data_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/drag_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/drag_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/find_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/find_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/focus_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/focus_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/frame_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/frame_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/geolocation_callback_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/geolocation_callback_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/geolocation_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/geolocation_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/get_geolocation_callback_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/get_geolocation_callback_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/jsdialog_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/jsdialog_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/keyboard_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/keyboard_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/life_span_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/life_span_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/load_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/load_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/menu_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/menu_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/permission_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/permission_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/post_data_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/post_data_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/post_data_element_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/post_data_element_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/print_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/print_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/proxy_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/proxy_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/read_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/read_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/render_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/render_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/request_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/request_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/request_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/request_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/resource_bundle_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/resource_bundle_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/response_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/response_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/scheme_handler_callback_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/scheme_handler_callback_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/scheme_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/scheme_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/scheme_handler_factory_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/scheme_handler_factory_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/stream_reader_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/stream_reader_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/stream_writer_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/stream_writer_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/task_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/task_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/v8accessor_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/v8accessor_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/v8context_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/v8context_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/v8context_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/v8context_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/v8exception_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/v8exception_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/v8handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/v8handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/v8stack_frame_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/v8stack_frame_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/v8stack_trace_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/v8stack_trace_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/v8value_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/v8value_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/web_plugin_info_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/web_plugin_info_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/web_urlrequest_client_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/web_urlrequest_client_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/web_urlrequest_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/web_urlrequest_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/write_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/write_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/xml_reader_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/xml_reader_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/zip_reader_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/zip_reader_ctocpp.h delete mode 100644 cef1/libcef_dll/ctocpp/zoom_handler_ctocpp.cc delete mode 100644 cef1/libcef_dll/ctocpp/zoom_handler_ctocpp.h delete mode 100644 cef1/libcef_dll/libcef_dll.cc delete mode 100644 cef1/libcef_dll/libcef_dll.rc delete mode 100644 cef1/libcef_dll/libcef_dll2.cc delete mode 100644 cef1/libcef_dll/resource.h delete mode 100644 cef1/libcef_dll/transfer_util.cpp delete mode 100644 cef1/libcef_dll/transfer_util.h delete mode 100644 cef1/libcef_dll/wrapper/cef_byte_read_handler.cc delete mode 100644 cef1/libcef_dll/wrapper/cef_xml_object.cc delete mode 100644 cef1/libcef_dll/wrapper/cef_zip_archive.cc delete mode 100644 cef1/libcef_dll/wrapper/libcef_dll_wrapper.cc delete mode 100644 cef1/libcef_dll/wrapper/libcef_dll_wrapper2.cc delete mode 100644 cef1/patch/README.txt delete mode 100644 cef1/patch/patch.cfg delete mode 100644 cef1/patch/patches/build.patch delete mode 100644 cef1/patch/patches/gyp_331.patch delete mode 100644 cef1/patch/patches/message_loop_443.patch delete mode 100644 cef1/patch/patches/spi_webcore_364.patch delete mode 100644 cef1/patch/patches/webkit_933.patch delete mode 100644 cef1/patch/patches/zlib.patch delete mode 100644 cef1/tests/cefclient/binding_test.cpp delete mode 100644 cef1/tests/cefclient/binding_test.h delete mode 100644 cef1/tests/cefclient/cefclient.cpp delete mode 100644 cef1/tests/cefclient/cefclient.h delete mode 100644 cef1/tests/cefclient/cefclient.rc delete mode 100644 cef1/tests/cefclient/cefclient_gtk.cpp delete mode 100644 cef1/tests/cefclient/cefclient_mac.mm delete mode 100644 cef1/tests/cefclient/cefclient_switches.cpp delete mode 100644 cef1/tests/cefclient/cefclient_switches.h delete mode 100644 cef1/tests/cefclient/cefclient_win.cpp delete mode 100644 cef1/tests/cefclient/client_handler.cpp delete mode 100644 cef1/tests/cefclient/client_handler.h delete mode 100644 cef1/tests/cefclient/client_handler_gtk.cpp delete mode 100644 cef1/tests/cefclient/client_handler_mac.mm delete mode 100644 cef1/tests/cefclient/client_handler_win.cpp delete mode 100644 cef1/tests/cefclient/client_popup_handler.cpp delete mode 100644 cef1/tests/cefclient/client_popup_handler.h delete mode 100644 cef1/tests/cefclient/clientplugin.cpp delete mode 100644 cef1/tests/cefclient/clientplugin.h delete mode 100644 cef1/tests/cefclient/download_handler.cpp delete mode 100644 cef1/tests/cefclient/download_handler.h delete mode 100644 cef1/tests/cefclient/extension_test.cpp delete mode 100644 cef1/tests/cefclient/extension_test.h delete mode 100644 cef1/tests/cefclient/mac/English.lproj/InfoPlist.strings delete mode 100644 cef1/tests/cefclient/mac/English.lproj/MainMenu.xib delete mode 100644 cef1/tests/cefclient/mac/Info.plist delete mode 100644 cef1/tests/cefclient/mac/cefclient.icns delete mode 100644 cef1/tests/cefclient/osrenderer.cpp delete mode 100644 cef1/tests/cefclient/osrenderer.h delete mode 100644 cef1/tests/cefclient/osrplugin.cpp delete mode 100644 cef1/tests/cefclient/osrplugin.h delete mode 100644 cef1/tests/cefclient/osrplugin_test.cpp delete mode 100644 cef1/tests/cefclient/osrplugin_test.h delete mode 100644 cef1/tests/cefclient/osrtest_mac.h delete mode 100644 cef1/tests/cefclient/osrtest_mac.mm delete mode 100644 cef1/tests/cefclient/performance_test.cpp delete mode 100644 cef1/tests/cefclient/performance_test.h delete mode 100644 cef1/tests/cefclient/performance_test_setup.h delete mode 100644 cef1/tests/cefclient/performance_test_tests.cpp delete mode 100644 cef1/tests/cefclient/plugin_test.cpp delete mode 100644 cef1/tests/cefclient/plugin_test.h delete mode 100644 cef1/tests/cefclient/res/binding.html delete mode 100644 cef1/tests/cefclient/res/cefclient.ico delete mode 100644 cef1/tests/cefclient/res/dialogs.html delete mode 100644 cef1/tests/cefclient/res/domaccess.html delete mode 100644 cef1/tests/cefclient/res/extension.html delete mode 100644 cef1/tests/cefclient/res/localstorage.html delete mode 100644 cef1/tests/cefclient/res/logo.png delete mode 100644 cef1/tests/cefclient/res/logoball.png delete mode 100644 cef1/tests/cefclient/res/modaldialog.html delete mode 100644 cef1/tests/cefclient/res/modalmain.html delete mode 100644 cef1/tests/cefclient/res/osrplugin.html delete mode 100644 cef1/tests/cefclient/res/osrtest.html delete mode 100644 cef1/tests/cefclient/res/other_tests.html delete mode 100644 cef1/tests/cefclient/res/performance.html delete mode 100644 cef1/tests/cefclient/res/plugin.html delete mode 100644 cef1/tests/cefclient/res/small.ico delete mode 100644 cef1/tests/cefclient/res/transparency.html delete mode 100644 cef1/tests/cefclient/res/uiplugin.html delete mode 100644 cef1/tests/cefclient/res/xmlhttprequest.html delete mode 100644 cef1/tests/cefclient/resource.h delete mode 100644 cef1/tests/cefclient/resource_util.h delete mode 100644 cef1/tests/cefclient/resource_util_linux.cpp delete mode 100644 cef1/tests/cefclient/resource_util_mac.mm delete mode 100644 cef1/tests/cefclient/resource_util_posix.cpp delete mode 100644 cef1/tests/cefclient/resource_util_win.cpp delete mode 100644 cef1/tests/cefclient/scheme_test.cpp delete mode 100644 cef1/tests/cefclient/scheme_test.h delete mode 100644 cef1/tests/cefclient/string_util.cpp delete mode 100644 cef1/tests/cefclient/string_util.h delete mode 100644 cef1/tests/cefclient/uiplugin.cpp delete mode 100644 cef1/tests/cefclient/uiplugin.h delete mode 100644 cef1/tests/cefclient/uiplugin_test.cpp delete mode 100644 cef1/tests/cefclient/uiplugin_test.h delete mode 100644 cef1/tests/cefclient/util.h delete mode 100644 cef1/tests/unittests/command_line_unittest.cc delete mode 100644 cef1/tests/unittests/content_filter_unittest.cc delete mode 100644 cef1/tests/unittests/cookie_unittest.cc delete mode 100644 cef1/tests/unittests/dom_unittest.cc delete mode 100644 cef1/tests/unittests/geolocation_unittest.cc delete mode 100644 cef1/tests/unittests/mac/English.lproj/InfoPlist.strings delete mode 100644 cef1/tests/unittests/mac/English.lproj/MainMenu.xib delete mode 100644 cef1/tests/unittests/mac/Info.plist delete mode 100644 cef1/tests/unittests/mac/unittests.icns delete mode 100644 cef1/tests/unittests/navigation_unittest.cc delete mode 100644 cef1/tests/unittests/request_unittest.cc delete mode 100644 cef1/tests/unittests/run_all_unittests.cc delete mode 100644 cef1/tests/unittests/run_all_unittests_mac.mm delete mode 100644 cef1/tests/unittests/scheme_handler_unittest.cc delete mode 100644 cef1/tests/unittests/stream_unittest.cc delete mode 100644 cef1/tests/unittests/string_unittest.cc delete mode 100644 cef1/tests/unittests/test_handler.cc delete mode 100644 cef1/tests/unittests/test_handler.h delete mode 100644 cef1/tests/unittests/test_suite.cc delete mode 100644 cef1/tests/unittests/test_suite.h delete mode 100644 cef1/tests/unittests/url_unittest.cc delete mode 100644 cef1/tests/unittests/v8_unittest.cc delete mode 100644 cef1/tests/unittests/web_urlrequest_unittest.cc delete mode 100644 cef1/tests/unittests/xml_reader_unittest.cc delete mode 100644 cef1/tests/unittests/zip_reader_unittest.cc delete mode 100644 cef1/tools/automate/automate-git.py delete mode 100644 cef1/tools/automate/automate.README.txt delete mode 100644 cef1/tools/automate/automate.py delete mode 100644 cef1/tools/build_projects.bat delete mode 100755 cef1/tools/build_projects.sh delete mode 100644 cef1/tools/cef_parser.py delete mode 100644 cef1/tools/check_revision.py delete mode 100644 cef1/tools/check_style.bat delete mode 100644 cef1/tools/check_style.py delete mode 100755 cef1/tools/check_style.sh delete mode 100644 cef1/tools/date_util.py delete mode 100644 cef1/tools/distrib/README-TRANSFER.txt delete mode 100644 cef1/tools/distrib/README.client.txt delete mode 100644 cef1/tools/distrib/README.footer.txt delete mode 100644 cef1/tools/distrib/README.header.txt delete mode 100644 cef1/tools/distrib/cefclient.gyp delete mode 100644 cef1/tools/distrib/linux/README.minimal.txt delete mode 100644 cef1/tools/distrib/linux/README.redistrib.txt delete mode 100644 cef1/tools/distrib/linux/README.standard.txt delete mode 100755 cef1/tools/distrib/linux/build.sh delete mode 100644 cef1/tools/distrib/mac/README.minimal.txt delete mode 100644 cef1/tools/distrib/mac/README.redistrib.txt delete mode 100644 cef1/tools/distrib/mac/README.standard.txt delete mode 100644 cef1/tools/distrib/mac/transfer.cfg delete mode 100644 cef1/tools/distrib/transfer.cfg delete mode 100644 cef1/tools/distrib/win/README.minimal.txt delete mode 100644 cef1/tools/distrib/win/README.redistrib.txt delete mode 100644 cef1/tools/distrib/win/README.standard.txt delete mode 100644 cef1/tools/distrib/win/d3dcompiler_43.dll delete mode 100644 cef1/tools/distrib/win/d3dx9_43.dll delete mode 100644 cef1/tools/file_util.py delete mode 100644 cef1/tools/gclient_hook.py delete mode 100644 cef1/tools/gclient_util.py delete mode 100644 cef1/tools/git_util.py delete mode 100755 cef1/tools/gyp_cef delete mode 100644 cef1/tools/make_capi_header.py delete mode 100644 cef1/tools/make_cppdocs.bat delete mode 100644 cef1/tools/make_cpptoc_header.py delete mode 100644 cef1/tools/make_cpptoc_impl.py delete mode 100644 cef1/tools/make_ctocpp_header.py delete mode 100644 cef1/tools/make_ctocpp_impl.py delete mode 100644 cef1/tools/make_distrib.bat delete mode 100644 cef1/tools/make_distrib.py delete mode 100755 cef1/tools/make_distrib.sh delete mode 100644 cef1/tools/make_gypi_file.py delete mode 100644 cef1/tools/make_version_header.bat delete mode 100644 cef1/tools/make_version_header.py delete mode 100644 cef1/tools/patch.bat delete mode 100755 cef1/tools/patch.sh delete mode 100644 cef1/tools/patch_util.py delete mode 100644 cef1/tools/patcher.README.txt delete mode 100644 cef1/tools/patcher.py delete mode 100644 cef1/tools/repack_locales.py delete mode 100644 cef1/tools/revision.py delete mode 100644 cef1/tools/svn_util.py delete mode 100644 cef1/tools/translator.README.txt delete mode 100644 cef1/tools/translator.bat delete mode 100644 cef1/tools/translator.py delete mode 100755 cef1/tools/translator.sh diff --git a/cef1/AUTHORS.txt b/cef1/AUTHORS.txt deleted file mode 100644 index d4559e2a4..000000000 --- a/cef1/AUTHORS.txt +++ /dev/null @@ -1,27 +0,0 @@ -# This file is an addendum to the Chromium AUTHORS file. -# Names should be added to this file like so: -# Name or Organization - -Marshall Greenblatt -Jamie Kirkpatrick -Johan Lindström -Igor Pavlov -Yanko Yankov -Emerick Rogul -Valve Corporation -Anthony Taranto -Joe Andrieu -Keith Poole -Aviv Rind -Michael Kaminski -ADInstruments Ltd. -Gus Verdun -Joinerysoft Ltd. -Johan Björk -Dmitry Azaraev -David Xue -Russell (Rusty) Richards -Brian Power -Corey Lucier -Mihai Tica -Czarek Tomczak diff --git a/cef1/CHROMIUM_BUILD_COMPATIBILITY.txt b/cef1/CHROMIUM_BUILD_COMPATIBILITY.txt deleted file mode 100644 index aba9ab78e..000000000 --- a/cef1/CHROMIUM_BUILD_COMPATIBILITY.txt +++ /dev/null @@ -1,21 +0,0 @@ -# The Chromium Embedded Framework (CEF) project is built on top of the Chromium -# project source tree. Chromium should be updated to the URL and revision listed -# below before building CEF. Chromium compatibility information for older CEF -# revisions is available by viewing this file's change history. -# -# To configure a specific Chromium URL: -# gclient config chromium_url -# -# To update to a specific Chromium revision: -# gclient sync --revision src@chromium_revision --jobs 8 --force -# -# This file is integrated with the CEF Automation Tool. See the -# tools/automate/automate.README.txt file for more information. -# -# For general gclient usage information visit: -# http://dev.chromium.org/developers/how-tos/get-the-code - -{ - 'chromium_url': 'http://src.chromium.org/svn/trunk/src', - 'chromium_revision': '194165', -} diff --git a/cef1/DEPS b/cef1/DEPS deleted file mode 100644 index 0a7dc22e3..000000000 --- a/cef1/DEPS +++ /dev/null @@ -1,7 +0,0 @@ -hooks = [ - { - # A change to a .gyp, .gypi, or to GYP itself should run the generator. - "pattern": ".", - "action": ["python", "src/cef/tools/gclient_hook.py"], - }, -] diff --git a/cef1/LICENSE.txt b/cef1/LICENSE.txt deleted file mode 100644 index a5d84adab..000000000 --- a/cef1/LICENSE.txt +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2008-2013 Marshall A. Greenblatt. Portions Copyright (c) -// 2006-2009 Google 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: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. diff --git a/cef1/VERSION b/cef1/VERSION deleted file mode 100644 index ffc67b41a..000000000 --- a/cef1/VERSION +++ /dev/null @@ -1 +0,0 @@ -CEF_MAJOR=1 diff --git a/cef1/cef.gyp b/cef1/cef.gyp deleted file mode 100644 index 9226d9644..000000000 --- a/cef1/cef.gyp +++ /dev/null @@ -1,861 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -{ - 'variables': { - 'pkg-config': 'pkg-config', - 'chromium_code': 1, - 'repack_locales_cmd': ['python', 'tools/repack_locales.py'], - 'grit_out_dir': '<(SHARED_INTERMEDIATE_DIR)/cef', - 'revision': '=46', { - 'target_defaults': { - # Disable warnings about c++0x compatibility, as some names (such - # as nullptr) conflict with upcoming c++0x types. - 'cflags_cc': ['-Wno-c++0x-compat'], - }, - }], - ], - 'includes': [ - # Bring in the source file lists. - 'cef_paths2.gypi', - ], - 'targets': [ - { - 'target_name': 'cefclient', - 'type': 'executable', - 'mac_bundle': 1, - 'msvs_guid': '6617FED9-C5D4-4907-BF55-A90062A6683F', - 'dependencies': [ - '<(DEPTH)/third_party/npapi/npapi.gyp:npapi', - 'libcef', - 'libcef_dll_wrapper', - ], - 'defines': [ - 'USING_CEF_SHARED', - ], - 'include_dirs': [ - '.', - # cefclient includes are relative to the tests directory to make - # creation of binary releases easier. - 'tests' - ], - 'sources': [ - '<@(includes_common)', - '<@(includes_wrapper)', - '<@(cefclient_sources_common)', - ], - 'mac_bundle_resources': [ - '<@(cefclient_bundle_resources_mac)', - '<(grit_out_dir)/devtools_resources.pak', - ], - 'mac_bundle_resources!': [ - # TODO(mark): Come up with a fancier way to do this (mac_info_plist?) - # that automatically sets the correct INFOPLIST_FILE setting and adds - # the file to a source group. - 'tests/cefclient/mac/Info.plist', - ], - 'xcode_settings': { - 'INFOPLIST_FILE': 'tests/cefclient/mac/Info.plist', - }, - 'conditions': [ - ['OS=="win"', { - 'variables': { - 'repack_path': '../tools/grit/grit/format/repack.py', - }, - 'actions': [ - { - 'action_name': 'repack_locales', - 'inputs': [ - 'tools/repack_locales.py', - # NOTE: Ideally the common command args would be shared - # amongst inputs/outputs/action, but the args include shell - # variables which need to be passed intact, and command - # expansion wants to expand the shell variables. Adding the - # explicit quoting here was the only way it seemed to work. - '>!@(<(repack_locales_cmd) -i -g \"<(grit_out_dir)\" -s \"<(SHARED_INTERMEDIATE_DIR)\" -x \"<(INTERMEDIATE_DIR)\" <(locales))', - ], - 'outputs': [ - '>!@(<(repack_locales_cmd) -o -g \"<(grit_out_dir)\" -s \"<(SHARED_INTERMEDIATE_DIR)\" -x \"<(INTERMEDIATE_DIR)\" <(locales))', - ], - 'action': [ - '<@(repack_locales_cmd)', - '-g', '<(grit_out_dir)', - '-s', '<(SHARED_INTERMEDIATE_DIR)', - '-x', '<(INTERMEDIATE_DIR)', - '<@(locales)', - ], - }, - ], - 'copies': [ - { - 'destination': '<(PRODUCT_DIR)/locales', - 'files': [ - '!@(<(repack_locales_cmd) -i -g \'<(grit_out_dir)\' -s \'<(SHARED_INTERMEDIATE_DIR)\' -x \'<(INTERMEDIATE_DIR)\' <(locales))', - ], - 'outputs': [ - '>!@(<(repack_locales_cmd) -o -g \'<(grit_out_dir)\' -s \'<(SHARED_INTERMEDIATE_DIR)\' -x \'<(INTERMEDIATE_DIR)\' <(locales))', - ], - 'action': [ - '<@(repack_locales_cmd)', - '-g', '<(grit_out_dir)', - '-s', '<(SHARED_INTERMEDIATE_DIR)', - '-x', '<(INTERMEDIATE_DIR)', - '<@(locales)', - ], - }, - { - 'action_name': 'repack_resources', - 'process_outputs_as_mac_bundle_resources': 1, - 'variables': { - 'pak_inputs': [ - '<(SHARED_INTERMEDIATE_DIR)/net/net_resources.pak', - '<(SHARED_INTERMEDIATE_DIR)/ui/ui_resources/ui_resources_100_percent.pak', - '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_chromium_resources.pak', - '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_resources_100_percent.pak', - ], - }, - 'inputs': [ - '<(repack_path)', - '<@(pak_inputs)', - ], - 'outputs': [ - '<(INTERMEDIATE_DIR)/repack/chrome.pak', - ], - 'action': ['python', '<(repack_path)', '<@(_outputs)', '<@(pak_inputs)'], - }, - ], - 'copies': [ - { - # Add library dependencies to the bundle. - 'destination': '<(PRODUCT_DIR)/cefclient.app/Contents/MacOS/', - 'files': [ - '<(PRODUCT_DIR)/libcef.dylib', - ], - }, - ], - 'postbuilds': [ - { - 'postbuild_name': 'Copy WebCore Resources', - 'action': [ - 'cp', - '-Rf', - '${BUILT_PRODUCTS_DIR}/../../third_party/WebKit/Source/WebCore/Resources/', - '${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Contents/Resources/' - ], - }, - ], - 'link_settings': { - 'libraries': [ - '$(SDKROOT)/System/Library/Frameworks/AppKit.framework', - '$(SDKROOT)/System/Library/Frameworks/OpenGL.framework', - ], - }, - 'sources': [ - '<@(includes_mac)', - '<@(cefclient_sources_mac)', - ], - }], - [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', { - 'dependencies':[ - '<(DEPTH)/build/linux/system.gyp:gtk', - ], - 'sources': [ - '<@(includes_linux)', - '<@(cefclient_sources_linux)', - ], - 'variables': { - 'repack_path': '../tools/grit/grit/format/repack.py', - }, - 'actions': [ - { - 'action_name': 'repack_locales', - 'inputs': [ - 'tools/repack_locales.py', - # NOTE: Ideally the common command args would be shared - # amongst inputs/outputs/action, but the args include shell - # variables which need to be passed intact, and command - # expansion wants to expand the shell variables. Adding the - # explicit quoting here was the only way it seemed to work. - '>!@(<(repack_locales_cmd) -i -g \'<(grit_out_dir)\' -s \'<(SHARED_INTERMEDIATE_DIR)\' -x \'<(INTERMEDIATE_DIR)\' <(locales))', - ], - 'outputs': [ - '>!@(<(repack_locales_cmd) -o -g \'<(grit_out_dir)\' -s \'<(SHARED_INTERMEDIATE_DIR)\' -x \'<(INTERMEDIATE_DIR)\' <(locales))', - ], - 'action': [ - '<@(repack_locales_cmd)', - '-g', '<(grit_out_dir)', - '-s', '<(SHARED_INTERMEDIATE_DIR)', - '-x', '<(INTERMEDIATE_DIR)', - '<@(locales)', - ], - }, - { - 'action_name': 'repack_resources', - 'variables': { - 'pak_inputs': [ - '<(SHARED_INTERMEDIATE_DIR)/net/net_resources.pak', - '<(SHARED_INTERMEDIATE_DIR)/ui/ui_resources/ui_resources_100_percent.pak', - '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_chromium_resources.pak', - '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_resources_100_percent.pak', - ], - }, - 'inputs': [ - '<(repack_path)', - '<@(pak_inputs)', - ], - 'outputs': [ - '<(INTERMEDIATE_DIR)/repack/chrome.pak', - ], - 'action': ['python', '<(repack_path)', '<@(_outputs)', '<@(pak_inputs)'], - }, - ], - 'copies': [ - { - 'destination': '<(PRODUCT_DIR)/locales', - 'files': [ - '!@(<(repack_locales_cmd) -i -g \'<(grit_out_dir)\' -s \'<(SHARED_INTERMEDIATE_DIR)\' -x \'<(INTERMEDIATE_DIR)\' <(locales))', - ], - 'outputs': [ - '>!@(<(repack_locales_cmd) -o -g \'<(grit_out_dir)\' -s \'<(SHARED_INTERMEDIATE_DIR)\' -x \'<(INTERMEDIATE_DIR)\' <(locales))', - ], - 'action': [ - '<@(repack_locales_cmd)', - '-g', '<(grit_out_dir)', - '-s', '<(SHARED_INTERMEDIATE_DIR)', - '-x', '<(INTERMEDIATE_DIR)', - '<@(locales)', - ], - }, - { - 'action_name': 'repack_resources', - 'process_outputs_as_mac_bundle_resources': 1, - 'variables': { - 'pak_inputs': [ - '<(grit_out_dir)/devtools_resources.pak', - '<(SHARED_INTERMEDIATE_DIR)/net/net_resources.pak', - '<(SHARED_INTERMEDIATE_DIR)/ui/ui_resources/ui_resources_100_percent.pak', - '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_chromium_resources.pak', - '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_resources_100_percent.pak', - ], - }, - 'inputs': [ - '<(repack_path)', - '<@(pak_inputs)', - ], - 'outputs': [ - '<(INTERMEDIATE_DIR)/repack/chrome.pak', - ], - 'action': ['python', '<(repack_path)', '<@(_outputs)', '<@(pak_inputs)'], - }, - ], - 'copies': [ - { - # Add library dependencies to the bundle. - 'destination': '<(PRODUCT_DIR)/<(PRODUCT_NAME).app/Contents/MacOS/', - 'files': [ - '<(PRODUCT_DIR)/libcef.dylib', - ], - }, - ], - 'postbuilds': [ - { - 'postbuild_name': 'Copy WebCore Resources', - 'action': [ - 'cp', - '-Rf', - '${BUILT_PRODUCTS_DIR}/../../third_party/WebKit/Source/WebCore/Resources/', - '${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Contents/Resources/' - ], - }, - ], - 'link_settings': { - 'libraries': [ - '$(SDKROOT)/System/Library/Frameworks/AppKit.framework', - ], - }, - 'sources': [ - 'tests/unittests/run_all_unittests_mac.mm', - ], - }], - [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', { - 'dependencies':[ - '<(DEPTH)/build/linux/system.gyp:gtk', - ], - }], - ], - }, - { - 'target_name': 'libcef', - 'type': 'shared_library', - 'msvs_guid': 'C13650D5-CF1A-4259-BE45-B1EBA6280E47', - 'dependencies': [ - 'libcef_static', - ], - 'defines': [ - 'BUILDING_CEF_SHARED', - ], - 'include_dirs': [ - '.', - ], - 'sources': [ - '<@(includes_common)', - '<@(includes_capi)', - '<@(libcef_sources_common)', - ], - 'xcode_settings': { - 'INSTALL_PATH': '@executable_path', - 'DYLIB_INSTALL_NAME_BASE': '@executable_path', - # The libcef_static target contains ObjC categories. Passing the -ObjC flag - # is necessary to properly load them and avoid a "selector not recognized" - # runtime error. See http://developer.apple.com/library/mac/#qa/qa1490/_index.html - # for more information. - 'OTHER_LDFLAGS': ['-Wl,-ObjC'], - 'DYLIB_COMPATIBILITY_VERSION': '<(version_mac_dylib)', - 'DYLIB_CURRENT_VERSION': '<(version_mac_dylib)', - }, - 'conditions': [ - ['OS=="win" and win_use_allocator_shim==1', { - 'dependencies': [ - '<(DEPTH)/base/allocator/allocator.gyp:allocator', - ], - }], - ['OS=="win"', { - 'sources': [ - '<@(includes_win)', - '<(SHARED_INTERMEDIATE_DIR)/ui/ui_resources/ui_unscaled_resources.rc', - '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_chromium_resources.rc', - '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_resources.rc', - 'libcef_dll/libcef_dll.rc', - ], - 'link_settings': { - 'libraries': [ - '-lcomctl32.lib', - '-llocationapi.lib', - ], - }, - 'msvs_settings': { - 'VCLinkerTool': { - # Generate a PDB symbol file for both Debug and Release builds. - 'GenerateDebugInformation': 'true', - }, - }, - }], - [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', { - 'dependencies':[ - '<(DEPTH)/base/allocator/allocator.gyp:allocator', - '<(DEPTH)/build/linux/system.gyp:gtk', - ], - }], - ], - }, - { - 'target_name': 'libcef_dll_wrapper', - 'type': 'static_library', - 'msvs_guid': 'A9D6DC71-C0DC-4549-AEA0-3B15B44E86A9', - 'dependencies': [ - '<(DEPTH)/third_party/npapi/npapi.gyp:npapi', - 'libcef', - ], - 'defines': [ - 'USING_CEF_SHARED', - ], - 'include_dirs': [ - '.', - ], - 'sources': [ - '<@(includes_common)', - '<@(includes_capi)', - '<@(includes_wrapper)', - '<@(libcef_dll_wrapper_sources_common)', - ], - 'conditions': [ - [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', { - 'dependencies':[ - '<(DEPTH)/build/linux/system.gyp:gtk', - ], - }], - ], - }, - { - 'target_name': 'cef_extra_resources', - 'type': 'none', - 'dependencies': [ - '<(DEPTH)/third_party/WebKit/Source/WebKit/chromium/WebKit.gyp:generate_devtools_grd', - ], - # These resources end up in chrome.pak because they are resources - # used by internal pages. Putting them in a spearate pak file makes - # it easier for us to reference them internally. - 'actions': [ - { - 'action_name': 'devtools_resources', - # This can't use ../build/grit_action.gypi because the grd file - # is generated a build time, so the trick of using grit_info to get - # the real inputs/outputs at GYP time isn't possible. - 'variables': { - 'grit_cmd': ['python', '../tools/grit/grit.py'], - 'grit_grd_file': '<(SHARED_INTERMEDIATE_DIR)/devtools/devtools_resources.grd', - }, - 'inputs': [ - '<(grit_grd_file)', - 'f) - (intptr_t)(s) + sizeof((s)->f) <= (s)->base.size) - -#define CEF_MEMBER_MISSING(s, f) (!CEF_MEMBER_EXISTS(s, f) || !((s)->f)) - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_BASE_CAPI_H_ diff --git a/cef1/include/capi/cef_browser_capi.h b/cef1/include/capi/cef_browser_capi.h deleted file mode 100644 index 3a0ac0299..000000000 --- a/cef1/include/capi/cef_browser_capi.h +++ /dev/null @@ -1,330 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_BROWSER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure used to represent a browser window. The functions of this structure -// may be called on any thread unless otherwise indicated in the comments. -/// -typedef struct _cef_browser_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Call this function before destroying a contained browser window. This - // function performs any internal cleanup that may be needed before the - // browser window is destroyed. - /// - void (CEF_CALLBACK *parent_window_will_close)(struct _cef_browser_t* self); - - /// - // Closes this browser window. - /// - void (CEF_CALLBACK *close_browser)(struct _cef_browser_t* self); - - /// - // Returns true (1) if the browser can navigate backwards. - /// - int (CEF_CALLBACK *can_go_back)(struct _cef_browser_t* self); - - /// - // Navigate backwards. - /// - void (CEF_CALLBACK *go_back)(struct _cef_browser_t* self); - - /// - // Returns true (1) if the browser can navigate forwards. - /// - int (CEF_CALLBACK *can_go_forward)(struct _cef_browser_t* self); - - /// - // Navigate forwards. - /// - void (CEF_CALLBACK *go_forward)(struct _cef_browser_t* self); - - /// - // Reload the current page. - /// - void (CEF_CALLBACK *reload)(struct _cef_browser_t* self); - - /// - // Reload the current page ignoring any cached data. - /// - void (CEF_CALLBACK *reload_ignore_cache)(struct _cef_browser_t* self); - - /// - // Stop loading the page. - /// - void (CEF_CALLBACK *stop_load)(struct _cef_browser_t* self); - - /// - // Set focus for the browser window. If |enable| is true (1) focus will be set - // to the window. Otherwise, focus will be removed. - /// - void (CEF_CALLBACK *set_focus)(struct _cef_browser_t* self, int enable); - - /// - // Retrieve the window handle for this browser. - /// - cef_window_handle_t (CEF_CALLBACK *get_window_handle)( - struct _cef_browser_t* self); - - /// - // Retrieve the window handle of the browser that opened this browser. Will - // return NULL for non-popup windows. This function can be used in combination - // with custom handling of modal windows. - /// - cef_window_handle_t (CEF_CALLBACK *get_opener_window_handle)( - struct _cef_browser_t* self); - - /// - // Returns the globally unique identifier for this browser. - /// - int (CEF_CALLBACK *get_identifier)(struct _cef_browser_t* self); - - /// - // Returns true (1) if the window is a popup window. - /// - int (CEF_CALLBACK *is_popup)(struct _cef_browser_t* self); - - // Returns true (1) if a document has been loaded in the browser. - int (CEF_CALLBACK *has_document)(struct _cef_browser_t* self); - - /// - // Returns the client for this browser. - /// - struct _cef_client_t* (CEF_CALLBACK *get_client)(struct _cef_browser_t* self); - - /// - // Returns the main (top-level) frame for the browser window. - /// - struct _cef_frame_t* (CEF_CALLBACK *get_main_frame)( - struct _cef_browser_t* self); - - /// - // Returns the focused frame for the browser window. This function should only - // be called on the UI thread. - /// - struct _cef_frame_t* (CEF_CALLBACK *get_focused_frame)( - struct _cef_browser_t* self); - - /// - // Returns the frame with the specified name, or NULL if not found. This - // function should only be called on the UI thread. - /// - struct _cef_frame_t* (CEF_CALLBACK *get_frame)(struct _cef_browser_t* self, - const cef_string_t* name); - - /// - // Returns the names of all existing frames. This function should only be - // called on the UI thread. - /// - void (CEF_CALLBACK *get_frame_names)(struct _cef_browser_t* self, - cef_string_list_t names); - - /// - // Search for |searchText|. |identifier| can be used to have multiple searches - // running simultaniously. |forward| indicates whether to search forward or - // backward within the page. |matchCase| indicates whether the search should - // be case-sensitive. |findNext| indicates whether this is the first request - // or a follow-up. - /// - void (CEF_CALLBACK *find)(struct _cef_browser_t* self, int identifier, - const cef_string_t* searchText, int forward, int matchCase, - int findNext); - - /// - // Cancel all searches that are currently going on. - /// - void (CEF_CALLBACK *stop_finding)(struct _cef_browser_t* self, - int clearSelection); - - /// - // Get the current zoom level. The default zoom level is 0.0. This function - // can only be called on the UI thread. - /// - double (CEF_CALLBACK *get_zoom_level)(struct _cef_browser_t* self); - - /// - // Change the zoom level to the specified value. Specify 0.0 to reset the zoom - // level. The change will be applied asynchronously on the UI thread. - /// - void (CEF_CALLBACK *set_zoom_level)(struct _cef_browser_t* self, - double zoomLevel); - - /// - // Clear the back/forward browsing history. - /// - void (CEF_CALLBACK *clear_history)(struct _cef_browser_t* self); - - /// - // Open developer tools in its own window. - /// - void (CEF_CALLBACK *show_dev_tools)(struct _cef_browser_t* self); - - /// - // Explicitly close the developer tools window if one exists for this browser - // instance. - /// - void (CEF_CALLBACK *close_dev_tools)(struct _cef_browser_t* self); - - /// - // Returns true (1) if window rendering is disabled. - /// - int (CEF_CALLBACK *is_window_rendering_disabled)(struct _cef_browser_t* self); - - /// - // Get the size of the specified element. This function should only be called - // on the UI thread. - /// - int (CEF_CALLBACK *get_size)(struct _cef_browser_t* self, - enum cef_paint_element_type_t type, int* width, int* height); - - /// - // Set the size of the specified element. This function is only used when - // window rendering is disabled. - /// - void (CEF_CALLBACK *set_size)(struct _cef_browser_t* self, - enum cef_paint_element_type_t type, int width, int height); - - /// - // Returns true (1) if a popup is currently visible. This function should only - // be called on the UI thread. - /// - int (CEF_CALLBACK *is_popup_visible)(struct _cef_browser_t* self); - - /// - // Hide the currently visible popup, if any. - /// - void (CEF_CALLBACK *hide_popup)(struct _cef_browser_t* self); - - /// - // Invalidate the |dirtyRect| region of the view. This function is only used - // when window rendering is disabled and will result in a call to - // HandlePaint(). - /// - void (CEF_CALLBACK *invalidate)(struct _cef_browser_t* self, - const cef_rect_t* dirtyRect); - - /// - // Get the raw image data contained in the specified element without - // performing validation. The specified |width| and |height| dimensions must - // match the current element size. On Windows |buffer| must be width*height*4 - // bytes in size and represents a BGRA image with an upper-left origin. This - // function should only be called on the UI thread. - /// - int (CEF_CALLBACK *get_image)(struct _cef_browser_t* self, - enum cef_paint_element_type_t type, int width, int height, - void* buffer); - - /// - // Send a key event to the browser. - /// - void (CEF_CALLBACK *send_key_event)(struct _cef_browser_t* self, - enum cef_key_type_t type, const struct _cef_key_info_t* keyInfo, - int modifiers); - - /// - // Send a mouse click event to the browser. The |x| and |y| coordinates are - // relative to the upper-left corner of the view. - /// - void (CEF_CALLBACK *send_mouse_click_event)(struct _cef_browser_t* self, - int x, int y, enum cef_mouse_button_type_t type, int mouseUp, - int clickCount); - - /// - // Send a mouse move event to the browser. The |x| and |y| coordinates are - // relative to the upper-left corner of the view. - /// - void (CEF_CALLBACK *send_mouse_move_event)(struct _cef_browser_t* self, int x, - int y, int mouseLeave); - - /// - // Send a mouse wheel event to the browser. The |x| and |y| coordinates are - // relative to the upper-left corner of the view. The |deltaX| and |deltaY| - // values represent the movement delta in the X and Y directions respectively. - /// - void (CEF_CALLBACK *send_mouse_wheel_event)(struct _cef_browser_t* self, - int x, int y, int deltaX, int deltaY); - - /// - // Send a focus event to the browser. - /// - void (CEF_CALLBACK *send_focus_event)(struct _cef_browser_t* self, - int setFocus); - - /// - // Send a capture lost event to the browser. - /// - void (CEF_CALLBACK *send_capture_lost_event)(struct _cef_browser_t* self); -} cef_browser_t; - - -/// -// Create a new browser window using the window parameters specified by -// |windowInfo|. All values will be copied internally and the actual window will -// be created on the UI thread. This function call will not block. -/// -CEF_EXPORT int cef_browser_create(cef_window_info_t* windowInfo, - struct _cef_client_t* client, const cef_string_t* url, - const struct _cef_browser_settings_t* settings); - -/// -// Create a new browser window using the window parameters specified by -// |windowInfo|. This function should only be called on the UI thread. -/// -CEF_EXPORT cef_browser_t* cef_browser_create_sync(cef_window_info_t* windowInfo, - struct _cef_client_t* client, const cef_string_t* url, - const struct _cef_browser_settings_t* settings); - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_BROWSER_CAPI_H_ diff --git a/cef1/include/capi/cef_client_capi.h b/cef1/include/capi/cef_client_capi.h deleted file mode 100644 index b51bab0c2..000000000 --- a/cef1/include/capi/cef_client_capi.h +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_CLIENT_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_CLIENT_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to provide handler implementations. -/// -typedef struct _cef_client_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Return the handler for browser life span events. - /// - struct _cef_life_span_handler_t* (CEF_CALLBACK *get_life_span_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for browser load status events. - /// - struct _cef_load_handler_t* (CEF_CALLBACK *get_load_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for browser request events. - /// - struct _cef_request_handler_t* (CEF_CALLBACK *get_request_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for browser display state events. - /// - struct _cef_display_handler_t* (CEF_CALLBACK *get_display_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for focus events. - /// - struct _cef_focus_handler_t* (CEF_CALLBACK *get_focus_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for keyboard events. - /// - struct _cef_keyboard_handler_t* (CEF_CALLBACK *get_keyboard_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for context menu events. - /// - struct _cef_menu_handler_t* (CEF_CALLBACK *get_menu_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for browser permission events. - /// - struct _cef_permission_handler_t* (CEF_CALLBACK *get_permission_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for printing events. - /// - struct _cef_print_handler_t* (CEF_CALLBACK *get_print_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for find result events. - /// - struct _cef_find_handler_t* (CEF_CALLBACK *get_find_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for JavaScript dialog events. - /// - struct _cef_jsdialog_handler_t* (CEF_CALLBACK *get_jsdialog_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for V8 context events. - /// - struct _cef_v8context_handler_t* (CEF_CALLBACK *get_v8context_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for off-screen rendering events. - /// - struct _cef_render_handler_t* (CEF_CALLBACK *get_render_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for drag events. - /// - struct _cef_drag_handler_t* (CEF_CALLBACK *get_drag_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for geolocation permissions requests. If no handler is - // provided geolocation access will be denied by default. - /// - struct _cef_geolocation_handler_t* (CEF_CALLBACK *get_geolocation_handler)( - struct _cef_client_t* self); - - /// - // Return the handler for zoom events. If no handler is provided the default - // zoom behavior will be used. - /// - struct _cef_zoom_handler_t* (CEF_CALLBACK *get_zoom_handler)( - struct _cef_client_t* self); -} cef_client_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_CLIENT_CAPI_H_ diff --git a/cef1/include/capi/cef_command_line_capi.h b/cef1/include/capi/cef_command_line_capi.h deleted file mode 100644 index 8e46d5492..000000000 --- a/cef1/include/capi/cef_command_line_capi.h +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_COMMAND_LINE_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_COMMAND_LINE_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure used to create and/or parse command line arguments. Arguments with -// '--', '-' and, on Windows, '/' prefixes are considered switches. Switches -// will always precede any arguments without switch prefixes. Switches can -// optionally have a value specified using the '=' delimiter (e.g. -// "-switch=value"). An argument of "--" will terminate switch parsing with all -// subsequent tokens, regardless of prefix, being interpreted as non-switch -// arguments. Switch names are considered case-insensitive. This structure can -// be used before cef_initialize() is called. -/// -typedef struct _cef_command_line_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Initialize the command line with the specified |argc| and |argv| values. - // The first argument must be the name of the program. This function is only - // supported on non-Windows platforms. - /// - void (CEF_CALLBACK *init_from_argv)(struct _cef_command_line_t* self, - int argc, const char* const* argv); - - /// - // Initialize the command line with the string returned by calling - // GetCommandLineW(). This function is only supported on Windows. - /// - void (CEF_CALLBACK *init_from_string)(struct _cef_command_line_t* self, - const cef_string_t* command_line); - - /// - // Constructs and returns the represented command line string. Use this - // function cautiously because quoting behavior is unclear. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_command_line_string)( - struct _cef_command_line_t* self); - - /// - // Get the program part of the command line string (the first item). - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_program)( - struct _cef_command_line_t* self); - - /// - // Set the program part of the command line string (the first item). - /// - void (CEF_CALLBACK *set_program)(struct _cef_command_line_t* self, - const cef_string_t* program); - - /// - // Returns true (1) if the command line has switches. - /// - int (CEF_CALLBACK *has_switches)(struct _cef_command_line_t* self); - - /// - // Returns true (1) if the command line contains the given switch. - /// - int (CEF_CALLBACK *has_switch)(struct _cef_command_line_t* self, - const cef_string_t* name); - - /// - // Returns the value associated with the given switch. If the switch has no - // value or isn't present this function returns the NULL string. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_switch_value)( - struct _cef_command_line_t* self, const cef_string_t* name); - - /// - // Returns the map of switch names and values. If a switch has no value an - // NULL string is returned. - /// - void (CEF_CALLBACK *get_switches)(struct _cef_command_line_t* self, - cef_string_map_t switches); - - /// - // Add a switch to the end of the command line. If the switch has no value - // pass an NULL value string. - /// - void (CEF_CALLBACK *append_switch)(struct _cef_command_line_t* self, - const cef_string_t* name); - - /// - // Add a switch with the specified value to the end of the command line. - /// - void (CEF_CALLBACK *append_switch_with_value)( - struct _cef_command_line_t* self, const cef_string_t* name, - const cef_string_t* value); - - /// - // True if there are remaining command line arguments. - /// - int (CEF_CALLBACK *has_arguments)(struct _cef_command_line_t* self); - - /// - // Get the remaining command line arguments. - /// - void (CEF_CALLBACK *get_arguments)(struct _cef_command_line_t* self, - cef_string_list_t arguments); - - /// - // Add an argument to the end of the command line. - /// - void (CEF_CALLBACK *append_argument)(struct _cef_command_line_t* self, - const cef_string_t* argument); -} cef_command_line_t; - - -/// -// Create a new cef_command_line_t instance. -/// -CEF_EXPORT cef_command_line_t* cef_command_line_create(); - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_COMMAND_LINE_CAPI_H_ diff --git a/cef1/include/capi/cef_content_filter_capi.h b/cef1/include/capi/cef_content_filter_capi.h deleted file mode 100644 index bc4fc0808..000000000 --- a/cef1/include/capi/cef_content_filter_capi.h +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_CONTENT_FILTER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_CONTENT_FILTER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure to implement for filtering response content. The functions of this -// structure will always be called on the UI thread. -/// -typedef struct _cef_content_filter_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Set |substitute_data| to the replacement for the data in |data| if data - // should be modified. - /// - void (CEF_CALLBACK *process_data)(struct _cef_content_filter_t* self, - const void* data, int data_size, - struct _cef_stream_reader_t** substitute_data); - - /// - // Called when there is no more data to be processed. It is expected that - // whatever data was retained in the last process_data() call, it should be - // returned now by setting |remainder| if appropriate. - /// - void (CEF_CALLBACK *drain)(struct _cef_content_filter_t* self, - struct _cef_stream_reader_t** remainder); -} cef_content_filter_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_CONTENT_FILTER_CAPI_H_ diff --git a/cef1/include/capi/cef_cookie_capi.h b/cef1/include/capi/cef_cookie_capi.h deleted file mode 100644 index de795e921..000000000 --- a/cef1/include/capi/cef_cookie_capi.h +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_COOKIE_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_COOKIE_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure used for managing cookies. The functions of this structure may be -// called on any thread unless otherwise indicated. -/// -typedef struct _cef_cookie_manager_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Set the schemes supported by this manager. By default only "http" and - // "https" schemes are supported. Must be called before any cookies are - // accessed. - /// - void (CEF_CALLBACK *set_supported_schemes)(struct _cef_cookie_manager_t* self, - cef_string_list_t schemes); - - /// - // Visit all cookies. The returned cookies are ordered by longest path, then - // by earliest creation date. Returns false (0) if cookies cannot be accessed. - /// - int (CEF_CALLBACK *visit_all_cookies)(struct _cef_cookie_manager_t* self, - struct _cef_cookie_visitor_t* visitor); - - /// - // Visit a subset of cookies. The results are filtered by the given url - // scheme, host, domain and path. If |includeHttpOnly| is true (1) HTTP-only - // cookies will also be included in the results. The returned cookies are - // ordered by longest path, then by earliest creation date. Returns false (0) - // if cookies cannot be accessed. - /// - int (CEF_CALLBACK *visit_url_cookies)(struct _cef_cookie_manager_t* self, - const cef_string_t* url, int includeHttpOnly, - struct _cef_cookie_visitor_t* visitor); - - /// - // Sets a cookie given a valid URL and explicit user-provided cookie - // attributes. This function expects each attribute to be well-formed. It will - // check for disallowed characters (e.g. the ';' character is disallowed - // within the cookie value attribute) and will return false (0) without - // setting the cookie if such characters are found. This function must be - // called on the IO thread. - /// - int (CEF_CALLBACK *set_cookie)(struct _cef_cookie_manager_t* self, - const cef_string_t* url, const struct _cef_cookie_t* cookie); - - /// - // Delete all cookies that match the specified parameters. If both |url| and - // values |cookie_name| are specified all host and domain cookies matching - // both will be deleted. If only |url| is specified all host cookies (but not - // domain cookies) irrespective of path will be deleted. If |url| is NULL all - // cookies for all hosts and domains will be deleted. Returns false (0) if a - // non- NULL invalid URL is specified or if cookies cannot be accessed. This - // function must be called on the IO thread. - /// - int (CEF_CALLBACK *delete_cookies)(struct _cef_cookie_manager_t* self, - const cef_string_t* url, const cef_string_t* cookie_name); - - /// - // Sets the directory path that will be used for storing cookie data. If - // |path| is NULL data will be stored in memory only. Returns false (0) if - // cookies cannot be accessed. - /// - int (CEF_CALLBACK *set_storage_path)(struct _cef_cookie_manager_t* self, - const cef_string_t* path); -} cef_cookie_manager_t; - - -/// -// Returns the global cookie manager. By default data will be stored at -// CefSettings.cache_path if specified or in memory otherwise. -/// -CEF_EXPORT cef_cookie_manager_t* cef_cookie_manager_get_global_manager(); - -/// -// Creates a new cookie manager. If |path| is NULL data will be stored in memory -// only. Returns NULL if creation fails. -/// -CEF_EXPORT cef_cookie_manager_t* cef_cookie_manager_create_manager( - const cef_string_t* path); - - -/// -// Structure to implement for visiting cookie values. The functions of this -// structure will always be called on the IO thread. -/// -typedef struct _cef_cookie_visitor_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Method that will be called once for each cookie. |count| is the 0-based - // index for the current cookie. |total| is the total number of cookies. Set - // |deleteCookie| to true (1) to delete the cookie currently being visited. - // Return false (0) to stop visiting cookies. This function may never be - // called if no cookies are found. - /// - int (CEF_CALLBACK *visit)(struct _cef_cookie_visitor_t* self, - const struct _cef_cookie_t* cookie, int count, int total, - int* deleteCookie); -} cef_cookie_visitor_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_COOKIE_CAPI_H_ diff --git a/cef1/include/capi/cef_display_handler_capi.h b/cef1/include/capi/cef_display_handler_capi.h deleted file mode 100644 index 750236809..000000000 --- a/cef1/include/capi/cef_display_handler_capi.h +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_DISPLAY_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_DISPLAY_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events related to browser display state. -// The functions of this structure will be called on the UI thread. -/// -typedef struct _cef_display_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called when the navigation state has changed. - /// - void (CEF_CALLBACK *on_nav_state_change)(struct _cef_display_handler_t* self, - struct _cef_browser_t* browser, int canGoBack, int canGoForward); - - /// - // Called when a frame's address has changed. - /// - void (CEF_CALLBACK *on_address_change)(struct _cef_display_handler_t* self, - struct _cef_browser_t* browser, struct _cef_frame_t* frame, - const cef_string_t* url); - - /// - // Called when the size of the content area has changed. - /// - void (CEF_CALLBACK *on_contents_size_change)( - struct _cef_display_handler_t* self, struct _cef_browser_t* browser, - struct _cef_frame_t* frame, int width, int height); - - /// - // Called when the page title changes. - /// - void (CEF_CALLBACK *on_title_change)(struct _cef_display_handler_t* self, - struct _cef_browser_t* browser, const cef_string_t* title); - - /// - // Called when the Favicon URL for a page changes. - /// - void (CEF_CALLBACK *on_favicon_urlchange)(struct _cef_display_handler_t* self, - struct _cef_browser_t* browser, cef_string_list_t icon_urls); - - /// - // Called when the browser is about to display a tooltip. |text| contains the - // text that will be displayed in the tooltip. To handle the display of the - // tooltip yourself return true (1). Otherwise, you can optionally modify - // |text| and then return false (0) to allow the browser to display the - // tooltip. - /// - int (CEF_CALLBACK *on_tooltip)(struct _cef_display_handler_t* self, - struct _cef_browser_t* browser, cef_string_t* text); - - /// - // Called when the browser receives a status message. |text| contains the text - // that will be displayed in the status message and |type| indicates the - // status message type. - /// - void (CEF_CALLBACK *on_status_message)(struct _cef_display_handler_t* self, - struct _cef_browser_t* browser, const cef_string_t* value, - enum cef_handler_statustype_t type); - - /// - // Called to display a console message. Return true (1) to stop the message - // from being output to the console. - /// - int (CEF_CALLBACK *on_console_message)(struct _cef_display_handler_t* self, - struct _cef_browser_t* browser, const cef_string_t* message, - const cef_string_t* source, int line); -} cef_display_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_DISPLAY_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_dom_capi.h b/cef1/include/capi/cef_dom_capi.h deleted file mode 100644 index d3d64f87a..000000000 --- a/cef1/include/capi/cef_dom_capi.h +++ /dev/null @@ -1,441 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_DOM_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_DOM_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure to implement for visiting the DOM. The functions of this structure -// will be called on the UI thread. -/// -typedef struct _cef_domvisitor_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Method executed for visiting the DOM. The document object passed to this - // function represents a snapshot of the DOM at the time this function is - // executed. DOM objects are only valid for the scope of this function. Do not - // keep references to or attempt to access any DOM objects outside the scope - // of this function. - /// - void (CEF_CALLBACK *visit)(struct _cef_domvisitor_t* self, - struct _cef_domdocument_t* document); -} cef_domvisitor_t; - - -/// -// Structure used to represent a DOM document. The functions of this structure -// should only be called on the UI thread. -/// -typedef struct _cef_domdocument_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Returns the document type. - /// - enum cef_dom_document_type_t (CEF_CALLBACK *get_type)( - struct _cef_domdocument_t* self); - - /// - // Returns the root document node. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_document)( - struct _cef_domdocument_t* self); - - /// - // Returns the BODY node of an HTML document. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_body)( - struct _cef_domdocument_t* self); - - /// - // Returns the HEAD node of an HTML document. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_head)( - struct _cef_domdocument_t* self); - - /// - // Returns the title of an HTML document. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_title)( - struct _cef_domdocument_t* self); - - /// - // Returns the document element with the specified ID value. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_element_by_id)( - struct _cef_domdocument_t* self, const cef_string_t* id); - - /// - // Returns the node that currently has keyboard focus. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_focused_node)( - struct _cef_domdocument_t* self); - - /// - // Returns true (1) if a portion of the document is selected. - /// - int (CEF_CALLBACK *has_selection)(struct _cef_domdocument_t* self); - - /// - // Returns the selection start node. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_selection_start_node)( - struct _cef_domdocument_t* self); - - /// - // Returns the selection offset within the start node. - /// - int (CEF_CALLBACK *get_selection_start_offset)( - struct _cef_domdocument_t* self); - - /// - // Returns the selection end node. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_selection_end_node)( - struct _cef_domdocument_t* self); - - /// - // Returns the selection offset within the end node. - /// - int (CEF_CALLBACK *get_selection_end_offset)(struct _cef_domdocument_t* self); - - /// - // Returns the contents of this selection as markup. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_selection_as_markup)( - struct _cef_domdocument_t* self); - - /// - // Returns the contents of this selection as text. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_selection_as_text)( - struct _cef_domdocument_t* self); - - /// - // Returns the base URL for the document. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_base_url)( - struct _cef_domdocument_t* self); - - /// - // Returns a complete URL based on the document base URL and the specified - // partial URL. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_complete_url)( - struct _cef_domdocument_t* self, const cef_string_t* partialURL); -} cef_domdocument_t; - - -/// -// Structure used to represent a DOM node. The functions of this structure -// should only be called on the UI thread. -/// -typedef struct _cef_domnode_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Returns the type for this node. - /// - enum cef_dom_node_type_t (CEF_CALLBACK *get_type)( - struct _cef_domnode_t* self); - - /// - // Returns true (1) if this is a text node. - /// - int (CEF_CALLBACK *is_text)(struct _cef_domnode_t* self); - - /// - // Returns true (1) if this is an element node. - /// - int (CEF_CALLBACK *is_element)(struct _cef_domnode_t* self); - - /// - // Returns true (1) if this is a form control element node. - /// - int (CEF_CALLBACK *is_form_control_element)(struct _cef_domnode_t* self); - - /// - // Returns the type of this form control element node. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_form_control_element_type)( - struct _cef_domnode_t* self); - - /// - // Returns true (1) if this object is pointing to the same handle as |that| - // object. - /// - int (CEF_CALLBACK *is_same)(struct _cef_domnode_t* self, - struct _cef_domnode_t* that); - - /// - // Returns the name of this node. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_name)(struct _cef_domnode_t* self); - - /// - // Returns the value of this node. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_value)(struct _cef_domnode_t* self); - - /// - // Set the value of this node. Returns true (1) on success. - /// - int (CEF_CALLBACK *set_value)(struct _cef_domnode_t* self, - const cef_string_t* value); - - /// - // Returns the contents of this node as markup. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_as_markup)( - struct _cef_domnode_t* self); - - /// - // Returns the document associated with this node. - /// - struct _cef_domdocument_t* (CEF_CALLBACK *get_document)( - struct _cef_domnode_t* self); - - /// - // Returns the parent node. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_parent)( - struct _cef_domnode_t* self); - - /// - // Returns the previous sibling node. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_previous_sibling)( - struct _cef_domnode_t* self); - - /// - // Returns the next sibling node. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_next_sibling)( - struct _cef_domnode_t* self); - - /// - // Returns true (1) if this node has child nodes. - /// - int (CEF_CALLBACK *has_children)(struct _cef_domnode_t* self); - - /// - // Return the first child node. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_first_child)( - struct _cef_domnode_t* self); - - /// - // Returns the last child node. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_last_child)( - struct _cef_domnode_t* self); - - /// - // Add an event listener to this node for the specified event type. If - // |useCapture| is true (1) then this listener will be considered a capturing - // listener. Capturing listeners will recieve all events of the specified type - // before the events are dispatched to any other event targets beneath the - // current node in the tree. Events which are bubbling upwards through the - // tree will not trigger a capturing listener. Separate calls to this function - // can be used to register the same listener with and without capture. See - // WebCore/dom/EventNames.h for the list of supported event types. - /// - void (CEF_CALLBACK *add_event_listener)(struct _cef_domnode_t* self, - const cef_string_t* eventType, struct _cef_domevent_listener_t* listener, - int useCapture); - - - // The following functions are valid only for element nodes. - - /// - // Returns the tag name of this element. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_element_tag_name)( - struct _cef_domnode_t* self); - - /// - // Returns true (1) if this element has attributes. - /// - int (CEF_CALLBACK *has_element_attributes)(struct _cef_domnode_t* self); - - /// - // Returns true (1) if this element has an attribute named |attrName|. - /// - int (CEF_CALLBACK *has_element_attribute)(struct _cef_domnode_t* self, - const cef_string_t* attrName); - - /// - // Returns the element attribute named |attrName|. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_element_attribute)( - struct _cef_domnode_t* self, const cef_string_t* attrName); - - /// - // Returns a map of all element attributes. - /// - void (CEF_CALLBACK *get_element_attributes)(struct _cef_domnode_t* self, - cef_string_map_t attrMap); - - /// - // Set the value for the element attribute named |attrName|. Returns true (1) - // on success. - /// - int (CEF_CALLBACK *set_element_attribute)(struct _cef_domnode_t* self, - const cef_string_t* attrName, const cef_string_t* value); - - /// - // Returns the inner text of the element. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_element_inner_text)( - struct _cef_domnode_t* self); -} cef_domnode_t; - - -/// -// Structure used to represent a DOM event. The functions of this structure -// should only be called on the UI thread. -/// -typedef struct _cef_domevent_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Returns the event type. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_type)(struct _cef_domevent_t* self); - - /// - // Returns the event category. - /// - enum cef_dom_event_category_t (CEF_CALLBACK *get_category)( - struct _cef_domevent_t* self); - - /// - // Returns the event processing phase. - /// - enum cef_dom_event_phase_t (CEF_CALLBACK *get_phase)( - struct _cef_domevent_t* self); - - /// - // Returns true (1) if the event can bubble up the tree. - /// - int (CEF_CALLBACK *can_bubble)(struct _cef_domevent_t* self); - - /// - // Returns true (1) if the event can be canceled. - /// - int (CEF_CALLBACK *can_cancel)(struct _cef_domevent_t* self); - - /// - // Returns the document associated with this event. - /// - struct _cef_domdocument_t* (CEF_CALLBACK *get_document)( - struct _cef_domevent_t* self); - - /// - // Returns the target of the event. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_target)( - struct _cef_domevent_t* self); - - /// - // Returns the current target of the event. - /// - struct _cef_domnode_t* (CEF_CALLBACK *get_current_target)( - struct _cef_domevent_t* self); -} cef_domevent_t; - - -/// -// Structure to implement for handling DOM events. The functions of this -// structure will be called on the UI thread. -/// -typedef struct _cef_domevent_listener_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called when an event is received. The event object passed to this function - // contains a snapshot of the DOM at the time this function is executed. DOM - // objects are only valid for the scope of this function. Do not keep - // references to or attempt to access any DOM objects outside the scope of - // this function. - /// - void (CEF_CALLBACK *handle_event)(struct _cef_domevent_listener_t* self, - struct _cef_domevent_t* event); -} cef_domevent_listener_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_DOM_CAPI_H_ diff --git a/cef1/include/capi/cef_download_handler_capi.h b/cef1/include/capi/cef_download_handler_capi.h deleted file mode 100644 index 5b83a2b26..000000000 --- a/cef1/include/capi/cef_download_handler_capi.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_DOWNLOAD_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_DOWNLOAD_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure used to handle file downloads. The functions of this structure will -// always be called on the UI thread. -/// -typedef struct _cef_download_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // A portion of the file contents have been received. This function will be - // called multiple times until the download is complete. Return |true (1)| to - // continue receiving data and |false (0)| to cancel. - /// - int (CEF_CALLBACK *received_data)(struct _cef_download_handler_t* self, - void* data, int data_size); - - /// - // The download is complete. - /// - void (CEF_CALLBACK *complete)(struct _cef_download_handler_t* self); -} cef_download_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_DOWNLOAD_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_drag_data_capi.h b/cef1/include/capi/cef_drag_data_capi.h deleted file mode 100644 index 090c38082..000000000 --- a/cef1/include/capi/cef_drag_data_capi.h +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_DRAG_DATA_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_DRAG_DATA_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure used to represent drag data. The functions of this structure may be -// called on any thread. -/// -typedef struct _cef_drag_data_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Returns true (1) if the drag data is a link. - /// - int (CEF_CALLBACK *is_link)(struct _cef_drag_data_t* self); - - /// - // Returns true (1) if the drag data is a text or html fragment. - /// - int (CEF_CALLBACK *is_fragment)(struct _cef_drag_data_t* self); - - /// - // Returns true (1) if the drag data is a file. - /// - int (CEF_CALLBACK *is_file)(struct _cef_drag_data_t* self); - - /// - // Return the link URL that is being dragged. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_link_url)( - struct _cef_drag_data_t* self); - - /// - // Return the title associated with the link being dragged. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_link_title)( - struct _cef_drag_data_t* self); - - /// - // Return the metadata, if any, associated with the link being dragged. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_link_metadata)( - struct _cef_drag_data_t* self); - - /// - // Return the plain text fragment that is being dragged. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_fragment_text)( - struct _cef_drag_data_t* self); - - /// - // Return the text/html fragment that is being dragged. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_fragment_html)( - struct _cef_drag_data_t* self); - - /// - // Return the base URL that the fragment came from. This value is used for - // resolving relative URLs and may be NULL. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_fragment_base_url)( - struct _cef_drag_data_t* self); - - /// - // Return the name of the file being dragged out of the browser window. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_file_name)( - struct _cef_drag_data_t* self); - - /// - // Retrieve the list of file names that are being dragged into the browser - // window. - /// - int (CEF_CALLBACK *get_file_names)(struct _cef_drag_data_t* self, - cef_string_list_t names); -} cef_drag_data_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_DRAG_DATA_CAPI_H_ diff --git a/cef1/include/capi/cef_drag_handler_capi.h b/cef1/include/capi/cef_drag_handler_capi.h deleted file mode 100644 index 7fb2f48f7..000000000 --- a/cef1/include/capi/cef_drag_handler_capi.h +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_DRAG_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_DRAG_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events related to dragging. The functions -// of this structure will be called on the UI thread. -/// -typedef struct _cef_drag_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called when the browser window initiates a drag event. |dragData| contains - // the drag event data and |mask| represents the type of drag operation. - // Return false (0) for default drag handling behavior or true (1) to cancel - // the drag event. - /// - int (CEF_CALLBACK *on_drag_start)(struct _cef_drag_handler_t* self, - struct _cef_browser_t* browser, struct _cef_drag_data_t* dragData, - enum cef_drag_operations_mask_t mask); - - /// - // Called when an external drag event enters the browser window. |dragData| - // contains the drag event data and |mask| represents the type of drag - // operation. Return false (0) for default drag handling behavior or true (1) - // to cancel the drag event. - /// - int (CEF_CALLBACK *on_drag_enter)(struct _cef_drag_handler_t* self, - struct _cef_browser_t* browser, struct _cef_drag_data_t* dragData, - enum cef_drag_operations_mask_t mask); -} cef_drag_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_DRAG_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_find_handler_capi.h b/cef1/include/capi/cef_find_handler_capi.h deleted file mode 100644 index 00df544a9..000000000 --- a/cef1/include/capi/cef_find_handler_capi.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_FIND_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_FIND_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events related to find results. The -// functions of this structure will be called on the UI thread. -/// -typedef struct _cef_find_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called to report find results returned by cef_browser_t::find(). - // |identifer| is the identifier passed to cef_browser_t::find(), |count| is - // the number of matches currently identified, |selectionRect| is the location - // of where the match was found (in window coordinates), |activeMatchOrdinal| - // is the current position in the search results, and |finalUpdate| is true - // (1) if this is the last find notification. - /// - void (CEF_CALLBACK *on_find_result)(struct _cef_find_handler_t* self, - struct _cef_browser_t* browser, int identifier, int count, - const cef_rect_t* selectionRect, int activeMatchOrdinal, - int finalUpdate); -} cef_find_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_FIND_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_focus_handler_capi.h b/cef1/include/capi/cef_focus_handler_capi.h deleted file mode 100644 index feefac790..000000000 --- a/cef1/include/capi/cef_focus_handler_capi.h +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_FOCUS_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_FOCUS_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events related to focus. The functions of -// this structure will be called on the UI thread. -/// -typedef struct _cef_focus_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called when the browser component is about to loose focus. For instance, if - // focus was on the last HTML element and the user pressed the TAB key. |next| - // will be true (1) if the browser is giving focus to the next component and - // false (0) if the browser is giving focus to the previous component. - /// - void (CEF_CALLBACK *on_take_focus)(struct _cef_focus_handler_t* self, - struct _cef_browser_t* browser, int next); - - /// - // Called when the browser component is requesting focus. |source| indicates - // where the focus request is originating from. Return false (0) to allow the - // focus to be set or true (1) to cancel setting the focus. - /// - int (CEF_CALLBACK *on_set_focus)(struct _cef_focus_handler_t* self, - struct _cef_browser_t* browser, enum cef_handler_focus_source_t source); - - /// - // Called when a new node in the the browser gets focus. The |node| value may - // be NULL if no specific node has gained focus. The node object passed to - // this function represents a snapshot of the DOM at the time this function is - // executed. DOM objects are only valid for the scope of this function. Do not - // keep references to or attempt to access any DOM objects outside the scope - // of this function. - /// - void (CEF_CALLBACK *on_focused_node_changed)( - struct _cef_focus_handler_t* self, struct _cef_browser_t* browser, - struct _cef_frame_t* frame, struct _cef_domnode_t* node); -} cef_focus_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_FOCUS_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_frame_capi.h b/cef1/include/capi/cef_frame_capi.h deleted file mode 100644 index da418feea..000000000 --- a/cef1/include/capi/cef_frame_capi.h +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_FRAME_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_FRAME_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure used to represent a frame in the browser window. The functions of -// this structure may be called on any thread unless otherwise indicated in the -// comments. -/// -typedef struct _cef_frame_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Execute undo in this frame. - /// - void (CEF_CALLBACK *undo)(struct _cef_frame_t* self); - - /// - // Execute redo in this frame. - /// - void (CEF_CALLBACK *redo)(struct _cef_frame_t* self); - - /// - // Execute cut in this frame. - /// - void (CEF_CALLBACK *cut)(struct _cef_frame_t* self); - - /// - // Execute copy in this frame. - /// - void (CEF_CALLBACK *copy)(struct _cef_frame_t* self); - - /// - // Execute paste in this frame. - /// - void (CEF_CALLBACK *paste)(struct _cef_frame_t* self); - - /// - // Execute delete in this frame. - /// - void (CEF_CALLBACK *del)(struct _cef_frame_t* self); - - /// - // Execute select all in this frame. - /// - void (CEF_CALLBACK *select_all)(struct _cef_frame_t* self); - - /// - // Execute printing in the this frame. The user will be prompted with the - // print dialog appropriate to the operating system. - /// - void (CEF_CALLBACK *print)(struct _cef_frame_t* self); - - /// - // Save this frame's HTML source to a temporary file and open it in the - // default text viewing application. - /// - void (CEF_CALLBACK *view_source)(struct _cef_frame_t* self); - - /// - // Returns this frame's HTML source as a string. This function should only be - // called on the UI thread. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_source)(struct _cef_frame_t* self); - - /// - // Returns this frame's display text as a string. This function should only be - // called on the UI thread. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_text)(struct _cef_frame_t* self); - - /// - // Load the request represented by the |request| object. - /// - void (CEF_CALLBACK *load_request)(struct _cef_frame_t* self, - struct _cef_request_t* request); - - /// - // Load the specified |url|. - /// - void (CEF_CALLBACK *load_url)(struct _cef_frame_t* self, - const cef_string_t* url); - - /// - // Load the contents of |string_val| with the optional dummy target |url|. - /// - void (CEF_CALLBACK *load_string)(struct _cef_frame_t* self, - const cef_string_t* string_val, const cef_string_t* url); - - /// - // Load the contents of |stream| with the optional dummy target |url|. - /// - void (CEF_CALLBACK *load_stream)(struct _cef_frame_t* self, - struct _cef_stream_reader_t* stream, const cef_string_t* url); - - /// - // Execute a string of JavaScript code in this frame. The |script_url| - // parameter is the URL where the script in question can be found, if any. The - // renderer may request this URL to show the developer the source of the - // error. The |start_line| parameter is the base line number to use for error - // reporting. - /// - void (CEF_CALLBACK *execute_java_script)(struct _cef_frame_t* self, - const cef_string_t* jsCode, const cef_string_t* scriptUrl, - int startLine); - - /// - // Returns true (1) if this is the main (top-level) frame. - /// - int (CEF_CALLBACK *is_main)(struct _cef_frame_t* self); - - /// - // Returns true (1) if this is the focused frame. This function should only be - // called on the UI thread. - /// - int (CEF_CALLBACK *is_focused)(struct _cef_frame_t* self); - - /// - // Returns the name for this frame. If the frame has an assigned name (for - // example, set via the iframe "name" attribute) then that value will be - // returned. Otherwise a unique name will be constructed based on the frame - // parent hierarchy. The main (top-level) frame will always have an NULL name - // value. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_name)(struct _cef_frame_t* self); - - /// - // Returns the globally unique identifier for this frame. - /// - int64 (CEF_CALLBACK *get_identifier)(struct _cef_frame_t* self); - - /// - // Returns the parent of this frame or NULL if this is the main (top-level) - // frame. This function should only be called on the UI thread. - /// - struct _cef_frame_t* (CEF_CALLBACK *get_parent)(struct _cef_frame_t* self); - - /// - // Returns the URL currently loaded in this frame. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_url)(struct _cef_frame_t* self); - - /// - // Returns the browser that this frame belongs to. - /// - struct _cef_browser_t* (CEF_CALLBACK *get_browser)(struct _cef_frame_t* self); - - /// - // Visit the DOM document. - /// - void (CEF_CALLBACK *visit_dom)(struct _cef_frame_t* self, - struct _cef_domvisitor_t* visitor); - - /// - // Get the V8 context associated with the frame. This function should only be - // called on the UI thread. - /// - struct _cef_v8context_t* (CEF_CALLBACK *get_v8context)( - struct _cef_frame_t* self); -} cef_frame_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_FRAME_CAPI_H_ diff --git a/cef1/include/capi/cef_geolocation_capi.h b/cef1/include/capi/cef_geolocation_capi.h deleted file mode 100644 index c4ec6aa6a..000000000 --- a/cef1/include/capi/cef_geolocation_capi.h +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_GEOLOCATION_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_GEOLOCATION_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Request a one-time geolocation update. This function bypasses any user -// permission checks so should only be used by code that is allowed to access -// location information. -/// -CEF_EXPORT int cef_get_geolocation( - struct _cef_get_geolocation_callback_t* callback); - -/// -// Implement this structure to receive geolocation updates. The functions of -// this structure will be called on the browser process UI thread. -/// -typedef struct _cef_get_geolocation_callback_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called with the 'best available' location information or, if the location - // update failed, with error information. - /// - void (CEF_CALLBACK *on_location_update)( - struct _cef_get_geolocation_callback_t* self, - const struct _cef_geoposition_t* position); -} cef_get_geolocation_callback_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_GEOLOCATION_CAPI_H_ diff --git a/cef1/include/capi/cef_geolocation_handler_capi.h b/cef1/include/capi/cef_geolocation_handler_capi.h deleted file mode 100644 index adf665b1b..000000000 --- a/cef1/include/capi/cef_geolocation_handler_capi.h +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_GEOLOCATION_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_GEOLOCATION_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Callback structure used for asynchronous continuation of geolocation -// permission requests. -/// -typedef struct _cef_geolocation_callback_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Call to allow or deny geolocation access. - /// - void (CEF_CALLBACK *cont)(struct _cef_geolocation_callback_t* self, - int allow); -} cef_geolocation_callback_t; - - -/// -// Implement this structure to handle events related to geolocation permission -// requests. The functions of this structure will be called on the browser -// process UI thread. -/// -typedef struct _cef_geolocation_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called when a page requests permission to access geolocation information. - // |requesting_url| is the URL requesting permission and |request_id| is the - // unique ID for the permission request. Call - // cef_geolocation_callback_t::Continue to allow or deny the permission - // request. - /// - void (CEF_CALLBACK *on_request_geolocation_permission)( - struct _cef_geolocation_handler_t* self, struct _cef_browser_t* browser, - const cef_string_t* requesting_url, int request_id, - struct _cef_geolocation_callback_t* callback); - - /// - // Called when a geolocation access request is canceled. |requesting_url| is - // the URL that originally requested permission and |request_id| is the unique - // ID for the permission request. - /// - void (CEF_CALLBACK *on_cancel_geolocation_permission)( - struct _cef_geolocation_handler_t* self, struct _cef_browser_t* browser, - const cef_string_t* requesting_url, int request_id); -} cef_geolocation_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_GEOLOCATION_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_jsdialog_handler_capi.h b/cef1/include/capi/cef_jsdialog_handler_capi.h deleted file mode 100644 index 141adf22c..000000000 --- a/cef1/include/capi/cef_jsdialog_handler_capi.h +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_JSDIALOG_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_JSDIALOG_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events related to JavaScript dialogs. The -// functions of this structure will be called on the UI thread. -/// -typedef struct _cef_jsdialog_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called to run a JavaScript alert message. Return false (0) to display the - // default alert or true (1) if you displayed a custom alert. - /// - int (CEF_CALLBACK *on_jsalert)(struct _cef_jsdialog_handler_t* self, - struct _cef_browser_t* browser, struct _cef_frame_t* frame, - const cef_string_t* message); - - /// - // Called to run a JavaScript confirm request. Return false (0) to display the - // default alert or true (1) if you displayed a custom alert. If you handled - // the alert set |retval| to true (1) if the user accepted the confirmation. - /// - int (CEF_CALLBACK *on_jsconfirm)(struct _cef_jsdialog_handler_t* self, - struct _cef_browser_t* browser, struct _cef_frame_t* frame, - const cef_string_t* message, int* retval); - - /// - // Called to run a JavaScript prompt request. Return false (0) to display the - // default prompt or true (1) if you displayed a custom prompt. If you handled - // the prompt set |retval| to true (1) if the user accepted the prompt and - // request and |result| to the resulting value. - /// - int (CEF_CALLBACK *on_jsprompt)(struct _cef_jsdialog_handler_t* self, - struct _cef_browser_t* browser, struct _cef_frame_t* frame, - const cef_string_t* message, const cef_string_t* defaultValue, - int* retval, cef_string_t* result); -} cef_jsdialog_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_JSDIALOG_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_keyboard_handler_capi.h b/cef1/include/capi/cef_keyboard_handler_capi.h deleted file mode 100644 index 4772a04f4..000000000 --- a/cef1/include/capi/cef_keyboard_handler_capi.h +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_KEYBOARD_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_KEYBOARD_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events related to keyboard input. The -// functions of this structure will be called on the UI thread. -/// -typedef struct _cef_keyboard_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called when the browser component receives a keyboard event. This function - // is called both before the event is passed to the renderer and after - // JavaScript in the page has had a chance to handle the event. |type| is the - // type of keyboard event, |code| is the windows scan-code for the event, - // |modifiers| is a set of bit- flags describing any pressed modifier keys and - // |isSystemKey| is true (1) if Windows considers this a 'system key' message - // (see http://msdn.microsoft.com/en-us/library/ms646286(VS.85).aspx). If - // |isAfterJavaScript| is true (1) then JavaScript in the page has had a - // chance to handle the event and has chosen not to. Only RAWKEYDOWN, KEYDOWN - // and CHAR events will be sent with |isAfterJavaScript| set to true (1). - // Return true (1) if the keyboard event was handled or false (0) to allow - // continued handling of the event by the renderer. - /// - int (CEF_CALLBACK *on_key_event)(struct _cef_keyboard_handler_t* self, - struct _cef_browser_t* browser, enum cef_handler_keyevent_type_t type, - int code, int modifiers, int isSystemKey, int isAfterJavaScript); -} cef_keyboard_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_KEYBOARD_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_life_span_handler_capi.h b/cef1/include/capi/cef_life_span_handler_capi.h deleted file mode 100644 index 0220e2667..000000000 --- a/cef1/include/capi/cef_life_span_handler_capi.h +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_LIFE_SPAN_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_LIFE_SPAN_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events related to browser life span. The -// functions of this structure will be called on the UI thread. -/// -typedef struct _cef_life_span_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called before a new popup window is created. The |parentBrowser| parameter - // will point to the parent browser window. The |popupFeatures| parameter will - // contain information about the style of popup window requested. Return false - // (0) to have the framework create the new popup window based on the - // parameters in |windowInfo|. Return true (1) to cancel creation of the popup - // window. By default, a newly created popup window will have the same client - // and settings as the parent window. To change the client for the new window - // modify the object that |client| points to. To change the settings for the - // new window modify the |settings| structure. - /// - int (CEF_CALLBACK *on_before_popup)(struct _cef_life_span_handler_t* self, - struct _cef_browser_t* parentBrowser, - const struct _cef_popup_features_t* popupFeatures, - struct _cef_window_info_t* windowInfo, const cef_string_t* url, - struct _cef_client_t** client, - struct _cef_browser_settings_t* settings); - - /// - // Called after a new window is created. - /// - void (CEF_CALLBACK *on_after_created)(struct _cef_life_span_handler_t* self, - struct _cef_browser_t* browser); - - /// - // Called when a modal window is about to display and the modal loop should - // begin running. Return false (0) to use the default modal loop - // implementation or true (1) to use a custom implementation. - /// - int (CEF_CALLBACK *run_modal)(struct _cef_life_span_handler_t* self, - struct _cef_browser_t* browser); - - /// - // Called when a window has recieved a request to close. Return false (0) to - // proceed with the window close or true (1) to cancel the window close. If - // this is a modal window and a custom modal loop implementation was provided - // in run_modal() this callback should be used to restore the opener window to - // a usable state. - /// - int (CEF_CALLBACK *do_close)(struct _cef_life_span_handler_t* self, - struct _cef_browser_t* browser); - - /// - // Called just before a window is closed. If this is a modal window and a - // custom modal loop implementation was provided in run_modal() this callback - // should be used to exit the custom modal loop. - /// - void (CEF_CALLBACK *on_before_close)(struct _cef_life_span_handler_t* self, - struct _cef_browser_t* browser); -} cef_life_span_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_LIFE_SPAN_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_load_handler_capi.h b/cef1/include/capi/cef_load_handler_capi.h deleted file mode 100644 index 6076b88c0..000000000 --- a/cef1/include/capi/cef_load_handler_capi.h +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_LOAD_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_LOAD_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events related to browser load status. The -// functions of this structure will be called on the UI thread. -/// -typedef struct _cef_load_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called when the browser begins loading a frame. The |frame| value will - // never be NULL -- call the is_main() function to check if this frame is the - // main frame. Multiple frames may be loading at the same time. Sub-frames may - // start or continue loading after the main frame load has ended. This - // function may not be called for a particular frame if the load request for - // that frame fails. - /// - void (CEF_CALLBACK *on_load_start)(struct _cef_load_handler_t* self, - struct _cef_browser_t* browser, struct _cef_frame_t* frame); - - /// - // Called when the browser is done loading a frame. The |frame| value will - // never be NULL -- call the is_main() function to check if this frame is the - // main frame. Multiple frames may be loading at the same time. Sub-frames may - // start or continue loading after the main frame load has ended. This - // function will always be called for all frames irrespective of whether the - // request completes successfully. - /// - void (CEF_CALLBACK *on_load_end)(struct _cef_load_handler_t* self, - struct _cef_browser_t* browser, struct _cef_frame_t* frame, - int httpStatusCode); - - /// - // Called when the browser fails to load a resource. |errorCode| is the error - // code number and |failedUrl| is the URL that failed to load. To provide - // custom error text assign the text to |errorText| and return true (1). - // Otherwise, return false (0) for the default error text. See - // net\base\net_error_list.h for complete descriptions of the error codes. - /// - int (CEF_CALLBACK *on_load_error)(struct _cef_load_handler_t* self, - struct _cef_browser_t* browser, struct _cef_frame_t* frame, - enum cef_handler_errorcode_t errorCode, const cef_string_t* failedUrl, - cef_string_t* errorText); -} cef_load_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_LOAD_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_menu_handler_capi.h b/cef1/include/capi/cef_menu_handler_capi.h deleted file mode 100644 index c71a0cbd2..000000000 --- a/cef1/include/capi/cef_menu_handler_capi.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_MENU_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_MENU_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events related to browser context menus. -// The functions of this structure will be called on the UI thread. -/// -typedef struct _cef_menu_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called before a context menu is displayed. Return false (0) to display the - // default context menu or true (1) to cancel the display. - /// - int (CEF_CALLBACK *on_before_menu)(struct _cef_menu_handler_t* self, - struct _cef_browser_t* browser, - const struct _cef_menu_info_t* menuInfo); - - /// - // Called to optionally override the default text for a context menu item. - // |label| contains the default text and may be modified to substitute - // alternate text. - /// - void (CEF_CALLBACK *get_menu_label)(struct _cef_menu_handler_t* self, - struct _cef_browser_t* browser, enum cef_menu_id_t menuId, - cef_string_t* label); - - /// - // Called when an option is selected from the default context menu. Return - // false (0) to execute the default action or true (1) to cancel the action. - /// - int (CEF_CALLBACK *on_menu_action)(struct _cef_menu_handler_t* self, - struct _cef_browser_t* browser, enum cef_menu_id_t menuId); -} cef_menu_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_MENU_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_nplugin_capi.h b/cef1/include/capi/cef_nplugin_capi.h deleted file mode 100644 index d6adf1bf0..000000000 --- a/cef1/include/capi/cef_nplugin_capi.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - - -#ifndef CEF_INCLUDE_CAPI_CEF_NPLUGIN_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_NPLUGIN_CAPI_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/internal/cef_nplugin_types.h" - -/// -// Register a plugin with the system. Returns true (1) on success. -/// -CEF_EXPORT int cef_register_plugin(const cef_plugin_info_t* plugin_info); - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_NPLUGIN_CAPI_H_ diff --git a/cef1/include/capi/cef_origin_whitelist_capi.h b/cef1/include/capi/cef_origin_whitelist_capi.h deleted file mode 100644 index 8dde4c1c5..000000000 --- a/cef1/include/capi/cef_origin_whitelist_capi.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_ORIGIN_WHITELIST_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_ORIGIN_WHITELIST_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Add an entry to the cross-origin access whitelist. -// -// The same-origin policy restricts how scripts hosted from different origins -// (scheme + domain + port) can communicate. By default, scripts can only access -// resources with the same origin. Scripts hosted on the HTTP and HTTPS schemes -// (but no other schemes) can use the "Access-Control-Allow-Origin" header to -// allow cross-origin requests. For example, https://source.example.com can make -// XMLHttpRequest requests on http://target.example.com if the -// http://target.example.com request returns an "Access-Control-Allow-Origin: -// https://source.example.com" response header. -// -// Scripts in separate frames or iframes and hosted from the same protocol and -// domain suffix can execute cross-origin JavaScript if both pages set the -// document.domain value to the same domain suffix. For example, -// scheme://foo.example.com and scheme://bar.example.com can communicate using -// JavaScript if both domains set document.domain="example.com". -// -// This function is used to allow access to origins that would otherwise violate -// the same-origin policy. Scripts hosted underneath the fully qualified -// |source_origin| URL (like http://www.example.com) will be allowed access to -// all resources hosted on the specified |target_protocol| and |target_domain|. -// If |target_domain| is non-NULL and |allow_target_subdomains| if false (0) -// only exact domain matches will be allowed. If |target_domain| is non-NULL and -// |allow_target_subdomains| is true (1) sub-domain matches will be allowed. If -// |target_domain| is NULL and |allow_target_subdomains| if true (1) all domains -// and IP addresses will be allowed. -// -// This function cannot be used to bypass the restrictions on local or display -// isolated schemes. See the comments on CefRegisterCustomScheme for more -// information. -// -// This function may be called on any thread. Returns false (0) if -// |source_origin| is invalid or the whitelist cannot be accessed. -/// -CEF_EXPORT int cef_add_cross_origin_whitelist_entry( - const cef_string_t* source_origin, const cef_string_t* target_protocol, - const cef_string_t* target_domain, int allow_target_subdomains); - -/// -// Remove an entry from the cross-origin access whitelist. Returns false (0) if -// |source_origin| is invalid or the whitelist cannot be accessed. -/// -CEF_EXPORT int cef_remove_cross_origin_whitelist_entry( - const cef_string_t* source_origin, const cef_string_t* target_protocol, - const cef_string_t* target_domain, int allow_target_subdomains); - -/// -// Remove all entries from the cross-origin access whitelist. Returns false (0) -// if the whitelist cannot be accessed. -/// -CEF_EXPORT int cef_clear_cross_origin_whitelist(); - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_ORIGIN_WHITELIST_CAPI_H_ diff --git a/cef1/include/capi/cef_permission_handler_capi.h b/cef1/include/capi/cef_permission_handler_capi.h deleted file mode 100644 index 898eb490b..000000000 --- a/cef1/include/capi/cef_permission_handler_capi.h +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_PERMISSION_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_PERMISSION_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events related to browser permissions. The -// functions of this structure will be called on the UI thread. -/// -typedef struct _cef_permission_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called on the UI thread before a script extension is loaded. Return false - // (0) to let the extension load normally. - /// - int (CEF_CALLBACK *on_before_script_extension_load)( - struct _cef_permission_handler_t* self, struct _cef_browser_t* browser, - struct _cef_frame_t* frame, const cef_string_t* extensionName); -} cef_permission_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_PERMISSION_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_print_handler_capi.h b/cef1/include/capi/cef_print_handler_capi.h deleted file mode 100644 index cb4d80ec6..000000000 --- a/cef1/include/capi/cef_print_handler_capi.h +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_PRINT_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_PRINT_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events related to printing. The functions -// of this structure will be called on the UI thread. -/// -typedef struct _cef_print_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called to allow customization of standard print options before the print - // dialog is displayed. |printOptions| allows specification of paper size, - // orientation and margins. Note that the specified margins may be adjusted if - // they are outside the range supported by the printer. All units are in - // inches. Return false (0) to display the default print options or true (1) - // to display the modified |printOptions|. - /// - int (CEF_CALLBACK *get_print_options)(struct _cef_print_handler_t* self, - struct _cef_browser_t* browser, - struct _cef_print_options_t* printOptions); - - /// - // Called to format print headers and footers. |printInfo| contains platform- - // specific information about the printer context. |url| is the URL if the - // currently printing page, |title| is the title of the currently printing - // page, |currentPage| is the current page number and |maxPages| is the total - // number of pages. Six default header locations are provided by the - // implementation: top left, top center, top right, bottom left, bottom center - // and bottom right. To use one of these default locations just assign a - // string to the appropriate variable. To draw the header and footer yourself - // return true (1). Otherwise, populate the approprate variables and return - // false (0). - /// - int (CEF_CALLBACK *get_print_header_footer)(struct _cef_print_handler_t* self, - struct _cef_browser_t* browser, struct _cef_frame_t* frame, - const struct _cef_print_info_t* printInfo, const cef_string_t* url, - const cef_string_t* title, int currentPage, int maxPages, - cef_string_t* topLeft, cef_string_t* topCenter, cef_string_t* topRight, - cef_string_t* bottomLeft, cef_string_t* bottomCenter, - cef_string_t* bottomRight); -} cef_print_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_PRINT_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_proxy_handler_capi.h b/cef1/include/capi/cef_proxy_handler_capi.h deleted file mode 100644 index 1ed15c560..000000000 --- a/cef1/include/capi/cef_proxy_handler_capi.h +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_PROXY_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_PROXY_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle proxy resolution events. -/// -typedef struct _cef_proxy_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called to retrieve proxy information for the specified |url|. - /// - void (CEF_CALLBACK *get_proxy_for_url)(struct _cef_proxy_handler_t* self, - const cef_string_t* url, struct _cef_proxy_info_t* proxy_info); -} cef_proxy_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_PROXY_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_render_handler_capi.h b/cef1/include/capi/cef_render_handler_capi.h deleted file mode 100644 index e809ffb55..000000000 --- a/cef1/include/capi/cef_render_handler_capi.h +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_RENDER_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_RENDER_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events when window rendering is disabled. -// The functions of this structure will be called on the UI thread. -/// -typedef struct _cef_render_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called to retrieve the view rectangle which is relative to screen - // coordinates. Return true (1) if the rectangle was provided. - /// - int (CEF_CALLBACK *get_view_rect)(struct _cef_render_handler_t* self, - struct _cef_browser_t* browser, cef_rect_t* rect); - - /// - // Called to retrieve the simulated screen rectangle. Return true (1) if the - // rectangle was provided. - /// - int (CEF_CALLBACK *get_screen_rect)(struct _cef_render_handler_t* self, - struct _cef_browser_t* browser, cef_rect_t* rect); - - /// - // Called to retrieve the translation from view coordinates to actual screen - // coordinates. Return true (1) if the screen coordinates were provided. - /// - int (CEF_CALLBACK *get_screen_point)(struct _cef_render_handler_t* self, - struct _cef_browser_t* browser, int viewX, int viewY, int* screenX, - int* screenY); - - /// - // Called when the browser wants to show or hide the popup widget. The popup - // should be shown if |show| is true (1) and hidden if |show| is false (0). - /// - void (CEF_CALLBACK *on_popup_show)(struct _cef_render_handler_t* self, - struct _cef_browser_t* browser, int show); - - /// - // Called when the browser wants to move or resize the popup widget. |rect| - // contains the new location and size. - /// - void (CEF_CALLBACK *on_popup_size)(struct _cef_render_handler_t* self, - struct _cef_browser_t* browser, const cef_rect_t* rect); - - /// - // Called when an element should be painted. |type| indicates whether the - // element is the view or the popup widget. |buffer| contains the pixel data - // for the whole image. |dirtyRects| contains the set of rectangles that need - // to be repainted. On Windows |buffer| will be width*height*4 bytes in size - // and represents a BGRA image with an upper-left origin. The - // cef_browser_tSettings.animation_frame_rate value controls the rate at which - // this function is called. - /// - void (CEF_CALLBACK *on_paint)(struct _cef_render_handler_t* self, - struct _cef_browser_t* browser, enum cef_paint_element_type_t type, - size_t dirtyRectsCount, cef_rect_t const* dirtyRects, - const void* buffer); - - /// - // Called when the browser window's cursor has changed. - /// - void (CEF_CALLBACK *on_cursor_change)(struct _cef_render_handler_t* self, - struct _cef_browser_t* browser, cef_cursor_handle_t cursor); -} cef_render_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_RENDER_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_request_capi.h b/cef1/include/capi/cef_request_capi.h deleted file mode 100644 index 6a7733247..000000000 --- a/cef1/include/capi/cef_request_capi.h +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_REQUEST_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure used to represent a web request. The functions of this structure -// may be called on any thread. -/// -typedef struct _cef_request_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Get the fully qualified URL. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_url)(struct _cef_request_t* self); - - /// - // Set the fully qualified URL. - /// - void (CEF_CALLBACK *set_url)(struct _cef_request_t* self, - const cef_string_t* url); - - /// - // Get the request function type. The value will default to POST if post data - // is provided and GET otherwise. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_method)(struct _cef_request_t* self); - - /// - // Set the request function type. - /// - void (CEF_CALLBACK *set_method)(struct _cef_request_t* self, - const cef_string_t* method); - - /// - // Get the post data. - /// - struct _cef_post_data_t* (CEF_CALLBACK *get_post_data)( - struct _cef_request_t* self); - - /// - // Set the post data. - /// - void (CEF_CALLBACK *set_post_data)(struct _cef_request_t* self, - struct _cef_post_data_t* postData); - - /// - // Get the header values. - /// - void (CEF_CALLBACK *get_header_map)(struct _cef_request_t* self, - cef_string_multimap_t headerMap); - - /// - // Set the header values. - /// - void (CEF_CALLBACK *set_header_map)(struct _cef_request_t* self, - cef_string_multimap_t headerMap); - - /// - // Set all values at one time. - /// - void (CEF_CALLBACK *set)(struct _cef_request_t* self, const cef_string_t* url, - const cef_string_t* method, struct _cef_post_data_t* postData, - cef_string_multimap_t headerMap); - - /// - // Get the flags used in combination with cef_web_urlrequest_t. - /// - enum cef_weburlrequest_flags_t (CEF_CALLBACK *get_flags)( - struct _cef_request_t* self); - - /// - // Set the flags used in combination with cef_web_urlrequest_t. - /// - void (CEF_CALLBACK *set_flags)(struct _cef_request_t* self, - enum cef_weburlrequest_flags_t flags); - - /// - // Set the URL to the first party for cookies used in combination with - // cef_web_urlrequest_t. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_first_party_for_cookies)( - struct _cef_request_t* self); - - /// - // Get the URL to the first party for cookies used in combination with - // cef_web_urlrequest_t. - /// - void (CEF_CALLBACK *set_first_party_for_cookies)(struct _cef_request_t* self, - const cef_string_t* url); -} cef_request_t; - - -/// -// Create a new cef_request_t object. -/// -CEF_EXPORT cef_request_t* cef_request_create(); - - -/// -// Structure used to represent post data for a web request. The functions of -// this structure may be called on any thread. -/// -typedef struct _cef_post_data_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Returns the number of existing post data elements. - /// - size_t (CEF_CALLBACK *get_element_count)(struct _cef_post_data_t* self); - - /// - // Retrieve the post data elements. - /// - void (CEF_CALLBACK *get_elements)(struct _cef_post_data_t* self, - size_t* elementsCount, struct _cef_post_data_element_t** elements); - - /// - // Remove the specified post data element. Returns true (1) if the removal - // succeeds. - /// - int (CEF_CALLBACK *remove_element)(struct _cef_post_data_t* self, - struct _cef_post_data_element_t* element); - - /// - // Add the specified post data element. Returns true (1) if the add succeeds. - /// - int (CEF_CALLBACK *add_element)(struct _cef_post_data_t* self, - struct _cef_post_data_element_t* element); - - /// - // Remove all existing post data elements. - /// - void (CEF_CALLBACK *remove_elements)(struct _cef_post_data_t* self); -} cef_post_data_t; - - -/// -// Create a new cef_post_data_t object. -/// -CEF_EXPORT cef_post_data_t* cef_post_data_create(); - - -/// -// Structure used to represent a single element in the request post data. The -// functions of this structure may be called on any thread. -/// -typedef struct _cef_post_data_element_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Remove all contents from the post data element. - /// - void (CEF_CALLBACK *set_to_empty)(struct _cef_post_data_element_t* self); - - /// - // The post data element will represent a file. - /// - void (CEF_CALLBACK *set_to_file)(struct _cef_post_data_element_t* self, - const cef_string_t* fileName); - - /// - // The post data element will represent bytes. The bytes passed in will be - // copied. - /// - void (CEF_CALLBACK *set_to_bytes)(struct _cef_post_data_element_t* self, - size_t size, const void* bytes); - - /// - // Return the type of this post data element. - /// - enum cef_postdataelement_type_t (CEF_CALLBACK *get_type)( - struct _cef_post_data_element_t* self); - - /// - // Return the file name. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_file)( - struct _cef_post_data_element_t* self); - - /// - // Return the number of bytes. - /// - size_t (CEF_CALLBACK *get_bytes_count)(struct _cef_post_data_element_t* self); - - /// - // Read up to |size| bytes into |bytes| and return the number of bytes - // actually read. - /// - size_t (CEF_CALLBACK *get_bytes)(struct _cef_post_data_element_t* self, - size_t size, void* bytes); -} cef_post_data_element_t; - - -/// -// Create a new cef_post_data_element_t object. -/// -CEF_EXPORT cef_post_data_element_t* cef_post_data_element_create(); - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_REQUEST_CAPI_H_ diff --git a/cef1/include/capi/cef_request_handler_capi.h b/cef1/include/capi/cef_request_handler_capi.h deleted file mode 100644 index 3ecf3137e..000000000 --- a/cef1/include/capi/cef_request_handler_capi.h +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_REQUEST_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle events related to browser requests. The -// functions of this structure will be called on the thread indicated. -/// -typedef struct _cef_request_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called on the UI thread before browser navigation. Return true (1) to - // cancel the navigation or false (0) to allow the navigation to proceed. - /// - int (CEF_CALLBACK *on_before_browse)(struct _cef_request_handler_t* self, - struct _cef_browser_t* browser, struct _cef_frame_t* frame, - struct _cef_request_t* request, enum cef_handler_navtype_t navType, - int isRedirect); - - /// - // Called on the IO thread before a resource is loaded. To allow the resource - // to load normally return false (0). To redirect the resource to a new url - // populate the |redirectUrl| value and return false (0). To specify data for - // the resource return a CefStream object in |resourceStream|, use the - // |response| object to set mime type, HTTP status code and optional header - // values, and return false (0). To cancel loading of the resource return true - // (1). Any modifications to |request| will be observed. If the URL in - // |request| is changed and |redirectUrl| is also set, the URL in |request| - // will be used. - /// - int (CEF_CALLBACK *on_before_resource_load)( - struct _cef_request_handler_t* self, struct _cef_browser_t* browser, - struct _cef_request_t* request, cef_string_t* redirectUrl, - struct _cef_stream_reader_t** resourceStream, - struct _cef_response_t* response, int loadFlags); - - /// - // Called on the IO thread when a resource load is redirected. The |old_url| - // parameter will contain the old URL. The |new_url| parameter will contain - // the new URL and can be changed if desired. - /// - void (CEF_CALLBACK *on_resource_redirect)(struct _cef_request_handler_t* self, - struct _cef_browser_t* browser, const cef_string_t* old_url, - cef_string_t* new_url); - - /// - // Called on the UI thread after a response to the resource request is - // received. Set |filter| if response content needs to be monitored and/or - // modified as it arrives. - /// - void (CEF_CALLBACK *on_resource_response)(struct _cef_request_handler_t* self, - struct _cef_browser_t* browser, const cef_string_t* url, - struct _cef_response_t* response, - struct _cef_content_filter_t** filter); - - /// - // Called on the IO thread to handle requests for URLs with an unknown - // protocol component. Return true (1) to indicate that the request should - // succeed because it was handled externally. Set |allowOSExecution| to true - // (1) and return false (0) to attempt execution via the registered OS - // protocol handler, if any. If false (0) is returned and either - // |allow_os_execution| is false (0) or OS protocol handler execution fails - // then the request will fail with an error condition. SECURITY WARNING: YOU - // SHOULD USE THIS METHOD TO ENFORCE RESTRICTIONS BASED ON SCHEME, HOST OR - // OTHER URL ANALYSIS BEFORE ALLOWING OS EXECUTION. - /// - int (CEF_CALLBACK *on_protocol_execution)(struct _cef_request_handler_t* self, - struct _cef_browser_t* browser, const cef_string_t* url, - int* allowOSExecution); - - /// - // Called on the UI thread when a server indicates via the 'Content- - // Disposition' header that a response represents a file to download. - // |mimeType| is the mime type for the download, |fileName| is the suggested - // target file name and |contentLength| is either the value of the 'Content- - // Size' header or -1 if no size was provided. Set |handler| to the - // cef_download_handler_t instance that will recieve the file contents. Return - // true (1) to download the file or false (0) to cancel the file download. - /// - int (CEF_CALLBACK *get_download_handler)(struct _cef_request_handler_t* self, - struct _cef_browser_t* browser, const cef_string_t* mimeType, - const cef_string_t* fileName, int64 contentLength, - struct _cef_download_handler_t** handler); - - /// - // Called on the IO thread when the browser needs credentials from the user. - // |isProxy| indicates whether the host is a proxy server. |host| contains the - // hostname and port number. Set |username| and |password| and return true (1) - // to handle the request. Return false (0) to cancel the request. - /// - int (CEF_CALLBACK *get_auth_credentials)(struct _cef_request_handler_t* self, - struct _cef_browser_t* browser, int isProxy, const cef_string_t* host, - int port, const cef_string_t* realm, const cef_string_t* scheme, - cef_string_t* username, cef_string_t* password); - - /// - // Called on the IO thread to retrieve the cookie manager. |main_url| is the - // URL of the top-level frame. Cookies managers can be unique per browser or - // shared across multiple browsers. The global cookie manager will be used if - // this function returns NULL. - /// - struct _cef_cookie_manager_t* (CEF_CALLBACK *get_cookie_manager)( - struct _cef_request_handler_t* self, struct _cef_browser_t* browser, - const cef_string_t* main_url); -} cef_request_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_REQUEST_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_resource_bundle_handler_capi.h b/cef1/include/capi/cef_resource_bundle_handler_capi.h deleted file mode 100644 index a5b7a0952..000000000 --- a/cef1/include/capi/cef_resource_bundle_handler_capi.h +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_RESOURCE_BUNDLE_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_RESOURCE_BUNDLE_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure used to implement a custom resource bundle structure. The functions -// of this structure may be called on multiple threads. -/// -typedef struct _cef_resource_bundle_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called to retrieve a localized translation for the string specified by - // |message_id|. To provide the translation set |string| to the translation - // string and return true (1). To use the default translation return false - // (0). - // - // WARNING: Be cautious when implementing this function. ID values are auto- - // generated when CEF is built and may change between versions. Existing ID - // values can be discovered by searching for *_strings.h in the - // "obj/global_intermediate" build output directory. - /// - int (CEF_CALLBACK *get_localized_string)( - struct _cef_resource_bundle_handler_t* self, int message_id, - cef_string_t* string); - - /// - // Called to retrieve data for the resource specified by |resource_id|. To - // provide the resource data set |data| and |data_size| to the data pointer - // and size respectively and return true (1). To use the default resource data - // return false (0). The resource data will not be copied and must remain - // resident in memory. - // - // WARNING: Be cautious when implementing this function. ID values are auto- - // generated when CEF is built and may change between versions. Existing ID - // values can be discovered by searching for *_resources.h in the - // "obj/global_intermediate" build output directory. - /// - int (CEF_CALLBACK *get_data_resource)( - struct _cef_resource_bundle_handler_t* self, int resource_id, void** data, - size_t* data_size); -} cef_resource_bundle_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_RESOURCE_BUNDLE_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_response_capi.h b/cef1/include/capi/cef_response_capi.h deleted file mode 100644 index cf20c8ee5..000000000 --- a/cef1/include/capi/cef_response_capi.h +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_RESPONSE_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_RESPONSE_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure used to represent a web response. The functions of this structure -// may be called on any thread. -/// -typedef struct _cef_response_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Get the response status code. - /// - int (CEF_CALLBACK *get_status)(struct _cef_response_t* self); - - /// - // Set the response status code. - /// - void (CEF_CALLBACK *set_status)(struct _cef_response_t* self, int status); - - /// - // Get the response status text. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_status_text)( - struct _cef_response_t* self); - - /// - // Set the response status text. - /// - void (CEF_CALLBACK *set_status_text)(struct _cef_response_t* self, - const cef_string_t* statusText); - - /// - // Get the response mime type. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_mime_type)( - struct _cef_response_t* self); - - /// - // Set the response mime type. - /// - void (CEF_CALLBACK *set_mime_type)(struct _cef_response_t* self, - const cef_string_t* mimeType); - - /// - // Get the value for the specified response header field. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_header)(struct _cef_response_t* self, - const cef_string_t* name); - - /// - // Get all response header fields. - /// - void (CEF_CALLBACK *get_header_map)(struct _cef_response_t* self, - cef_string_multimap_t headerMap); - - /// - // Set all response header fields. - /// - void (CEF_CALLBACK *set_header_map)(struct _cef_response_t* self, - cef_string_multimap_t headerMap); -} cef_response_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_RESPONSE_CAPI_H_ diff --git a/cef1/include/capi/cef_scheme_capi.h b/cef1/include/capi/cef_scheme_capi.h deleted file mode 100644 index a56b7fa14..000000000 --- a/cef1/include/capi/cef_scheme_capi.h +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_SCHEME_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_SCHEME_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Register a scheme handler factory for the specified |scheme_name| and -// optional |domain_name|. An NULL |domain_name| value for a standard scheme -// will cause the factory to match all domain names. The |domain_name| value -// will be ignored for non-standard schemes. If |scheme_name| is a built-in -// scheme and no handler is returned by |factory| then the built-in scheme -// handler factory will be called. If |scheme_name| is a custom scheme the -// CefRegisterCustomScheme() function should be called for that scheme. This -// function may be called multiple times to change or remove the factory that -// matches the specified |scheme_name| and optional |domain_name|. Returns false -// (0) if an error occurs. This function may be called on any thread. -/// -CEF_EXPORT int cef_register_scheme_handler_factory( - const cef_string_t* scheme_name, const cef_string_t* domain_name, - struct _cef_scheme_handler_factory_t* factory); - -/// -// Clear all registered scheme handler factories. Returns false (0) on error. -// This function may be called on any thread. -/// -CEF_EXPORT int cef_clear_scheme_handler_factories(); - -/// -// Structure that manages custom scheme registrations. -/// -typedef struct _cef_scheme_registrar_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Register a custom scheme. This function should not be called for the built- - // in HTTP, HTTPS, FILE, FTP, ABOUT and DATA schemes. - // - // If |is_standard| is true (1) the scheme will be treated as a standard - // scheme. Standard schemes are subject to URL canonicalization and parsing - // rules as defined in the Common Internet Scheme Syntax RFC 1738 Section 3.1 - // available at http://www.ietf.org/rfc/rfc1738.txt - // - // In particular, the syntax for standard scheme URLs must be of the form: - //
-  //  [scheme]://[username]:[password]@[host]:[port]/[url-path]
-  // 
Standard scheme URLs must have a host component that is a fully - // qualified domain name as defined in Section 3.5 of RFC 1034 [13] and - // Section 2.1 of RFC 1123. These URLs will be canonicalized to - // "scheme://host/path" in the simplest case and - // "scheme://username:password@host:port/path" in the most explicit case. For - // example, "scheme:host/path" and "scheme:///host/path" will both be - // canonicalized to "scheme://host/path". The origin of a standard scheme URL - // is the combination of scheme, host and port (i.e., "scheme://host:port" in - // the most explicit case). - // - // For non-standard scheme URLs only the "scheme:" component is parsed and - // canonicalized. The remainder of the URL will be passed to the handler as- - // is. For example, "scheme:///some%20text" will remain the same. Non-standard - // scheme URLs cannot be used as a target for form submission. - // - // If |is_local| is true (1) the scheme will be treated as local (i.e., with - // the same security rules as those applied to "file" URLs). Normal pages - // cannot link to or access local URLs. Also, by default, local URLs can only - // perform XMLHttpRequest calls to the same URL (origin + path) that - // originated the request. To allow XMLHttpRequest calls from a local URL to - // other URLs with the same origin set the - // CefSettings.file_access_from_file_urls_allowed value to true (1). To allow - // XMLHttpRequest calls from a local URL to all origins set the - // CefSettings.universal_access_from_file_urls_allowed value to true (1). - // - // If |is_display_isolated| is true (1) the scheme will be treated as display- - // isolated. This means that pages cannot display these URLs unless they are - // from the same scheme. For example, pages in another origin cannot create - // iframes or hyperlinks to URLs with this scheme. - // - // This function may be called on any thread. It should only be called once - // per unique |scheme_name| value. If |scheme_name| is already registered or - // if an error occurs this function will return false (0). - /// - int (CEF_CALLBACK *add_custom_scheme)(struct _cef_scheme_registrar_t* self, - const cef_string_t* scheme_name, int is_standard, int is_local, - int is_display_isolated); -} cef_scheme_registrar_t; - - -/// -// Structure that creates cef_scheme_handler_t instances. The functions of this -// structure will always be called on the IO thread. -/// -typedef struct _cef_scheme_handler_factory_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Return a new scheme handler instance to handle the request. |browser| will - // be the browser window that initiated the request. If the request was - // initiated using the cef_web_urlrequest_t API |browser| will be NULL. The - // |request| object passed to this function will not contain cookie data. - /// - struct _cef_scheme_handler_t* (CEF_CALLBACK *create)( - struct _cef_scheme_handler_factory_t* self, - struct _cef_browser_t* browser, const cef_string_t* scheme_name, - struct _cef_request_t* request); -} cef_scheme_handler_factory_t; - - -/// -// Structure used to facilitate asynchronous responses to custom scheme handler -// requests. The functions of this structure may be called on any thread. -/// -typedef struct _cef_scheme_handler_callback_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Notify that header information is now available for retrieval. - /// - void (CEF_CALLBACK *headers_available)( - struct _cef_scheme_handler_callback_t* self); - - /// - // Notify that response data is now available for reading. - /// - void (CEF_CALLBACK *bytes_available)( - struct _cef_scheme_handler_callback_t* self); - - /// - // Cancel processing of the request. - /// - void (CEF_CALLBACK *cancel)(struct _cef_scheme_handler_callback_t* self); -} cef_scheme_handler_callback_t; - - -/// -// Structure used to implement a custom scheme handler structure. The functions -// of this structure will always be called on the IO thread. -/// -typedef struct _cef_scheme_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Begin processing the request. To handle the request return true (1) and - // call headers_available() once the response header information is available - // (headers_available() can also be called from inside this function if header - // information is available immediately). To cancel the request return false - // (0). - /// - int (CEF_CALLBACK *process_request)(struct _cef_scheme_handler_t* self, - struct _cef_request_t* request, - struct _cef_scheme_handler_callback_t* callback); - - /// - // Retrieve response header information. If the response length is not known - // set |response_length| to -1 and read_response() will be called until it - // returns false (0). If the response length is known set |response_length| to - // a positive value and read_response() will be called until it returns false - // (0) or the specified number of bytes have been read. Use the |response| - // object to set the mime type, http status code and other optional header - // values. To redirect the request to a new URL set |redirectUrl| to the new - // URL. - /// - void (CEF_CALLBACK *get_response_headers)(struct _cef_scheme_handler_t* self, - struct _cef_response_t* response, int64* response_length, - cef_string_t* redirectUrl); - - /// - // Read response data. If data is available immediately copy up to - // |bytes_to_read| bytes into |data_out|, set |bytes_read| to the number of - // bytes copied, and return true (1). To read the data at a later time set - // |bytes_read| to 0, return true (1) and call bytes_available() when the data - // is available. To indicate response completion return false (0). - /// - int (CEF_CALLBACK *read_response)(struct _cef_scheme_handler_t* self, - void* data_out, int bytes_to_read, int* bytes_read, - struct _cef_scheme_handler_callback_t* callback); - - /// - // Request processing has been canceled. - /// - void (CEF_CALLBACK *cancel)(struct _cef_scheme_handler_t* self); -} cef_scheme_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_SCHEME_CAPI_H_ diff --git a/cef1/include/capi/cef_stream_capi.h b/cef1/include/capi/cef_stream_capi.h deleted file mode 100644 index e4b32b597..000000000 --- a/cef1/include/capi/cef_stream_capi.h +++ /dev/null @@ -1,224 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_STREAM_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_STREAM_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure the client can implement to provide a custom stream reader. The -// functions of this structure may be called on any thread. -/// -typedef struct _cef_read_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Read raw binary data. - /// - size_t (CEF_CALLBACK *read)(struct _cef_read_handler_t* self, void* ptr, - size_t size, size_t n); - - /// - // Seek to the specified offset position. |whence| may be any one of SEEK_CUR, - // SEEK_END or SEEK_SET. Return zero on success and non-zero on failure. - /// - int (CEF_CALLBACK *seek)(struct _cef_read_handler_t* self, int64 offset, - int whence); - - /// - // Return the current offset position. - /// - int64 (CEF_CALLBACK *tell)(struct _cef_read_handler_t* self); - - /// - // Return non-zero if at end of file. - /// - int (CEF_CALLBACK *eof)(struct _cef_read_handler_t* self); -} cef_read_handler_t; - - -/// -// Structure used to read data from a stream. The functions of this structure -// may be called on any thread. -/// -typedef struct _cef_stream_reader_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Read raw binary data. - /// - size_t (CEF_CALLBACK *read)(struct _cef_stream_reader_t* self, void* ptr, - size_t size, size_t n); - - /// - // Seek to the specified offset position. |whence| may be any one of SEEK_CUR, - // SEEK_END or SEEK_SET. Returns zero on success and non-zero on failure. - /// - int (CEF_CALLBACK *seek)(struct _cef_stream_reader_t* self, int64 offset, - int whence); - - /// - // Return the current offset position. - /// - int64 (CEF_CALLBACK *tell)(struct _cef_stream_reader_t* self); - - /// - // Return non-zero if at end of file. - /// - int (CEF_CALLBACK *eof)(struct _cef_stream_reader_t* self); -} cef_stream_reader_t; - - -/// -// Create a new cef_stream_reader_t object from a file. -/// -CEF_EXPORT cef_stream_reader_t* cef_stream_reader_create_for_file( - const cef_string_t* fileName); - -/// -// Create a new cef_stream_reader_t object from data. -/// -CEF_EXPORT cef_stream_reader_t* cef_stream_reader_create_for_data(void* data, - size_t size); - -/// -// Create a new cef_stream_reader_t object from a custom handler. -/// -CEF_EXPORT cef_stream_reader_t* cef_stream_reader_create_for_handler( - cef_read_handler_t* handler); - - -/// -// Structure the client can implement to provide a custom stream writer. The -// functions of this structure may be called on any thread. -/// -typedef struct _cef_write_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Write raw binary data. - /// - size_t (CEF_CALLBACK *write)(struct _cef_write_handler_t* self, - const void* ptr, size_t size, size_t n); - - /// - // Seek to the specified offset position. |whence| may be any one of SEEK_CUR, - // SEEK_END or SEEK_SET. Return zero on success and non-zero on failure. - /// - int (CEF_CALLBACK *seek)(struct _cef_write_handler_t* self, int64 offset, - int whence); - - /// - // Return the current offset position. - /// - int64 (CEF_CALLBACK *tell)(struct _cef_write_handler_t* self); - - /// - // Flush the stream. - /// - int (CEF_CALLBACK *flush)(struct _cef_write_handler_t* self); -} cef_write_handler_t; - - -/// -// Structure used to write data to a stream. The functions of this structure may -// be called on any thread. -/// -typedef struct _cef_stream_writer_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Write raw binary data. - /// - size_t (CEF_CALLBACK *write)(struct _cef_stream_writer_t* self, - const void* ptr, size_t size, size_t n); - - /// - // Seek to the specified offset position. |whence| may be any one of SEEK_CUR, - // SEEK_END or SEEK_SET. Returns zero on success and non-zero on failure. - /// - int (CEF_CALLBACK *seek)(struct _cef_stream_writer_t* self, int64 offset, - int whence); - - /// - // Return the current offset position. - /// - int64 (CEF_CALLBACK *tell)(struct _cef_stream_writer_t* self); - - /// - // Flush the stream. - /// - int (CEF_CALLBACK *flush)(struct _cef_stream_writer_t* self); -} cef_stream_writer_t; - - -/// -// Create a new cef_stream_writer_t object for a file. -/// -CEF_EXPORT cef_stream_writer_t* cef_stream_writer_create_for_file( - const cef_string_t* fileName); - -/// -// Create a new cef_stream_writer_t object for a custom handler. -/// -CEF_EXPORT cef_stream_writer_t* cef_stream_writer_create_for_handler( - cef_write_handler_t* handler); - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_STREAM_CAPI_H_ diff --git a/cef1/include/capi/cef_task_capi.h b/cef1/include/capi/cef_task_capi.h deleted file mode 100644 index 991cc5bac..000000000 --- a/cef1/include/capi/cef_task_capi.h +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_TASK_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_TASK_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// CEF maintains multiple internal threads that are used for handling different -// types of tasks. The UI thread creates the browser window and is used for all -// interaction with the WebKit rendering engine and V8 JavaScript engine (The UI -// thread will be the same as the main application thread if cef_initialize() is -// called with a CefSettings.multi_threaded_message_loop value of false (0).) -// The IO thread is used for handling schema and network requests. The FILE -// thread is used for the application cache and other miscellaneous activities. -// This function will return true (1) if called on the specified thread. -/// -CEF_EXPORT int cef_currently_on(cef_thread_id_t threadId); - -/// -// Post a task for execution on the specified thread. This function may be -// called on any thread. -/// -CEF_EXPORT int cef_post_task(cef_thread_id_t threadId, - struct _cef_task_t* task); - -/// -// Post a task for delayed execution on the specified thread. This function may -// be called on any thread. -/// -CEF_EXPORT int cef_post_delayed_task(cef_thread_id_t threadId, - struct _cef_task_t* task, int64 delay_ms); - -/// -// Implement this structure for task execution. The functions of this structure -// may be called on any thread. -/// -typedef struct _cef_task_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Method that will be executed. |threadId| is the thread executing the call. - /// - void (CEF_CALLBACK *execute)(struct _cef_task_t* self, - cef_thread_id_t threadId); -} cef_task_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_TASK_CAPI_H_ diff --git a/cef1/include/capi/cef_url_capi.h b/cef1/include/capi/cef_url_capi.h deleted file mode 100644 index b0fdcd22b..000000000 --- a/cef1/include/capi/cef_url_capi.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_URL_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_URL_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Parse the specified |url| into its component parts. Returns false (0) if the -// URL is NULL or invalid. -/// -CEF_EXPORT int cef_parse_url(const cef_string_t* url, - struct _cef_urlparts_t* parts); - -/// -// Creates a URL from the specified |parts|, which must contain a non-NULL spec -// or a non-NULL host and path (at a minimum), but not both. Returns false (0) -// if |parts| isn't initialized as described. -/// -CEF_EXPORT int cef_create_url(const struct _cef_urlparts_t* parts, - cef_string_t* url); - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_URL_CAPI_H_ diff --git a/cef1/include/capi/cef_v8_capi.h b/cef1/include/capi/cef_v8_capi.h deleted file mode 100644 index b04c44efd..000000000 --- a/cef1/include/capi/cef_v8_capi.h +++ /dev/null @@ -1,815 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_V8_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_V8_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Register a new V8 extension with the specified JavaScript extension code and -// handler. Functions implemented by the handler are prototyped using the -// keyword 'native'. The calling of a native function is restricted to the scope -// in which the prototype of the native function is defined. This function may -// be called on any thread. -// -// Example JavaScript extension code:
-//   // create the 'example' global object if it doesn't already exist.
-//   if (!example)
-//     example = {};
-//   // create the 'example.test' global object if it doesn't already exist.
-//   if (!example.test)
-//     example.test = {};
-//   (function() {
-//     // Define the function 'example.test.myfunction'.
-//     example.test.myfunction = function() {
-//       // Call CefV8Handler::Execute() with the function name 'MyFunction'
-//       // and no arguments.
-//       native function MyFunction();
-//       return MyFunction();
-//     };
-//     // Define the getter function for parameter 'example.test.myparam'.
-//     example.test.__defineGetter__('myparam', function() {
-//       // Call CefV8Handler::Execute() with the function name 'GetMyParam'
-//       // and no arguments.
-//       native function GetMyParam();
-//       return GetMyParam();
-//     });
-//     // Define the setter function for parameter 'example.test.myparam'.
-//     example.test.__defineSetter__('myparam', function(b) {
-//       // Call CefV8Handler::Execute() with the function name 'SetMyParam'
-//       // and a single argument.
-//       native function SetMyParam();
-//       if(b) SetMyParam(b);
-//     });
-//
-//     // Extension definitions can also contain normal JavaScript variables
-//     // and functions.
-//     var myint = 0;
-//     example.test.increment = function() {
-//       myint += 1;
-//       return myint;
-//     };
-//   })();
-// 
Example usage in the page:
-//   // Call the function.
-//   example.test.myfunction();
-//   // Set the parameter.
-//   example.test.myparam = value;
-//   // Get the parameter.
-//   value = example.test.myparam;
-//   // Call another function.
-//   example.test.increment();
-// 
-/// -CEF_EXPORT int cef_register_extension(const cef_string_t* extension_name, - const cef_string_t* javascript_code, struct _cef_v8handler_t* handler); - -/// -// Structure that encapsulates a V8 context handle. The functions of this -// structure may only be called on the UI thread. -/// -typedef struct _cef_v8context_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Returns true (1) if this object is valid. Do not call any other functions - // if this function returns false (0). - /// - int (CEF_CALLBACK *is_valid)(struct _cef_v8context_t* self); - - /// - // Returns the browser for this context. - /// - struct _cef_browser_t* (CEF_CALLBACK *get_browser)( - struct _cef_v8context_t* self); - - /// - // Returns the frame for this context. - /// - struct _cef_frame_t* (CEF_CALLBACK *get_frame)(struct _cef_v8context_t* self); - - /// - // Returns the global object for this context. The context must be entered - // before calling this function. - /// - struct _cef_v8value_t* (CEF_CALLBACK *get_global)( - struct _cef_v8context_t* self); - - /// - // Enter this context. A context must be explicitly entered before creating a - // V8 Object, Array, Function or Date asynchronously. exit() must be called - // the same number of times as enter() before releasing this context. V8 - // objects belong to the context in which they are created. Returns true (1) - // if the scope was entered successfully. - /// - int (CEF_CALLBACK *enter)(struct _cef_v8context_t* self); - - /// - // Exit this context. Call this function only after calling enter(). Returns - // true (1) if the scope was exited successfully. - /// - int (CEF_CALLBACK *exit)(struct _cef_v8context_t* self); - - /// - // Returns true (1) if this object is pointing to the same handle as |that| - // object. - /// - int (CEF_CALLBACK *is_same)(struct _cef_v8context_t* self, - struct _cef_v8context_t* that); - - /// - // Evaluates the specified JavaScript code using this context's global object. - // On success |retval| will be set to the return value, if any, and the - // function will return true (1). On failure |exception| will be set to the - // exception, if any, and the function will return false (0). - /// - int (CEF_CALLBACK *eval)(struct _cef_v8context_t* self, - const cef_string_t* code, struct _cef_v8value_t** retval, - struct _cef_v8exception_t** exception); -} cef_v8context_t; - - -/// -// Returns the current (top) context object in the V8 context stack. -/// -CEF_EXPORT cef_v8context_t* cef_v8context_get_current_context(); - -/// -// Returns the entered (bottom) context object in the V8 context stack. -/// -CEF_EXPORT cef_v8context_t* cef_v8context_get_entered_context(); - -/// -// Returns true (1) if V8 is currently inside a context. -/// -CEF_EXPORT int cef_v8context_in_context(); - - -/// -// Structure that should be implemented to handle V8 function calls. The -// functions of this structure will always be called on the UI thread. -/// -typedef struct _cef_v8handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Handle execution of the function identified by |name|. |object| is the - // receiver ('this' object) of the function. |arguments| is the list of - // arguments passed to the function. If execution succeeds set |retval| to the - // function return value. If execution fails set |exception| to the exception - // that will be thrown. Return true (1) if execution was handled. - /// - int (CEF_CALLBACK *execute)(struct _cef_v8handler_t* self, - const cef_string_t* name, struct _cef_v8value_t* object, - size_t argumentsCount, struct _cef_v8value_t* const* arguments, - struct _cef_v8value_t** retval, cef_string_t* exception); -} cef_v8handler_t; - - -/// -// Structure that should be implemented to handle V8 accessor calls. Accessor -// identifiers are registered by calling cef_v8value_t::set_value_byaccessor(). -// The functions of this structure will always be called on the UI thread. -/// -typedef struct _cef_v8accessor_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Handle retrieval the accessor value identified by |name|. |object| is the - // receiver ('this' object) of the accessor. If retrieval succeeds set - // |retval| to the return value. If retrieval fails set |exception| to the - // exception that will be thrown. Return true (1) if accessor retrieval was - // handled. - /// - int (CEF_CALLBACK *get)(struct _cef_v8accessor_t* self, - const cef_string_t* name, struct _cef_v8value_t* object, - struct _cef_v8value_t** retval, cef_string_t* exception); - - /// - // Handle assignment of the accessor value identified by |name|. |object| is - // the receiver ('this' object) of the accessor. |value| is the new value - // being assigned to the accessor. If assignment fails set |exception| to the - // exception that will be thrown. Return true (1) if accessor assignment was - // handled. - /// - int (CEF_CALLBACK *set)(struct _cef_v8accessor_t* self, - const cef_string_t* name, struct _cef_v8value_t* object, - struct _cef_v8value_t* value, cef_string_t* exception); -} cef_v8accessor_t; - - -/// -// Structure representing a V8 exception. -/// -typedef struct _cef_v8exception_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Returns the exception message. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_message)( - struct _cef_v8exception_t* self); - - /// - // Returns the line of source code that the exception occurred within. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_source_line)( - struct _cef_v8exception_t* self); - - /// - // Returns the resource name for the script from where the function causing - // the error originates. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_script_resource_name)( - struct _cef_v8exception_t* self); - - /// - // Returns the 1-based number of the line where the error occurred or 0 if the - // line number is unknown. - /// - int (CEF_CALLBACK *get_line_number)(struct _cef_v8exception_t* self); - - /// - // Returns the index within the script of the first character where the error - // occurred. - /// - int (CEF_CALLBACK *get_start_position)(struct _cef_v8exception_t* self); - - /// - // Returns the index within the script of the last character where the error - // occurred. - /// - int (CEF_CALLBACK *get_end_position)(struct _cef_v8exception_t* self); - - /// - // Returns the index within the line of the first character where the error - // occurred. - /// - int (CEF_CALLBACK *get_start_column)(struct _cef_v8exception_t* self); - - /// - // Returns the index within the line of the last character where the error - // occurred. - /// - int (CEF_CALLBACK *get_end_column)(struct _cef_v8exception_t* self); -} cef_v8exception_t; - - -/// -// Structure representing a V8 value. The functions of this structure may only -// be called on the UI thread. -/// -typedef struct _cef_v8value_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Returns true (1) if this object is valid. Do not call any other functions - // if this function returns false (0). - /// - int (CEF_CALLBACK *is_valid)(struct _cef_v8value_t* self); - - /// - // True if the value type is undefined. - /// - int (CEF_CALLBACK *is_undefined)(struct _cef_v8value_t* self); - - /// - // True if the value type is null. - /// - int (CEF_CALLBACK *is_null)(struct _cef_v8value_t* self); - - /// - // True if the value type is bool. - /// - int (CEF_CALLBACK *is_bool)(struct _cef_v8value_t* self); - - /// - // True if the value type is int. - /// - int (CEF_CALLBACK *is_int)(struct _cef_v8value_t* self); - - /// - // True if the value type is unsigned int. - /// - int (CEF_CALLBACK *is_uint)(struct _cef_v8value_t* self); - - /// - // True if the value type is double. - /// - int (CEF_CALLBACK *is_double)(struct _cef_v8value_t* self); - - /// - // True if the value type is Date. - /// - int (CEF_CALLBACK *is_date)(struct _cef_v8value_t* self); - - /// - // True if the value type is string. - /// - int (CEF_CALLBACK *is_string)(struct _cef_v8value_t* self); - - /// - // True if the value type is object. - /// - int (CEF_CALLBACK *is_object)(struct _cef_v8value_t* self); - - /// - // True if the value type is array. - /// - int (CEF_CALLBACK *is_array)(struct _cef_v8value_t* self); - - /// - // True if the value type is function. - /// - int (CEF_CALLBACK *is_function)(struct _cef_v8value_t* self); - - /// - // Returns true (1) if this object is pointing to the same handle as |that| - // object. - /// - int (CEF_CALLBACK *is_same)(struct _cef_v8value_t* self, - struct _cef_v8value_t* that); - - /// - // Return a bool value. The underlying data will be converted to if - // necessary. - /// - int (CEF_CALLBACK *get_bool_value)(struct _cef_v8value_t* self); - - /// - // Return an int value. The underlying data will be converted to if - // necessary. - /// - int32 (CEF_CALLBACK *get_int_value)(struct _cef_v8value_t* self); - - /// - // Return an unisgned int value. The underlying data will be converted to if - // necessary. - /// - uint32 (CEF_CALLBACK *get_uint_value)(struct _cef_v8value_t* self); - - /// - // Return a double value. The underlying data will be converted to if - // necessary. - /// - double (CEF_CALLBACK *get_double_value)(struct _cef_v8value_t* self); - - /// - // Return a Date value. The underlying data will be converted to if - // necessary. - /// - cef_time_t (CEF_CALLBACK *get_date_value)(struct _cef_v8value_t* self); - - /// - // Return a string value. The underlying data will be converted to if - // necessary. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_string_value)( - struct _cef_v8value_t* self); - - - // OBJECT METHODS - These functions are only available on objects. Arrays and - // functions are also objects. String- and integer-based keys can be used - // interchangably with the framework converting between them as necessary. - - /// - // Returns true (1) if this is a user created object. - /// - int (CEF_CALLBACK *is_user_created)(struct _cef_v8value_t* self); - - /// - // Returns true (1) if the last function call resulted in an exception. This - // attribute exists only in the scope of the current CEF value object. - /// - int (CEF_CALLBACK *has_exception)(struct _cef_v8value_t* self); - - /// - // Returns the exception resulting from the last function call. This attribute - // exists only in the scope of the current CEF value object. - /// - struct _cef_v8exception_t* (CEF_CALLBACK *get_exception)( - struct _cef_v8value_t* self); - - /// - // Clears the last exception and returns true (1) on success. - /// - int (CEF_CALLBACK *clear_exception)(struct _cef_v8value_t* self); - - /// - // Returns true (1) if this object will re-throw future exceptions. This - // attribute exists only in the scope of the current CEF value object. - /// - int (CEF_CALLBACK *will_rethrow_exceptions)(struct _cef_v8value_t* self); - - /// - // Set whether this object will re-throw future exceptions. By default - // exceptions are not re-thrown. If a exception is re-thrown the current - // context should not be accessed again until after the exception has been - // caught and not re-thrown. Returns true (1) on success. This attribute - // exists only in the scope of the current CEF value object. - /// - int (CEF_CALLBACK *set_rethrow_exceptions)(struct _cef_v8value_t* self, - int rethrow); - - /// - // Returns true (1) if the object has a value with the specified identifier. - /// - int (CEF_CALLBACK *has_value_bykey)(struct _cef_v8value_t* self, - const cef_string_t* key); - - /// - // Returns true (1) if the object has a value with the specified identifier. - /// - int (CEF_CALLBACK *has_value_byindex)(struct _cef_v8value_t* self, int index); - - /// - // Deletes the value with the specified identifier and returns true (1) on - // success. Returns false (0) if this function is called incorrectly or an - // exception is thrown. For read-only and don't-delete values this function - // will return true (1) even though deletion failed. - /// - int (CEF_CALLBACK *delete_value_bykey)(struct _cef_v8value_t* self, - const cef_string_t* key); - - /// - // Deletes the value with the specified identifier and returns true (1) on - // success. Returns false (0) if this function is called incorrectly, deletion - // fails or an exception is thrown. For read-only and don't-delete values this - // function will return true (1) even though deletion failed. - /// - int (CEF_CALLBACK *delete_value_byindex)(struct _cef_v8value_t* self, - int index); - - /// - // Returns the value with the specified identifier on success. Returns NULL if - // this function is called incorrectly or an exception is thrown. - /// - struct _cef_v8value_t* (CEF_CALLBACK *get_value_bykey)( - struct _cef_v8value_t* self, const cef_string_t* key); - - /// - // Returns the value with the specified identifier on success. Returns NULL if - // this function is called incorrectly or an exception is thrown. - /// - struct _cef_v8value_t* (CEF_CALLBACK *get_value_byindex)( - struct _cef_v8value_t* self, int index); - - /// - // Associates a value with the specified identifier and returns true (1) on - // success. Returns false (0) if this function is called incorrectly or an - // exception is thrown. For read-only values this function will return true - // (1) even though assignment failed. - /// - int (CEF_CALLBACK *set_value_bykey)(struct _cef_v8value_t* self, - const cef_string_t* key, struct _cef_v8value_t* value, - enum cef_v8_propertyattribute_t attribute); - - /// - // Associates a value with the specified identifier and returns true (1) on - // success. Returns false (0) if this function is called incorrectly or an - // exception is thrown. For read-only values this function will return true - // (1) even though assignment failed. - /// - int (CEF_CALLBACK *set_value_byindex)(struct _cef_v8value_t* self, int index, - struct _cef_v8value_t* value); - - /// - // Registers an identifier and returns true (1) on success. Access to the - // identifier will be forwarded to the cef_v8accessor_t instance passed to - // cef_v8value_t::cef_v8value_create_object(). Returns false (0) if this - // function is called incorrectly or an exception is thrown. For read-only - // values this function will return true (1) even though assignment failed. - /// - int (CEF_CALLBACK *set_value_byaccessor)(struct _cef_v8value_t* self, - const cef_string_t* key, enum cef_v8_accesscontrol_t settings, - enum cef_v8_propertyattribute_t attribute); - - /// - // Read the keys for the object's values into the specified vector. Integer- - // based keys will also be returned as strings. - /// - int (CEF_CALLBACK *get_keys)(struct _cef_v8value_t* self, - cef_string_list_t keys); - - /// - // Sets the user data for this object and returns true (1) on success. Returns - // false (0) if this function is called incorrectly. This function can only be - // called on user created objects. - /// - int (CEF_CALLBACK *set_user_data)(struct _cef_v8value_t* self, - struct _cef_base_t* user_data); - - /// - // Returns the user data, if any, assigned to this object. - /// - struct _cef_base_t* (CEF_CALLBACK *get_user_data)( - struct _cef_v8value_t* self); - - /// - // Returns the amount of externally allocated memory registered for the - // object. - /// - int (CEF_CALLBACK *get_externally_allocated_memory)( - struct _cef_v8value_t* self); - - /// - // Adjusts the amount of registered external memory for the object. Used to - // give V8 an indication of the amount of externally allocated memory that is - // kept alive by JavaScript objects. V8 uses this information to decide when - // to perform global garbage collection. Each cef_v8value_t tracks the amount - // of external memory associated with it and automatically decreases the - // global total by the appropriate amount on its destruction. - // |change_in_bytes| specifies the number of bytes to adjust by. This function - // returns the number of bytes associated with the object after the - // adjustment. This function can only be called on user created objects. - /// - int (CEF_CALLBACK *adjust_externally_allocated_memory)( - struct _cef_v8value_t* self, int change_in_bytes); - - - // ARRAY METHODS - These functions are only available on arrays. - - /// - // Returns the number of elements in the array. - /// - int (CEF_CALLBACK *get_array_length)(struct _cef_v8value_t* self); - - - // FUNCTION METHODS - These functions are only available on functions. - - /// - // Returns the function name. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_function_name)( - struct _cef_v8value_t* self); - - /// - // Returns the function handler or NULL if not a CEF-created function. - /// - struct _cef_v8handler_t* (CEF_CALLBACK *get_function_handler)( - struct _cef_v8value_t* self); - - /// - // Execute the function using the current V8 context. This function should - // only be called from within the scope of a cef_v8handler_t or - // cef_v8accessor_t callback, or in combination with calling enter() and - // exit() on a stored cef_v8context_t reference. |object| is the receiver - // ('this' object) of the function. If |object| is NULL the current context's - // global object will be used. |arguments| is the list of arguments that will - // be passed to the function. Returns the function return value on success. - // Returns NULL if this function is called incorrectly or an exception is - // thrown. - /// - struct _cef_v8value_t* (CEF_CALLBACK *execute_function)( - struct _cef_v8value_t* self, struct _cef_v8value_t* object, - size_t argumentsCount, struct _cef_v8value_t* const* arguments); - - /// - // Execute the function using the specified V8 context. |object| is the - // receiver ('this' object) of the function. If |object| is NULL the specified - // context's global object will be used. |arguments| is the list of arguments - // that will be passed to the function. Returns the function return value on - // success. Returns NULL if this function is called incorrectly or an - // exception is thrown. - /// - struct _cef_v8value_t* (CEF_CALLBACK *execute_function_with_context)( - struct _cef_v8value_t* self, struct _cef_v8context_t* context, - struct _cef_v8value_t* object, size_t argumentsCount, - struct _cef_v8value_t* const* arguments); -} cef_v8value_t; - - -/// -// Create a new cef_v8value_t object of type undefined. -/// -CEF_EXPORT cef_v8value_t* cef_v8value_create_undefined(); - -/// -// Create a new cef_v8value_t object of type null. -/// -CEF_EXPORT cef_v8value_t* cef_v8value_create_null(); - -/// -// Create a new cef_v8value_t object of type bool. -/// -CEF_EXPORT cef_v8value_t* cef_v8value_create_bool(int value); - -/// -// Create a new cef_v8value_t object of type int. -/// -CEF_EXPORT cef_v8value_t* cef_v8value_create_int(int32 value); - -/// -// Create a new cef_v8value_t object of type unsigned int. -/// -CEF_EXPORT cef_v8value_t* cef_v8value_create_uint(uint32 value); - -/// -// Create a new cef_v8value_t object of type double. -/// -CEF_EXPORT cef_v8value_t* cef_v8value_create_double(double value); - -/// -// Create a new cef_v8value_t object of type Date. This function should only be -// called from within the scope of a cef_v8context_tHandler, cef_v8handler_t or -// cef_v8accessor_t callback, or in combination with calling enter() and exit() -// on a stored cef_v8context_t reference. -/// -CEF_EXPORT cef_v8value_t* cef_v8value_create_date(const cef_time_t* date); - -/// -// Create a new cef_v8value_t object of type string. -/// -CEF_EXPORT cef_v8value_t* cef_v8value_create_string(const cef_string_t* value); - -/// -// Create a new cef_v8value_t object of type object with optional accessor. This -// function should only be called from within the scope of a -// cef_v8context_tHandler, cef_v8handler_t or cef_v8accessor_t callback, or in -// combination with calling enter() and exit() on a stored cef_v8context_t -// reference. -/// -CEF_EXPORT cef_v8value_t* cef_v8value_create_object(cef_v8accessor_t* accessor); - -/// -// Create a new cef_v8value_t object of type array with the specified |length|. -// If |length| is negative the returned array will have length 0. This function -// should only be called from within the scope of a cef_v8context_tHandler, -// cef_v8handler_t or cef_v8accessor_t callback, or in combination with calling -// enter() and exit() on a stored cef_v8context_t reference. -/// -CEF_EXPORT cef_v8value_t* cef_v8value_create_array(int length); - -/// -// Create a new cef_v8value_t object of type function. This function should only -// be called from within the scope of a cef_v8context_tHandler, cef_v8handler_t -// or cef_v8accessor_t callback, or in combination with calling enter() and -// exit() on a stored cef_v8context_t reference. -/// -CEF_EXPORT cef_v8value_t* cef_v8value_create_function(const cef_string_t* name, - cef_v8handler_t* handler); - - -/// -// Structure representing a V8 stack trace. The functions of this structure may -// only be called on the UI thread. -/// -typedef struct _cef_v8stack_trace_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Returns true (1) if this object is valid. Do not call any other functions - // if this function returns false (0). - /// - int (CEF_CALLBACK *is_valid)(struct _cef_v8stack_trace_t* self); - - /// - // Returns the number of stack frames. - /// - int (CEF_CALLBACK *get_frame_count)(struct _cef_v8stack_trace_t* self); - - /// - // Returns the stack frame at the specified 0-based index. - /// - struct _cef_v8stack_frame_t* (CEF_CALLBACK *get_frame)( - struct _cef_v8stack_trace_t* self, int index); -} cef_v8stack_trace_t; - - -/// -// Returns the stack trace for the currently active context. |frame_limit| is -// the maximum number of frames that will be captured. -/// -CEF_EXPORT cef_v8stack_trace_t* cef_v8stack_trace_get_current(int frame_limit); - - -/// -// Structure representing a V8 stack frame. The functions of this structure may -// only be called on the UI thread. -/// -typedef struct _cef_v8stack_frame_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Returns true (1) if this object is valid. Do not call any other functions - // if this function returns false (0). - /// - int (CEF_CALLBACK *is_valid)(struct _cef_v8stack_frame_t* self); - - /// - // Returns the name of the resource script that contains the function. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_script_name)( - struct _cef_v8stack_frame_t* self); - - /// - // Returns the name of the resource script that contains the function or the - // sourceURL value if the script name is undefined and its source ends with a - // "//@ sourceURL=..." string. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_script_name_or_source_url)( - struct _cef_v8stack_frame_t* self); - - /// - // Returns the name of the function. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_function_name)( - struct _cef_v8stack_frame_t* self); - - /// - // Returns the 1-based line number for the function call or 0 if unknown. - /// - int (CEF_CALLBACK *get_line_number)(struct _cef_v8stack_frame_t* self); - - /// - // Returns the 1-based column offset on the line for the function call or 0 if - // unknown. - /// - int (CEF_CALLBACK *get_column)(struct _cef_v8stack_frame_t* self); - - /// - // Returns true (1) if the function was compiled using eval(). - /// - int (CEF_CALLBACK *is_eval)(struct _cef_v8stack_frame_t* self); - - /// - // Returns true (1) if the function was called as a constructor via "new". - /// - int (CEF_CALLBACK *is_constructor)(struct _cef_v8stack_frame_t* self); -} cef_v8stack_frame_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_V8_CAPI_H_ diff --git a/cef1/include/capi/cef_v8context_handler_capi.h b/cef1/include/capi/cef_v8context_handler_capi.h deleted file mode 100644 index 9e81fe8f4..000000000 --- a/cef1/include/capi/cef_v8context_handler_capi.h +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_V8CONTEXT_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_V8CONTEXT_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to handle V8 context events. The functions of this -// structure will be called on the UI thread. -/// -typedef struct _cef_v8context_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called immediately after the V8 context for a frame has been created. To - // retrieve the JavaScript 'window' object use the - // cef_v8context_t::get_global() function. - /// - void (CEF_CALLBACK *on_context_created)(struct _cef_v8context_handler_t* self, - struct _cef_browser_t* browser, struct _cef_frame_t* frame, - struct _cef_v8context_t* context); - - /// - // Called immediately before the V8 context for a frame is released. No - // references to the context should be kept after this function is called. - /// - void (CEF_CALLBACK *on_context_released)( - struct _cef_v8context_handler_t* self, struct _cef_browser_t* browser, - struct _cef_frame_t* frame, struct _cef_v8context_t* context); - - /// - // Called for global uncaught exceptions. Execution of this callback is - // disabled by default. To enable set - // CefSettings.uncaught_exception_stack_size > 0. - /// - void (CEF_CALLBACK *on_uncaught_exception)( - struct _cef_v8context_handler_t* self, struct _cef_browser_t* browser, - struct _cef_frame_t* frame, struct _cef_v8context_t* context, - struct _cef_v8exception_t* exception, - struct _cef_v8stack_trace_t* stackTrace); -} cef_v8context_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_V8CONTEXT_HANDLER_CAPI_H_ diff --git a/cef1/include/capi/cef_web_plugin_capi.h b/cef1/include/capi/cef_web_plugin_capi.h deleted file mode 100644 index 628d4a482..000000000 --- a/cef1/include/capi/cef_web_plugin_capi.h +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_WEB_PLUGIN_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_WEB_PLUGIN_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Returns the number of installed web plugins. This function must be called on -// the UI thread. -/// -CEF_EXPORT size_t cef_get_web_plugin_count(); - -/// -// Returns information for web plugin at the specified zero-based index. This -// function must be called on the UI thread. -/// -CEF_EXPORT struct _cef_web_plugin_info_t* cef_get_web_plugin_info(int index); - -/// -// Returns information for web plugin with the specified name. This function -// must be called on the UI thread. -/// -CEF_EXPORT struct _cef_web_plugin_info_t* cef_get_web_plugin_info_byname( - const cef_string_t* name); - -/// -// Information about a specific web plugin. -/// -typedef struct _cef_web_plugin_info_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Returns the plugin name (i.e. Flash). - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_name)( - struct _cef_web_plugin_info_t* self); - - /// - // Returns the plugin file path (DLL/bundle/library). - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_path)( - struct _cef_web_plugin_info_t* self); - - /// - // Returns the version of the plugin (may be OS-specific). - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_version)( - struct _cef_web_plugin_info_t* self); - - /// - // Returns a description of the plugin from the version information. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_description)( - struct _cef_web_plugin_info_t* self); -} cef_web_plugin_info_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_WEB_PLUGIN_CAPI_H_ diff --git a/cef1/include/capi/cef_web_urlrequest_capi.h b/cef1/include/capi/cef_web_urlrequest_capi.h deleted file mode 100644 index b97c113f2..000000000 --- a/cef1/include/capi/cef_web_urlrequest_capi.h +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_WEB_URLREQUEST_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_WEB_URLREQUEST_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure used to make a Web URL request. Web URL requests are not associated -// with a browser instance so no cef_client_t callbacks will be executed. The -// functions of this structure may be called on any thread. -/// -typedef struct _cef_web_urlrequest_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Cancels the request. - /// - void (CEF_CALLBACK *cancel)(struct _cef_web_urlrequest_t* self); - - /// - // Returns the current ready state of the request. - /// - enum cef_weburlrequest_state_t (CEF_CALLBACK *get_state)( - struct _cef_web_urlrequest_t* self); -} cef_web_urlrequest_t; - - -/// -// Create a new CefWebUrlRequest object. -/// -CEF_EXPORT cef_web_urlrequest_t* cef_web_urlrequest_create( - struct _cef_request_t* request, - struct _cef_web_urlrequest_client_t* client); - - -/// -// Structure that should be implemented by the cef_web_urlrequest_t client. The -// functions of this structure will always be called on the UI thread. -/// -typedef struct _cef_web_urlrequest_client_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Notifies the client that the request state has changed. State change - // notifications will always be sent before the below notification functions - // are called. - /// - void (CEF_CALLBACK *on_state_change)( - struct _cef_web_urlrequest_client_t* self, - struct _cef_web_urlrequest_t* requester, - enum cef_weburlrequest_state_t state); - - /// - // Notifies the client that the request has been redirected and provides a - // chance to change the request parameters. - /// - void (CEF_CALLBACK *on_redirect)(struct _cef_web_urlrequest_client_t* self, - struct _cef_web_urlrequest_t* requester, struct _cef_request_t* request, - struct _cef_response_t* response); - - /// - // Notifies the client of the response data. - /// - void (CEF_CALLBACK *on_headers_received)( - struct _cef_web_urlrequest_client_t* self, - struct _cef_web_urlrequest_t* requester, - struct _cef_response_t* response); - - /// - // Notifies the client of the upload progress. - /// - void (CEF_CALLBACK *on_progress)(struct _cef_web_urlrequest_client_t* self, - struct _cef_web_urlrequest_t* requester, uint64 bytesSent, - uint64 totalBytesToBeSent); - - /// - // Notifies the client that content has been received. - /// - void (CEF_CALLBACK *on_data)(struct _cef_web_urlrequest_client_t* self, - struct _cef_web_urlrequest_t* requester, const void* data, - int dataLength); - - /// - // Notifies the client that the request ended with an error. - /// - void (CEF_CALLBACK *on_error)(struct _cef_web_urlrequest_client_t* self, - struct _cef_web_urlrequest_t* requester, - enum cef_handler_errorcode_t errorCode); -} cef_web_urlrequest_client_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_WEB_URLREQUEST_CAPI_H_ diff --git a/cef1/include/capi/cef_xml_reader_capi.h b/cef1/include/capi/cef_xml_reader_capi.h deleted file mode 100644 index 952aa26e3..000000000 --- a/cef1/include/capi/cef_xml_reader_capi.h +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_XML_READER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_XML_READER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure that supports the reading of XML data via the libxml streaming API. -// The functions of this structure should only be called on the thread that -// creates the object. -/// -typedef struct _cef_xml_reader_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Moves the cursor to the next node in the document. This function must be - // called at least once to set the current cursor position. Returns true (1) - // if the cursor position was set successfully. - /// - int (CEF_CALLBACK *move_to_next_node)(struct _cef_xml_reader_t* self); - - /// - // Close the document. This should be called directly to ensure that cleanup - // occurs on the correct thread. - /// - int (CEF_CALLBACK *close)(struct _cef_xml_reader_t* self); - - /// - // Returns true (1) if an error has been reported by the XML parser. - /// - int (CEF_CALLBACK *has_error)(struct _cef_xml_reader_t* self); - - /// - // Returns the error string. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_error)( - struct _cef_xml_reader_t* self); - - - // The below functions retrieve data for the node at the current cursor - // position. - - /// - // Returns the node type. - /// - enum cef_xml_node_type_t (CEF_CALLBACK *get_type)( - struct _cef_xml_reader_t* self); - - /// - // Returns the node depth. Depth starts at 0 for the root node. - /// - int (CEF_CALLBACK *get_depth)(struct _cef_xml_reader_t* self); - - /// - // Returns the local name. See http://www.w3.org/TR/REC-xml-names/#NT- - // LocalPart for additional details. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_local_name)( - struct _cef_xml_reader_t* self); - - /// - // Returns the namespace prefix. See http://www.w3.org/TR/REC-xml-names/ for - // additional details. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_prefix)( - struct _cef_xml_reader_t* self); - - /// - // Returns the qualified name, equal to (Prefix:)LocalName. See - // http://www.w3.org/TR/REC-xml-names/#ns-qualnames for additional details. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_qualified_name)( - struct _cef_xml_reader_t* self); - - /// - // Returns the URI defining the namespace associated with the node. See - // http://www.w3.org/TR/REC-xml-names/ for additional details. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_namespace_uri)( - struct _cef_xml_reader_t* self); - - /// - // Returns the base URI of the node. See http://www.w3.org/TR/xmlbase/ for - // additional details. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_base_uri)( - struct _cef_xml_reader_t* self); - - /// - // Returns the xml:lang scope within which the node resides. See - // http://www.w3.org/TR/REC-xml/#sec-lang-tag for additional details. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_xml_lang)( - struct _cef_xml_reader_t* self); - - /// - // Returns true (1) if the node represents an NULL element. is considered - // NULL but is not. - /// - int (CEF_CALLBACK *is_empty_element)(struct _cef_xml_reader_t* self); - - /// - // Returns true (1) if the node has a text value. - /// - int (CEF_CALLBACK *has_value)(struct _cef_xml_reader_t* self); - - /// - // Returns the text value. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_value)( - struct _cef_xml_reader_t* self); - - /// - // Returns true (1) if the node has attributes. - /// - int (CEF_CALLBACK *has_attributes)(struct _cef_xml_reader_t* self); - - /// - // Returns the number of attributes. - /// - size_t (CEF_CALLBACK *get_attribute_count)(struct _cef_xml_reader_t* self); - - /// - // Returns the value of the attribute at the specified 0-based index. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_attribute_byindex)( - struct _cef_xml_reader_t* self, int index); - - /// - // Returns the value of the attribute with the specified qualified name. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_attribute_byqname)( - struct _cef_xml_reader_t* self, const cef_string_t* qualifiedName); - - /// - // Returns the value of the attribute with the specified local name and - // namespace URI. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_attribute_bylname)( - struct _cef_xml_reader_t* self, const cef_string_t* localName, - const cef_string_t* namespaceURI); - - /// - // Returns an XML representation of the current node's children. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_inner_xml)( - struct _cef_xml_reader_t* self); - - /// - // Returns an XML representation of the current node including its children. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_outer_xml)( - struct _cef_xml_reader_t* self); - - /// - // Returns the line number for the current node. - /// - int (CEF_CALLBACK *get_line_number)(struct _cef_xml_reader_t* self); - - - // Attribute nodes are not traversed by default. The below functions can be - // used to move the cursor to an attribute node. move_to_carrying_element() - // can be called afterwards to return the cursor to the carrying element. The - // depth of an attribute node will be 1 + the depth of the carrying element. - - /// - // Moves the cursor to the attribute at the specified 0-based index. Returns - // true (1) if the cursor position was set successfully. - /// - int (CEF_CALLBACK *move_to_attribute_byindex)(struct _cef_xml_reader_t* self, - int index); - - /// - // Moves the cursor to the attribute with the specified qualified name. - // Returns true (1) if the cursor position was set successfully. - /// - int (CEF_CALLBACK *move_to_attribute_byqname)(struct _cef_xml_reader_t* self, - const cef_string_t* qualifiedName); - - /// - // Moves the cursor to the attribute with the specified local name and - // namespace URI. Returns true (1) if the cursor position was set - // successfully. - /// - int (CEF_CALLBACK *move_to_attribute_bylname)(struct _cef_xml_reader_t* self, - const cef_string_t* localName, const cef_string_t* namespaceURI); - - /// - // Moves the cursor to the first attribute in the current element. Returns - // true (1) if the cursor position was set successfully. - /// - int (CEF_CALLBACK *move_to_first_attribute)(struct _cef_xml_reader_t* self); - - /// - // Moves the cursor to the next attribute in the current element. Returns true - // (1) if the cursor position was set successfully. - /// - int (CEF_CALLBACK *move_to_next_attribute)(struct _cef_xml_reader_t* self); - - /// - // Moves the cursor back to the carrying element. Returns true (1) if the - // cursor position was set successfully. - /// - int (CEF_CALLBACK *move_to_carrying_element)(struct _cef_xml_reader_t* self); -} cef_xml_reader_t; - - -/// -// Create a new cef_xml_reader_t object. The returned object's functions can -// only be called from the thread that created the object. -/// -CEF_EXPORT cef_xml_reader_t* cef_xml_reader_create( - struct _cef_stream_reader_t* stream, - enum cef_xml_encoding_type_t encodingType, const cef_string_t* URI); - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_XML_READER_CAPI_H_ diff --git a/cef1/include/capi/cef_zip_reader_capi.h b/cef1/include/capi/cef_zip_reader_capi.h deleted file mode 100644 index 36c5be0de..000000000 --- a/cef1/include/capi/cef_zip_reader_capi.h +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_ZIP_READER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_ZIP_READER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Structure that supports the reading of zip archives via the zlib unzip API. -// The functions of this structure should only be called on the thread that -// creates the object. -/// -typedef struct _cef_zip_reader_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Moves the cursor to the first file in the archive. Returns true (1) if the - // cursor position was set successfully. - /// - int (CEF_CALLBACK *move_to_first_file)(struct _cef_zip_reader_t* self); - - /// - // Moves the cursor to the next file in the archive. Returns true (1) if the - // cursor position was set successfully. - /// - int (CEF_CALLBACK *move_to_next_file)(struct _cef_zip_reader_t* self); - - /// - // Moves the cursor to the specified file in the archive. If |caseSensitive| - // is true (1) then the search will be case sensitive. Returns true (1) if the - // cursor position was set successfully. - /// - int (CEF_CALLBACK *move_to_file)(struct _cef_zip_reader_t* self, - const cef_string_t* fileName, int caseSensitive); - - /// - // Closes the archive. This should be called directly to ensure that cleanup - // occurs on the correct thread. - /// - int (CEF_CALLBACK *close)(struct _cef_zip_reader_t* self); - - - // The below functions act on the file at the current cursor position. - - /// - // Returns the name of the file. - /// - // The resulting string must be freed by calling cef_string_userfree_free(). - cef_string_userfree_t (CEF_CALLBACK *get_file_name)( - struct _cef_zip_reader_t* self); - - /// - // Returns the uncompressed size of the file. - /// - int64 (CEF_CALLBACK *get_file_size)(struct _cef_zip_reader_t* self); - - /// - // Returns the last modified timestamp for the file. - /// - time_t (CEF_CALLBACK *get_file_last_modified)(struct _cef_zip_reader_t* self); - - /// - // Opens the file for reading of uncompressed data. A read password may - // optionally be specified. - /// - int (CEF_CALLBACK *open_file)(struct _cef_zip_reader_t* self, - const cef_string_t* password); - - /// - // Closes the file. - /// - int (CEF_CALLBACK *close_file)(struct _cef_zip_reader_t* self); - - /// - // Read uncompressed file contents into the specified buffer. Returns < 0 if - // an error occurred, 0 if at the end of file, or the number of bytes read. - /// - int (CEF_CALLBACK *read_file)(struct _cef_zip_reader_t* self, void* buffer, - size_t bufferSize); - - /// - // Returns the current offset in the uncompressed file contents. - /// - int64 (CEF_CALLBACK *tell)(struct _cef_zip_reader_t* self); - - /// - // Returns true (1) if at end of the file contents. - /// - int (CEF_CALLBACK *eof)(struct _cef_zip_reader_t* self); -} cef_zip_reader_t; - - -/// -// Create a new cef_zip_reader_t object. The returned object's functions can -// only be called from the thread that created the object. -/// -CEF_EXPORT cef_zip_reader_t* cef_zip_reader_create( - struct _cef_stream_reader_t* stream); - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_ZIP_READER_CAPI_H_ diff --git a/cef1/include/capi/cef_zoom_handler_capi.h b/cef1/include/capi/cef_zoom_handler_capi.h deleted file mode 100644 index 21fcf0c2d..000000000 --- a/cef1/include/capi/cef_zoom_handler_capi.h +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef CEF_INCLUDE_CAPI_CEF_ZOOM_HANDLER_CAPI_H_ -#define CEF_INCLUDE_CAPI_CEF_ZOOM_HANDLER_CAPI_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - - -/// -// Implement this structure to customize zoom handling. The functions of this -// structure will be called on the UI thread. -/// -typedef struct _cef_zoom_handler_t { - /// - // Base structure. - /// - cef_base_t base; - - /// - // Called when the browser wants to retrieve the zoom level for the given - // |url|. Return true (1) if |zoomLevel| has been set to the custom zoom - // level. Return false (0) for the browser's default zoom handling behavior. - /// - int (CEF_CALLBACK *on_get_zoom_level)(struct _cef_zoom_handler_t* self, - struct _cef_browser_t* browser, const cef_string_t* url, - double* zoomLevel); - - /// - // Called when the browser's zoom level has been set to |zoomLevel| for the - // given |url|. Return true (1) to indicate that the new setting has been - // handled. Return false (0) to use the browser's default zoom handling - // behavior. - /// - int (CEF_CALLBACK *on_set_zoom_level)(struct _cef_zoom_handler_t* self, - struct _cef_browser_t* browser, const cef_string_t* url, - double zoomLevel); -} cef_zoom_handler_t; - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_CAPI_CEF_ZOOM_HANDLER_CAPI_H_ diff --git a/cef1/include/cef_app.h b/cef1/include/cef_app.h deleted file mode 100644 index e352ebbac..000000000 --- a/cef1/include/cef_app.h +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - - -#ifndef CEF_INCLUDE_CEF_APP_H_ -#define CEF_INCLUDE_CEF_APP_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_proxy_handler.h" -#include "include/cef_resource_bundle_handler.h" -#include "include/cef_scheme.h" - -class CefApp; - -/// -// This function should be called on the main application thread to initialize -// CEF when the application is started. The |application| parameter may be -// empty. A return value of true indicates that it succeeded and false indicates -// that it failed. -/// -/*--cef(revision_check,optional_param=application)--*/ -bool CefInitialize(const CefSettings& settings, CefRefPtr application); - -/// -// This function should be called on the main application thread to shut down -// CEF before the application exits. -/// -/*--cef()--*/ -void CefShutdown(); - -/// -// Perform a single iteration of CEF message loop processing. This function is -// used to integrate the CEF message loop into an existing application message -// loop. Care must be taken to balance performance against excessive CPU usage. -// This function should only be called on the main application thread and only -// if CefInitialize() is called with a CefSettings.multi_threaded_message_loop -// value of false. This function will not block. -/// -/*--cef()--*/ -void CefDoMessageLoopWork(); - -/// -// Run the CEF message loop. Use this function instead of an application- -// provided message loop to get the best balance between performance and CPU -// usage. This function should only be called on the main application thread and -// only if CefInitialize() is called with a -// CefSettings.multi_threaded_message_loop value of false. This function will -// block until a quit message is received by the system. -/// -/*--cef()--*/ -void CefRunMessageLoop(); - -/// -// Quit the CEF message loop that was started by calling CefRunMessageLoop(). -// This function should only be called on the main application thread and only -// if CefRunMessageLoop() was used. -/// -/*--cef()--*/ -void CefQuitMessageLoop(); - -/// -// Set to true before calling Windows APIs like TrackPopupMenu that enter a -// modal message loop. Set to false after exiting the modal message loop. -/// -/*--cef()--*/ -void CefSetOSModalLoop(bool osModalLoop); - -/// -// Implement this interface to provide handler implementations. Methods will be -// called on the thread indicated. -/// -/*--cef(source=client,no_debugct_check)--*/ -class CefApp : public virtual CefBase { - public: - /// - // Provides an opportunity to register custom schemes. Do not keep a reference - // to the |registrar| object. This method is called on the UI thread. - /// - /*--cef()--*/ - virtual void OnRegisterCustomSchemes( - CefRefPtr registrar) { - } - - /// - // Return the handler for resource bundle events. If - // CefSettings.pack_loading_disabled is true a handler must be returned. If no - // handler is returned resources will be loaded from pack files. This method - // is called on multiple threads. - /// - /*--cef()--*/ - virtual CefRefPtr GetResourceBundleHandler() { - return NULL; - } - - /// - // Return the handler for proxy events. If not handler is returned the default - // system handler will be used. This method is called on the IO thread. - /// - /*--cef()--*/ - virtual CefRefPtr GetProxyHandler() { - return NULL; - } -}; - -#endif // CEF_INCLUDE_CEF_APP_H_ diff --git a/cef1/include/cef_application_mac.h b/cef1/include/cef_application_mac.h deleted file mode 100644 index 33042478c..000000000 --- a/cef1/include/cef_application_mac.h +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - -#ifndef CEF_INCLUDE_CEF_APPLICATION_MAC_H_ -#define CEF_INCLUDE_CEF_APPLICATION_MAC_H_ -#pragma once - -#include "include/cef_base.h" - -#if defined(OS_MACOSX) && defined(__OBJC__) - -#ifdef BUILDING_CEF_SHARED - -// Use the existing CrAppProtocol definition. -#include "base/message_pump_mac.h" - -// Use the existing empty protocol definitions. -#import "base/mac/cocoa_protocols.h" - -#else // BUILDING_CEF_SHARED - -#import -#import - -// Copy of CrAppProtocol definition from base/message_pump_mac.h. -@protocol CrAppProtocol -// Must return true if -[NSApplication sendEvent:] is currently on the stack. -- (BOOL)isHandlingSendEvent; -@end - -// The Mac OS X 10.6 SDK introduced new protocols used for delegates. These -// protocol defintions were not present in earlier releases of the Mac OS X -// SDK. In order to support building against the new SDK, which requires -// delegates to conform to these protocols, and earlier SDKs, which do not -// define these protocols at all, this file will provide empty protocol -// definitions when used with earlier SDK versions. - -#if !defined(MAC_OS_X_VERSION_10_6) || \ -MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6 - -#define DEFINE_EMPTY_PROTOCOL(p) \ -@protocol p \ -@end - -DEFINE_EMPTY_PROTOCOL(NSAlertDelegate) -DEFINE_EMPTY_PROTOCOL(NSApplicationDelegate) -DEFINE_EMPTY_PROTOCOL(NSControlTextEditingDelegate) -DEFINE_EMPTY_PROTOCOL(NSMatrixDelegate) -DEFINE_EMPTY_PROTOCOL(NSMenuDelegate) -DEFINE_EMPTY_PROTOCOL(NSOpenSavePanelDelegate) -DEFINE_EMPTY_PROTOCOL(NSOutlineViewDataSource) -DEFINE_EMPTY_PROTOCOL(NSOutlineViewDelegate) -DEFINE_EMPTY_PROTOCOL(NSSpeechSynthesizerDelegate) -DEFINE_EMPTY_PROTOCOL(NSSplitViewDelegate) -DEFINE_EMPTY_PROTOCOL(NSTableViewDataSource) -DEFINE_EMPTY_PROTOCOL(NSTableViewDelegate) -DEFINE_EMPTY_PROTOCOL(NSTextFieldDelegate) -DEFINE_EMPTY_PROTOCOL(NSTextViewDelegate) -DEFINE_EMPTY_PROTOCOL(NSWindowDelegate) - -#undef DEFINE_EMPTY_PROTOCOL - -#endif - -#endif // BUILDING_CEF_SHARED - -// All CEF client applications must subclass NSApplication and implement this -// protocol. -@protocol CefAppProtocol -- (void)setHandlingSendEvent:(BOOL)handlingSendEvent; -@end - -// Controls the state of |isHandlingSendEvent| in the event loop so that it is -// reset properly. -class CefScopedSendingEvent { - public: - CefScopedSendingEvent() - : app_(static_cast*>( - [NSApplication sharedApplication])), - handling_([app_ isHandlingSendEvent]) { - [app_ setHandlingSendEvent:YES]; - } - ~CefScopedSendingEvent() { - [app_ setHandlingSendEvent:handling_]; - } - - private: - NSApplication* app_; - BOOL handling_; -}; - -#endif // defined(OS_MACOSX) && defined(__OBJC__) - -#endif // CEF_INCLUDE_CEF_APPLICATION_MAC_H_ diff --git a/cef1/include/cef_base.h b/cef1/include/cef_base.h deleted file mode 100644 index 5fc964fa3..000000000 --- a/cef1/include/cef_base.h +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - - -#ifndef CEF_INCLUDE_CEF_BASE_H_ -#define CEF_INCLUDE_CEF_BASE_H_ -#pragma once - -#include "include/internal/cef_build.h" -#include "include/internal/cef_ptr.h" -#include "include/internal/cef_types_wrappers.h" - -// Bring in platform-specific definitions. -#if defined(OS_WIN) -#include "include/internal/cef_win.h" -#elif defined(OS_MACOSX) -#include "include/internal/cef_mac.h" -#elif defined(OS_LINUX) -#include "include/internal/cef_linux.h" -#endif - -/// -// Interface defining the reference count implementation methods. All framework -// classes must extend the CefBase class. -/// -class CefBase { - public: - /// - // The AddRef method increments the reference count for the object. It should - // be called for every new copy of a pointer to a given object. The resulting - // reference count value is returned and should be used for diagnostic/testing - // purposes only. - /// - virtual int AddRef() =0; - - /// - // The Release method decrements the reference count for the object. If the - // reference count on the object falls to 0, then the object should free - // itself from memory. The resulting reference count value is returned and - // should be used for diagnostic/testing purposes only. - /// - virtual int Release() =0; - - /// - // Return the current number of references. - /// - virtual int GetRefCt() =0; - - protected: - virtual ~CefBase() {} -}; - - -/// -// Class that implements atomic reference counting. -/// -class CefRefCount { - public: - CefRefCount() : refct_(0) {} - - /// - // Atomic reference increment. - /// - int AddRef() { - return CefAtomicIncrement(&refct_); - } - - /// - // Atomic reference decrement. Delete the object when no references remain. - /// - int Release() { - return CefAtomicDecrement(&refct_); - } - - /// - // Return the current number of references. - /// - int GetRefCt() { return refct_; } - - private: - long refct_; // NOLINT(runtime/int) -}; - -/// -// Macro that provides a reference counting implementation for classes extending -// CefBase. -/// -#define IMPLEMENT_REFCOUNTING(ClassName) \ - public: \ - int AddRef() { return refct_.AddRef(); } \ - int Release() { \ - int retval = refct_.Release(); \ - if (retval == 0) \ - delete this; \ - return retval; \ - } \ - int GetRefCt() { return refct_.GetRefCt(); } \ - private: \ - CefRefCount refct_; - -/// -// Macro that provides a locking implementation. Use the Lock() and Unlock() -// methods to protect a section of code from simultaneous access by multiple -// threads. The AutoLock class is a helper that will hold the lock while in -// scope. -/// -#define IMPLEMENT_LOCKING(ClassName) \ - public: \ - class AutoLock { \ - public: \ - explicit AutoLock(ClassName* base) : base_(base) { base_->Lock(); } \ - ~AutoLock() { base_->Unlock(); } \ - private: \ - ClassName* base_; \ - }; \ - void Lock() { critsec_.Lock(); } \ - void Unlock() { critsec_.Unlock(); } \ - private: \ - CefCriticalSection critsec_; - -#endif // CEF_INCLUDE_CEF_BASE_H_ diff --git a/cef1/include/cef_browser.h b/cef1/include/cef_browser.h deleted file mode 100644 index 4f3508f3d..000000000 --- a/cef1/include/cef_browser.h +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_BROWSER_H_ -#define CEF_INCLUDE_CEF_BROWSER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_frame.h" -#include - -class CefClient; - -/// -// Class used to represent a browser window. The methods of this class may be -// called on any thread unless otherwise indicated in the comments. -/// -/*--cef(source=library)--*/ -class CefBrowser : public virtual CefBase { - public: - typedef cef_key_type_t KeyType; - typedef cef_mouse_button_type_t MouseButtonType; - typedef cef_paint_element_type_t PaintElementType; - - /// - // Create a new browser window using the window parameters specified by - // |windowInfo|. All values will be copied internally and the actual window - // will be created on the UI thread. This method call will not block. - /// - /*--cef(optional_param=url)--*/ - static bool CreateBrowser(CefWindowInfo& windowInfo, - CefRefPtr client, - const CefString& url, - const CefBrowserSettings& settings); - - /// - // Create a new browser window using the window parameters specified by - // |windowInfo|. This method should only be called on the UI thread. - /// - /*--cef(optional_param=url)--*/ - static CefRefPtr CreateBrowserSync(CefWindowInfo& windowInfo, - CefRefPtr client, - const CefString& url, - const CefBrowserSettings& settings); - - /// - // Call this method before destroying a contained browser window. This method - // performs any internal cleanup that may be needed before the browser window - // is destroyed. - /// - /*--cef()--*/ - virtual void ParentWindowWillClose() =0; - - /// - // Closes this browser window. - /// - /*--cef()--*/ - virtual void CloseBrowser() =0; - - /// - // Returns true if the browser can navigate backwards. - /// - /*--cef()--*/ - virtual bool CanGoBack() =0; - /// - // Navigate backwards. - /// - /*--cef()--*/ - virtual void GoBack() =0; - /// - // Returns true if the browser can navigate forwards. - /// - /*--cef()--*/ - virtual bool CanGoForward() =0; - /// - // Navigate forwards. - /// - /*--cef()--*/ - virtual void GoForward() =0; - /// - // Reload the current page. - /// - /*--cef()--*/ - virtual void Reload() =0; - /// - // Reload the current page ignoring any cached data. - /// - /*--cef()--*/ - virtual void ReloadIgnoreCache() =0; - /// - // Stop loading the page. - /// - /*--cef()--*/ - virtual void StopLoad() =0; - - /// - // Set focus for the browser window. If |enable| is true focus will be set to - // the window. Otherwise, focus will be removed. - /// - /*--cef()--*/ - virtual void SetFocus(bool enable) =0; - - /// - // Retrieve the window handle for this browser. - /// - /*--cef()--*/ - virtual CefWindowHandle GetWindowHandle() =0; - - /// - // Retrieve the window handle of the browser that opened this browser. Will - // return NULL for non-popup windows. This method can be used in combination - // with custom handling of modal windows. - /// - /*--cef()--*/ - virtual CefWindowHandle GetOpenerWindowHandle() =0; - - /// - // Returns the globally unique identifier for this browser. - /// - /*--cef()--*/ - virtual int GetIdentifier() =0; - - /// - // Returns true if the window is a popup window. - /// - /*--cef()--*/ - virtual bool IsPopup() =0; - - // Returns true if a document has been loaded in the browser. - /*--cef()--*/ - virtual bool HasDocument() =0; - - /// - // Returns the client for this browser. - /// - /*--cef()--*/ - virtual CefRefPtr GetClient() =0; - - /// - // Returns the main (top-level) frame for the browser window. - /// - /*--cef()--*/ - virtual CefRefPtr GetMainFrame() =0; - - /// - // Returns the focused frame for the browser window. This method should only - // be called on the UI thread. - /// - /*--cef()--*/ - virtual CefRefPtr GetFocusedFrame() =0; - - /// - // Returns the frame with the specified name, or NULL if not found. This - // method should only be called on the UI thread. - /// - /*--cef()--*/ - virtual CefRefPtr GetFrame(const CefString& name) =0; - - /// - // Returns the names of all existing frames. This method should only be called - // on the UI thread. - /// - /*--cef()--*/ - virtual void GetFrameNames(std::vector& names) =0; - - /// - // Search for |searchText|. |identifier| can be used to have multiple searches - // running simultaniously. |forward| indicates whether to search forward or - // backward within the page. |matchCase| indicates whether the search should - // be case-sensitive. |findNext| indicates whether this is the first request - // or a follow-up. - /// - /*--cef()--*/ - virtual void Find(int identifier, const CefString& searchText, - bool forward, bool matchCase, bool findNext) =0; - - /// - // Cancel all searches that are currently going on. - /// - /*--cef()--*/ - virtual void StopFinding(bool clearSelection) =0; - - /// - // Get the current zoom level. The default zoom level is 0.0. This method can - // only be called on the UI thread. - /// - /*--cef()--*/ - virtual double GetZoomLevel() =0; - - /// - // Change the zoom level to the specified value. Specify 0.0 to reset the - // zoom level. The change will be applied asynchronously on the UI thread. - /// - /*--cef()--*/ - virtual void SetZoomLevel(double zoomLevel) =0; - - /// - // Clear the back/forward browsing history. - /// - /*--cef()--*/ - virtual void ClearHistory() =0; - - /// - // Open developer tools in its own window. - /// - /*--cef()--*/ - virtual void ShowDevTools() =0; - - /// - // Explicitly close the developer tools window if one exists for this browser - // instance. - /// - /*--cef()--*/ - virtual void CloseDevTools() =0; - - /// - // Returns true if window rendering is disabled. - /// - /*--cef()--*/ - virtual bool IsWindowRenderingDisabled() =0; - - /// - // Get the size of the specified element. This method should only be called on - // the UI thread. - /// - /*--cef()--*/ - virtual bool GetSize(PaintElementType type, int& width, int& height) =0; - - /// - // Set the size of the specified element. This method is only used when window - // rendering is disabled. - /// - /*--cef()--*/ - virtual void SetSize(PaintElementType type, int width, int height) =0; - - /// - // Returns true if a popup is currently visible. This method should only be - // called on the UI thread. - /// - /*--cef()--*/ - virtual bool IsPopupVisible() =0; - - /// - // Hide the currently visible popup, if any. - /// - /*--cef()--*/ - virtual void HidePopup() =0; - - /// - // Invalidate the |dirtyRect| region of the view. This method is only used - // when window rendering is disabled and will result in a call to - // HandlePaint(). - /// - /*--cef()--*/ - virtual void Invalidate(const CefRect& dirtyRect) =0; - - /// - // Get the raw image data contained in the specified element without - // performing validation. The specified |width| and |height| dimensions must - // match the current element size. On Windows |buffer| must be width*height*4 - // bytes in size and represents a BGRA image with an upper-left origin. This - // method should only be called on the UI thread. - /// - /*--cef()--*/ - virtual bool GetImage(PaintElementType type, int width, int height, - void* buffer) =0; - - /// - // Send a key event to the browser. - /// - /*--cef()--*/ - virtual void SendKeyEvent(KeyType type, const CefKeyInfo& keyInfo, - int modifiers) =0; - - /// - // Send a mouse click event to the browser. The |x| and |y| coordinates are - // relative to the upper-left corner of the view. - /// - /*--cef()--*/ - virtual void SendMouseClickEvent(int x, int y, MouseButtonType type, - bool mouseUp, int clickCount) =0; - - /// - // Send a mouse move event to the browser. The |x| and |y| coordinates are - // relative to the upper-left corner of the view. - /// - /*--cef()--*/ - virtual void SendMouseMoveEvent(int x, int y, bool mouseLeave) =0; - - /// - // Send a mouse wheel event to the browser. The |x| and |y| coordinates are - // relative to the upper-left corner of the view. The |deltaX| and |deltaY| - // values represent the movement delta in the X and Y directions respectively. - /// - /*--cef()--*/ - virtual void SendMouseWheelEvent(int x, int y, int deltaX, int deltaY) =0; - - /// - // Send a focus event to the browser. - /// - /*--cef()--*/ - virtual void SendFocusEvent(bool setFocus) =0; - - /// - // Send a capture lost event to the browser. - /// - /*--cef()--*/ - virtual void SendCaptureLostEvent() =0; -}; - -#endif // CEF_INCLUDE_CEF_BROWSER_H_ diff --git a/cef1/include/cef_client.h b/cef1/include/cef_client.h deleted file mode 100644 index 0a93a3c1c..000000000 --- a/cef1/include/cef_client.h +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_CLIENT_H_ -#define CEF_INCLUDE_CEF_CLIENT_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_display_handler.h" -#include "include/cef_drag_handler.h" -#include "include/cef_find_handler.h" -#include "include/cef_focus_handler.h" -#include "include/cef_geolocation_handler.h" -#include "include/cef_jsdialog_handler.h" -#include "include/cef_keyboard_handler.h" -#include "include/cef_life_span_handler.h" -#include "include/cef_load_handler.h" -#include "include/cef_menu_handler.h" -#include "include/cef_permission_handler.h" -#include "include/cef_print_handler.h" -#include "include/cef_render_handler.h" -#include "include/cef_request_handler.h" -#include "include/cef_v8context_handler.h" -#include "include/cef_zoom_handler.h" - -/// -// Implement this interface to provide handler implementations. -/// -/*--cef(source=client,no_debugct_check)--*/ -class CefClient : public virtual CefBase { - public: - /// - // Return the handler for browser life span events. - /// - /*--cef()--*/ - virtual CefRefPtr GetLifeSpanHandler() { - return NULL; - } - - /// - // Return the handler for browser load status events. - /// - /*--cef()--*/ - virtual CefRefPtr GetLoadHandler() { - return NULL; - } - - /// - // Return the handler for browser request events. - /// - /*--cef()--*/ - virtual CefRefPtr GetRequestHandler() { - return NULL; - } - - /// - // Return the handler for browser display state events. - /// - /*--cef()--*/ - virtual CefRefPtr GetDisplayHandler() { - return NULL; - } - - /// - // Return the handler for focus events. - /// - /*--cef()--*/ - virtual CefRefPtr GetFocusHandler() { - return NULL; - } - - /// - // Return the handler for keyboard events. - /// - /*--cef()--*/ - virtual CefRefPtr GetKeyboardHandler() { - return NULL; - } - - /// - // Return the handler for context menu events. - /// - /*--cef()--*/ - virtual CefRefPtr GetMenuHandler() { - return NULL; - } - - /// - // Return the handler for browser permission events. - /// - /*--cef()--*/ - virtual CefRefPtr GetPermissionHandler() { - return NULL; - } - - /// - // Return the handler for printing events. - /// - /*--cef()--*/ - virtual CefRefPtr GetPrintHandler() { - return NULL; - } - - /// - // Return the handler for find result events. - /// - /*--cef()--*/ - virtual CefRefPtr GetFindHandler() { - return NULL; - } - - /// - // Return the handler for JavaScript dialog events. - /// - /*--cef()--*/ - virtual CefRefPtr GetJSDialogHandler() { - return NULL; - } - - /// - // Return the handler for V8 context events. - /// - /*--cef()--*/ - virtual CefRefPtr GetV8ContextHandler() { - return NULL; - } - - /// - // Return the handler for off-screen rendering events. - /// - /*--cef()--*/ - virtual CefRefPtr GetRenderHandler() { - return NULL; - } - - /// - // Return the handler for drag events. - /// - /*--cef()--*/ - virtual CefRefPtr GetDragHandler() { - return NULL; - } - - /// - // Return the handler for geolocation permissions requests. If no handler is - // provided geolocation access will be denied by default. - /// - /*--cef()--*/ - virtual CefRefPtr GetGeolocationHandler() { - return NULL; - } - - /// - // Return the handler for zoom events. If no handler is provided the default - // zoom behavior will be used. - /// - /*--cef()--*/ - virtual CefRefPtr GetZoomHandler() { - return NULL; - } -}; - -#endif // CEF_INCLUDE_CEF_CLIENT_H_ diff --git a/cef1/include/cef_command_line.h b/cef1/include/cef_command_line.h deleted file mode 100644 index a698187ee..000000000 --- a/cef1/include/cef_command_line.h +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_COMMAND_LINE_H_ -#define CEF_INCLUDE_CEF_COMMAND_LINE_H_ -#pragma once - -#include "include/cef_base.h" -#include -#include - -/// -// Class used to create and/or parse command line arguments. Arguments with -// '--', '-' and, on Windows, '/' prefixes are considered switches. Switches -// will always precede any arguments without switch prefixes. Switches can -// optionally have a value specified using the '=' delimiter (e.g. -// "-switch=value"). An argument of "--" will terminate switch parsing with all -// subsequent tokens, regardless of prefix, being interpreted as non-switch -// arguments. Switch names are considered case-insensitive. This class can be -// used before CefInitialize() is called. -/// -/*--cef(source=library,no_debugct_check)--*/ -class CefCommandLine : public virtual CefBase { - public: - typedef std::vector ArgumentList; - typedef std::map SwitchMap; - - /// - // Create a new CefCommandLine instance. - /// - /*--cef(revision_check)--*/ - static CefRefPtr CreateCommandLine(); - - /// - // Initialize the command line with the specified |argc| and |argv| values. - // The first argument must be the name of the program. This method is only - // supported on non-Windows platforms. - /// - /*--cef()--*/ - virtual void InitFromArgv(int argc, const char* const* argv) =0; - - /// - // Initialize the command line with the string returned by calling - // GetCommandLineW(). This method is only supported on Windows. - /// - /*--cef()--*/ - virtual void InitFromString(const CefString& command_line) =0; - - /// - // Constructs and returns the represented command line string. Use this method - // cautiously because quoting behavior is unclear. - /// - /*--cef()--*/ - virtual CefString GetCommandLineString() =0; - - /// - // Get the program part of the command line string (the first item). - /// - /*--cef()--*/ - virtual CefString GetProgram() =0; - - /// - // Set the program part of the command line string (the first item). - /// - /*--cef()--*/ - virtual void SetProgram(const CefString& program) =0; - - /// - // Returns true if the command line has switches. - /// - /*--cef()--*/ - virtual bool HasSwitches() =0; - - /// - // Returns true if the command line contains the given switch. - /// - /*--cef()--*/ - virtual bool HasSwitch(const CefString& name) =0; - - /// - // Returns the value associated with the given switch. If the switch has no - // value or isn't present this method returns the empty string. - /// - /*--cef()--*/ - virtual CefString GetSwitchValue(const CefString& name) =0; - - /// - // Returns the map of switch names and values. If a switch has no value an - // empty string is returned. - /// - /*--cef()--*/ - virtual void GetSwitches(SwitchMap& switches) =0; - - /// - // Add a switch to the end of the command line. If the switch has no value - // pass an empty value string. - /// - /*--cef()--*/ - virtual void AppendSwitch(const CefString& name) =0; - - /// - // Add a switch with the specified value to the end of the command line. - /// - /*--cef()--*/ - virtual void AppendSwitchWithValue(const CefString& name, - const CefString& value) =0; - - /// - // True if there are remaining command line arguments. - /// - /*--cef()--*/ - virtual bool HasArguments() =0; - - /// - // Get the remaining command line arguments. - /// - /*--cef()--*/ - virtual void GetArguments(ArgumentList& arguments) =0; - - /// - // Add an argument to the end of the command line. - /// - /*--cef()--*/ - virtual void AppendArgument(const CefString& argument) =0; -}; - -#endif // CEF_INCLUDE_CEF_COMMAND_LINE_H_ diff --git a/cef1/include/cef_content_filter.h b/cef1/include/cef_content_filter.h deleted file mode 100644 index af5cf1755..000000000 --- a/cef1/include/cef_content_filter.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_CONTENT_FILTER_H_ -#define CEF_INCLUDE_CEF_CONTENT_FILTER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_stream.h" - -/// -// Interface to implement for filtering response content. The methods of this -// class will always be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefContentFilter : public virtual CefBase { - public: - /// - // Set |substitute_data| to the replacement for the data in |data| if data - // should be modified. - /// - /*--cef()--*/ - virtual void ProcessData(const void* data, int data_size, - CefRefPtr& substitute_data) {} - - /// - // Called when there is no more data to be processed. It is expected that - // whatever data was retained in the last ProcessData() call, it should be - // returned now by setting |remainder| if appropriate. - /// - /*--cef()--*/ - virtual void Drain(CefRefPtr& remainder) {} -}; - -#endif // CEF_INCLUDE_CEF_CONTENT_FILTER_H_ diff --git a/cef1/include/cef_cookie.h b/cef1/include/cef_cookie.h deleted file mode 100644 index d24325c39..000000000 --- a/cef1/include/cef_cookie.h +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (c) 2012 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_COOKIE_H_ -#define CEF_INCLUDE_CEF_COOKIE_H_ -#pragma once - -#include "include/cef_base.h" -#include - -class CefCookieVisitor; - - -/// -// Class used for managing cookies. The methods of this class may be called on -// any thread unless otherwise indicated. -/// -/*--cef(source=library)--*/ -class CefCookieManager : public virtual CefBase { - public: - /// - // Returns the global cookie manager. By default data will be stored at - // CefSettings.cache_path if specified or in memory otherwise. - /// - /*--cef()--*/ - static CefRefPtr GetGlobalManager(); - - /// - // Creates a new cookie manager. If |path| is empty data will be stored in - // memory only. Returns NULL if creation fails. - /// - /*--cef(optional_param=path)--*/ - static CefRefPtr CreateManager(const CefString& path); - - /// - // Set the schemes supported by this manager. By default only "http" and - // "https" schemes are supported. Must be called before any cookies are - // accessed. - /// - /*--cef()--*/ - virtual void SetSupportedSchemes(const std::vector& schemes) =0; - - /// - // Visit all cookies. The returned cookies are ordered by longest path, then - // by earliest creation date. Returns false if cookies cannot be accessed. - /// - /*--cef()--*/ - virtual bool VisitAllCookies(CefRefPtr visitor) =0; - - /// - // Visit a subset of cookies. The results are filtered by the given url - // scheme, host, domain and path. If |includeHttpOnly| is true HTTP-only - // cookies will also be included in the results. The returned cookies are - // ordered by longest path, then by earliest creation date. Returns false if - // cookies cannot be accessed. - /// - /*--cef()--*/ - virtual bool VisitUrlCookies(const CefString& url, bool includeHttpOnly, - CefRefPtr visitor) =0; - - /// - // Sets a cookie given a valid URL and explicit user-provided cookie - // attributes. This function expects each attribute to be well-formed. It will - // check for disallowed characters (e.g. the ';' character is disallowed - // within the cookie value attribute) and will return false without setting - // the cookie if such characters are found. This method must be called on the - // IO thread. - /// - /*--cef()--*/ - virtual bool SetCookie(const CefString& url, const CefCookie& cookie) =0; - - /// - // Delete all cookies that match the specified parameters. If both |url| and - // values |cookie_name| are specified all host and domain cookies matching - // both will be deleted. If only |url| is specified all host cookies (but not - // domain cookies) irrespective of path will be deleted. If |url| is empty all - // cookies for all hosts and domains will be deleted. Returns false if a non- - // empty invalid URL is specified or if cookies cannot be accessed. This - // method must be called on the IO thread. - /// - /*--cef(optional_param=url,optional_param=cookie_name)--*/ - virtual bool DeleteCookies(const CefString& url, - const CefString& cookie_name) =0; - - /// - // Sets the directory path that will be used for storing cookie data. If - // |path| is empty data will be stored in memory only. Returns false if - // cookies cannot be accessed. - /// - /*--cef(optional_param=path)--*/ - virtual bool SetStoragePath(const CefString& path) =0; -}; - - -/// -// Interface to implement for visiting cookie values. The methods of this class -// will always be called on the IO thread. -/// -/*--cef(source=client)--*/ -class CefCookieVisitor : public virtual CefBase { - public: - /// - // Method that will be called once for each cookie. |count| is the 0-based - // index for the current cookie. |total| is the total number of cookies. - // Set |deleteCookie| to true to delete the cookie currently being visited. - // Return false to stop visiting cookies. This method may never be called if - // no cookies are found. - /// - /*--cef()--*/ - virtual bool Visit(const CefCookie& cookie, int count, int total, - bool& deleteCookie) =0; -}; - -#endif // CEF_INCLUDE_CEF_COOKIE_H_ diff --git a/cef1/include/cef_display_handler.h b/cef1/include/cef_display_handler.h deleted file mode 100644 index 1558da24a..000000000 --- a/cef1/include/cef_display_handler.h +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_DISPLAY_HANDLER_H_ -#define CEF_INCLUDE_CEF_DISPLAY_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" -#include "include/cef_frame.h" - -/// -// Implement this interface to handle events related to browser display state. -// The methods of this class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefDisplayHandler : public virtual CefBase { - public: - typedef cef_handler_statustype_t StatusType; - - /// - // Called when the navigation state has changed. - /// - /*--cef()--*/ - virtual void OnNavStateChange(CefRefPtr browser, - bool canGoBack, - bool canGoForward) {} - - /// - // Called when a frame's address has changed. - /// - /*--cef()--*/ - virtual void OnAddressChange(CefRefPtr browser, - CefRefPtr frame, - const CefString& url) {} - - /// - // Called when the size of the content area has changed. - /// - /*--cef()--*/ - virtual void OnContentsSizeChange(CefRefPtr browser, - CefRefPtr frame, - int width, - int height) {} - - /// - // Called when the page title changes. - /// - /*--cef(optional_param=title)--*/ - virtual void OnTitleChange(CefRefPtr browser, - const CefString& title) {} - - /// - // Called when the Favicon URL for a page changes. - /// - /*--cef()--*/ - virtual void OnFaviconURLChange(CefRefPtr browser, - const std::vector& icon_urls) {} - - /// - // Called when the browser is about to display a tooltip. |text| contains the - // text that will be displayed in the tooltip. To handle the display of the - // tooltip yourself return true. Otherwise, you can optionally modify |text| - // and then return false to allow the browser to display the tooltip. - /// - /*--cef(optional_param=text)--*/ - virtual bool OnTooltip(CefRefPtr browser, - CefString& text) { return false; } - - /// - // Called when the browser receives a status message. |text| contains the text - // that will be displayed in the status message and |type| indicates the - // status message type. - /// - /*--cef(optional_param=value)--*/ - virtual void OnStatusMessage(CefRefPtr browser, - const CefString& value, - StatusType type) {} - - /// - // Called to display a console message. Return true to stop the message from - // being output to the console. - /// - /*--cef(optional_param=message,optional_param=source)--*/ - virtual bool OnConsoleMessage(CefRefPtr browser, - const CefString& message, - const CefString& source, - int line) { return false; } -}; - -#endif // CEF_INCLUDE_CEF_DISPLAY_HANDLER_H_ diff --git a/cef1/include/cef_dom.h b/cef1/include/cef_dom.h deleted file mode 100644 index b56050d87..000000000 --- a/cef1/include/cef_dom.h +++ /dev/null @@ -1,429 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_DOM_H_ -#define CEF_INCLUDE_CEF_DOM_H_ -#pragma once - -#include "include/cef_base.h" -#include - -class CefDOMDocument; -class CefDOMEventListener; -class CefDOMNode; - -/// -// Interface to implement for visiting the DOM. The methods of this class will -// be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefDOMVisitor : public virtual CefBase { - public: - /// - // Method executed for visiting the DOM. The document object passed to this - // method represents a snapshot of the DOM at the time this method is - // executed. DOM objects are only valid for the scope of this method. Do not - // keep references to or attempt to access any DOM objects outside the scope - // of this method. - /// - /*--cef()--*/ - virtual void Visit(CefRefPtr document) =0; -}; - - -/// -// Class used to represent a DOM document. The methods of this class should only -// be called on the UI thread. -/// -/*--cef(source=library)--*/ -class CefDOMDocument : public virtual CefBase { - public: - typedef cef_dom_document_type_t Type; - - /// - // Returns the document type. - /// - /*--cef(default_retval=DOM_DOCUMENT_TYPE_UNKNOWN)--*/ - virtual Type GetType() =0; - - /// - // Returns the root document node. - /// - /*--cef()--*/ - virtual CefRefPtr GetDocument() =0; - - /// - // Returns the BODY node of an HTML document. - /// - /*--cef()--*/ - virtual CefRefPtr GetBody() =0; - - /// - // Returns the HEAD node of an HTML document. - /// - /*--cef()--*/ - virtual CefRefPtr GetHead() =0; - - /// - // Returns the title of an HTML document. - /// - /*--cef()--*/ - virtual CefString GetTitle() =0; - - /// - // Returns the document element with the specified ID value. - /// - /*--cef()--*/ - virtual CefRefPtr GetElementById(const CefString& id) =0; - - /// - // Returns the node that currently has keyboard focus. - /// - /*--cef()--*/ - virtual CefRefPtr GetFocusedNode() =0; - - /// - // Returns true if a portion of the document is selected. - /// - /*--cef()--*/ - virtual bool HasSelection() =0; - - /// - // Returns the selection start node. - /// - /*--cef()--*/ - virtual CefRefPtr GetSelectionStartNode() =0; - - /// - // Returns the selection offset within the start node. - /// - /*--cef()--*/ - virtual int GetSelectionStartOffset() =0; - - /// - // Returns the selection end node. - /// - /*--cef()--*/ - virtual CefRefPtr GetSelectionEndNode() =0; - - /// - // Returns the selection offset within the end node. - /// - /*--cef()--*/ - virtual int GetSelectionEndOffset() =0; - - /// - // Returns the contents of this selection as markup. - /// - /*--cef()--*/ - virtual CefString GetSelectionAsMarkup() =0; - - /// - // Returns the contents of this selection as text. - /// - /*--cef()--*/ - virtual CefString GetSelectionAsText() =0; - - /// - // Returns the base URL for the document. - /// - /*--cef()--*/ - virtual CefString GetBaseURL() =0; - - /// - // Returns a complete URL based on the document base URL and the specified - // partial URL. - /// - /*--cef()--*/ - virtual CefString GetCompleteURL(const CefString& partialURL) =0; -}; - - -/// -// Class used to represent a DOM node. The methods of this class should only be -// called on the UI thread. -/// -/*--cef(source=library)--*/ -class CefDOMNode : public virtual CefBase { - public: - typedef std::map AttributeMap; - typedef cef_dom_node_type_t Type; - - /// - // Returns the type for this node. - /// - /*--cef(default_retval=DOM_NODE_TYPE_UNSUPPORTED)--*/ - virtual Type GetType() =0; - - /// - // Returns true if this is a text node. - /// - /*--cef()--*/ - virtual bool IsText() =0; - - /// - // Returns true if this is an element node. - /// - /*--cef()--*/ - virtual bool IsElement() =0; - - /// - // Returns true if this is a form control element node. - /// - /*--cef()--*/ - virtual bool IsFormControlElement() =0; - - /// - // Returns the type of this form control element node. - /// - /*--cef()--*/ - virtual CefString GetFormControlElementType() =0; - - /// - // Returns true if this object is pointing to the same handle as |that| - // object. - /// - /*--cef()--*/ - virtual bool IsSame(CefRefPtr that) =0; - - /// - // Returns the name of this node. - /// - /*--cef()--*/ - virtual CefString GetName() =0; - - /// - // Returns the value of this node. - /// - /*--cef()--*/ - virtual CefString GetValue() =0; - - /// - // Set the value of this node. Returns true on success. - /// - /*--cef()--*/ - virtual bool SetValue(const CefString& value) =0; - - /// - // Returns the contents of this node as markup. - /// - /*--cef()--*/ - virtual CefString GetAsMarkup() =0; - - /// - // Returns the document associated with this node. - /// - /*--cef()--*/ - virtual CefRefPtr GetDocument() =0; - - /// - // Returns the parent node. - /// - /*--cef()--*/ - virtual CefRefPtr GetParent() =0; - - /// - // Returns the previous sibling node. - /// - /*--cef()--*/ - virtual CefRefPtr GetPreviousSibling() =0; - - /// - // Returns the next sibling node. - /// - /*--cef()--*/ - virtual CefRefPtr GetNextSibling() =0; - - /// - // Returns true if this node has child nodes. - /// - /*--cef()--*/ - virtual bool HasChildren() =0; - - /// - // Return the first child node. - /// - /*--cef()--*/ - virtual CefRefPtr GetFirstChild() =0; - - /// - // Returns the last child node. - /// - /*--cef()--*/ - virtual CefRefPtr GetLastChild() =0; - - /// - // Add an event listener to this node for the specified event type. If - // |useCapture| is true then this listener will be considered a capturing - // listener. Capturing listeners will recieve all events of the specified - // type before the events are dispatched to any other event targets beneath - // the current node in the tree. Events which are bubbling upwards through - // the tree will not trigger a capturing listener. Separate calls to this - // method can be used to register the same listener with and without capture. - // See WebCore/dom/EventNames.h for the list of supported event types. - /// - /*--cef()--*/ - virtual void AddEventListener(const CefString& eventType, - CefRefPtr listener, - bool useCapture) =0; - - - // The following methods are valid only for element nodes. - - /// - // Returns the tag name of this element. - /// - /*--cef()--*/ - virtual CefString GetElementTagName() =0; - - /// - // Returns true if this element has attributes. - /// - /*--cef()--*/ - virtual bool HasElementAttributes() =0; - - /// - // Returns true if this element has an attribute named |attrName|. - /// - /*--cef()--*/ - virtual bool HasElementAttribute(const CefString& attrName) =0; - - /// - // Returns the element attribute named |attrName|. - /// - /*--cef()--*/ - virtual CefString GetElementAttribute(const CefString& attrName) =0; - - /// - // Returns a map of all element attributes. - /// - /*--cef()--*/ - virtual void GetElementAttributes(AttributeMap& attrMap) =0; - - /// - // Set the value for the element attribute named |attrName|. Returns true on - // success. - /// - /*--cef()--*/ - virtual bool SetElementAttribute(const CefString& attrName, - const CefString& value) =0; - - /// - // Returns the inner text of the element. - /// - /*--cef()--*/ - virtual CefString GetElementInnerText() =0; -}; - - -/// -// Class used to represent a DOM event. The methods of this class should only -// be called on the UI thread. -/// -/*--cef(source=library)--*/ -class CefDOMEvent : public virtual CefBase { - public: - typedef cef_dom_event_category_t Category; - typedef cef_dom_event_phase_t Phase; - - /// - // Returns the event type. - /// - /*--cef()--*/ - virtual CefString GetType() =0; - - /// - // Returns the event category. - /// - /*--cef(default_retval=DOM_EVENT_CATEGORY_UNKNOWN)--*/ - virtual Category GetCategory() =0; - - /// - // Returns the event processing phase. - /// - /*--cef(default_retval=DOM_EVENT_PHASE_UNKNOWN)--*/ - virtual Phase GetPhase() =0; - - /// - // Returns true if the event can bubble up the tree. - /// - /*--cef()--*/ - virtual bool CanBubble() =0; - - /// - // Returns true if the event can be canceled. - /// - /*--cef()--*/ - virtual bool CanCancel() =0; - - /// - // Returns the document associated with this event. - /// - /*--cef()--*/ - virtual CefRefPtr GetDocument() =0; - - /// - // Returns the target of the event. - /// - /*--cef()--*/ - virtual CefRefPtr GetTarget() =0; - - /// - // Returns the current target of the event. - /// - /*--cef()--*/ - virtual CefRefPtr GetCurrentTarget() =0; -}; - - -/// -// Interface to implement for handling DOM events. The methods of this class -// will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefDOMEventListener : public virtual CefBase { - public: - /// - // Called when an event is received. The event object passed to this method - // contains a snapshot of the DOM at the time this method is executed. DOM - // objects are only valid for the scope of this method. Do not keep references - // to or attempt to access any DOM objects outside the scope of this method. - /// - /*--cef()--*/ - virtual void HandleEvent(CefRefPtr event) =0; -}; - -#endif // CEF_INCLUDE_CEF_DOM_H_ diff --git a/cef1/include/cef_download_handler.h b/cef1/include/cef_download_handler.h deleted file mode 100644 index 8fd209447..000000000 --- a/cef1/include/cef_download_handler.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_DOWNLOAD_HANDLER_H_ -#define CEF_INCLUDE_CEF_DOWNLOAD_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" - -/// -// Class used to handle file downloads. The methods of this class will always be -// called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefDownloadHandler : public virtual CefBase { - public: - /// - // A portion of the file contents have been received. This method will be - // called multiple times until the download is complete. Return |true| to - // continue receiving data and |false| to cancel. - /// - /*--cef()--*/ - virtual bool ReceivedData(void* data, int data_size) =0; - - /// - // The download is complete. - /// - /*--cef()--*/ - virtual void Complete() =0; -}; - -#endif // CEF_INCLUDE_CEF_DOWNLOAD_HANDLER_H_ diff --git a/cef1/include/cef_drag_data.h b/cef1/include/cef_drag_data.h deleted file mode 100644 index 54400cdd8..000000000 --- a/cef1/include/cef_drag_data.h +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_DRAG_DATA_H_ -#define CEF_INCLUDE_CEF_DRAG_DATA_H_ -#pragma once - -#include "include/cef_base.h" -#include - -/// -// Class used to represent drag data. The methods of this class may be called -// on any thread. -/// -/*--cef(source=library)--*/ -class CefDragData : public virtual CefBase { - public: - /// - // Returns true if the drag data is a link. - /// - /*--cef()--*/ - virtual bool IsLink() =0; - - /// - // Returns true if the drag data is a text or html fragment. - /// - /*--cef()--*/ - virtual bool IsFragment() =0; - - /// - // Returns true if the drag data is a file. - /// - /*--cef()--*/ - virtual bool IsFile() =0; - - /// - // Return the link URL that is being dragged. - /// - /*--cef()--*/ - virtual CefString GetLinkURL() =0; - - /// - // Return the title associated with the link being dragged. - /// - /*--cef()--*/ - virtual CefString GetLinkTitle() =0; - - /// - // Return the metadata, if any, associated with the link being dragged. - /// - /*--cef()--*/ - virtual CefString GetLinkMetadata() =0; - - /// - // Return the plain text fragment that is being dragged. - /// - /*--cef()--*/ - virtual CefString GetFragmentText() =0; - - /// - // Return the text/html fragment that is being dragged. - /// - /*--cef()--*/ - virtual CefString GetFragmentHtml() =0; - - /// - // Return the base URL that the fragment came from. This value is used for - // resolving relative URLs and may be empty. - /// - /*--cef()--*/ - virtual CefString GetFragmentBaseURL() =0; - - /// - // Return the name of the file being dragged out of the browser window. - /// - /*--cef()--*/ - virtual CefString GetFileName() =0; - - /// - // Retrieve the list of file names that are being dragged into the browser - // window. - /// - /*--cef()--*/ - virtual bool GetFileNames(std::vector& names) =0; -}; - -#endif // CEF_INCLUDE_CEF_DRAG_DATA_H_ diff --git a/cef1/include/cef_drag_handler.h b/cef1/include/cef_drag_handler.h deleted file mode 100644 index 79d90e57e..000000000 --- a/cef1/include/cef_drag_handler.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_DRAG_HANDLER_H_ -#define CEF_INCLUDE_CEF_DRAG_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_drag_data.h" -#include "include/cef_browser.h" - -/// -// Implement this interface to handle events related to dragging. The methods of -// this class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefDragHandler : public virtual CefBase { - public: - typedef cef_drag_operations_mask_t DragOperationsMask; - - /// - // Called when the browser window initiates a drag event. |dragData| - // contains the drag event data and |mask| represents the type of drag - // operation. Return false for default drag handling behavior or true to - // cancel the drag event. - /// - /*--cef()--*/ - virtual bool OnDragStart(CefRefPtr browser, - CefRefPtr dragData, - DragOperationsMask mask) { return false; } - - /// - // Called when an external drag event enters the browser window. |dragData| - // contains the drag event data and |mask| represents the type of drag - // operation. Return false for default drag handling behavior or true to - // cancel the drag event. - /// - /*--cef()--*/ - virtual bool OnDragEnter(CefRefPtr browser, - CefRefPtr dragData, - DragOperationsMask mask) { return false; } -}; - -#endif // CEF_INCLUDE_CEF_DRAG_HANDLER_H_ diff --git a/cef1/include/cef_find_handler.h b/cef1/include/cef_find_handler.h deleted file mode 100644 index bead6feeb..000000000 --- a/cef1/include/cef_find_handler.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_FIND_HANDLER_H_ -#define CEF_INCLUDE_CEF_FIND_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" - -/// -// Implement this interface to handle events related to find results. The -// methods of this class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefFindHandler : public virtual CefBase { - public: - /// - // Called to report find results returned by CefBrowser::Find(). |identifer| - // is the identifier passed to CefBrowser::Find(), |count| is the number of - // matches currently identified, |selectionRect| is the location of where the - // match was found (in window coordinates), |activeMatchOrdinal| is the - // current position in the search results, and |finalUpdate| is true if this - // is the last find notification. - /// - /*--cef()--*/ - virtual void OnFindResult(CefRefPtr browser, - int identifier, - int count, - const CefRect& selectionRect, - int activeMatchOrdinal, - bool finalUpdate) {} -}; - -#endif // CEF_INCLUDE_CEF_FIND_HANDLER_H_ diff --git a/cef1/include/cef_focus_handler.h b/cef1/include/cef_focus_handler.h deleted file mode 100644 index a45b6f52e..000000000 --- a/cef1/include/cef_focus_handler.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_FOCUS_HANDLER_H_ -#define CEF_INCLUDE_CEF_FOCUS_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" -#include "include/cef_dom.h" -#include "include/cef_frame.h" - -/// -// Implement this interface to handle events related to focus. The methods of -// this class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefFocusHandler : public virtual CefBase { - public: - typedef cef_handler_focus_source_t FocusSource; - - /// - // Called when the browser component is about to loose focus. For instance, if - // focus was on the last HTML element and the user pressed the TAB key. |next| - // will be true if the browser is giving focus to the next component and false - // if the browser is giving focus to the previous component. - /// - /*--cef()--*/ - virtual void OnTakeFocus(CefRefPtr browser, - bool next) {} - - /// - // Called when the browser component is requesting focus. |source| indicates - // where the focus request is originating from. Return false to allow the - // focus to be set or true to cancel setting the focus. - /// - /*--cef()--*/ - virtual bool OnSetFocus(CefRefPtr browser, - FocusSource source) { return false; } - - /// - // Called when a new node in the the browser gets focus. The |node| value may - // be empty if no specific node has gained focus. The node object passed to - // this method represents a snapshot of the DOM at the time this method is - // executed. DOM objects are only valid for the scope of this method. Do not - // keep references to or attempt to access any DOM objects outside the scope - // of this method. - /// - /*--cef(optional_param=frame,optional_param=node)--*/ - virtual void OnFocusedNodeChanged(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr node) {} -}; - -#endif // CEF_INCLUDE_CEF_FOCUS_HANDLER_H_ diff --git a/cef1/include/cef_frame.h b/cef1/include/cef_frame.h deleted file mode 100644 index f0ac6ef7a..000000000 --- a/cef1/include/cef_frame.h +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_FRAME_H_ -#define CEF_INCLUDE_CEF_FRAME_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_dom.h" -#include "include/cef_request.h" -#include "include/cef_stream.h" - -class CefBrowser; -class CefV8Context; - -/// -// Class used to represent a frame in the browser window. The methods of this -// class may be called on any thread unless otherwise indicated in the comments. -/// -/*--cef(source=library)--*/ -class CefFrame : public virtual CefBase { - public: - /// - // Execute undo in this frame. - /// - /*--cef()--*/ - virtual void Undo() =0; - /// - // Execute redo in this frame. - /// - /*--cef()--*/ - virtual void Redo() =0; - /// - // Execute cut in this frame. - /// - /*--cef()--*/ - virtual void Cut() =0; - /// - // Execute copy in this frame. - /// - /*--cef()--*/ - virtual void Copy() =0; - /// - // Execute paste in this frame. - /// - /*--cef()--*/ - virtual void Paste() =0; - /// - // Execute delete in this frame. - /// - /*--cef(capi_name=del)--*/ - virtual void Delete() =0; - /// - // Execute select all in this frame. - /// - /*--cef()--*/ - virtual void SelectAll() =0; - - /// - // Execute printing in the this frame. The user will be prompted with the - // print dialog appropriate to the operating system. - /// - /*--cef()--*/ - virtual void Print() =0; - - /// - // Save this frame's HTML source to a temporary file and open it in the - // default text viewing application. - /// - /*--cef()--*/ - virtual void ViewSource() =0; - - /// - // Returns this frame's HTML source as a string. This method should only be - // called on the UI thread. - /// - /*--cef()--*/ - virtual CefString GetSource() =0; - - /// - // Returns this frame's display text as a string. This method should only be - // called on the UI thread. - /// - /*--cef()--*/ - virtual CefString GetText() =0; - - /// - // Load the request represented by the |request| object. - /// - /*--cef()--*/ - virtual void LoadRequest(CefRefPtr request) =0; - - /// - // Load the specified |url|. - /// - /*--cef()--*/ - virtual void LoadURL(const CefString& url) =0; - - /// - // Load the contents of |string_val| with the optional dummy target |url|. - /// - /*--cef()--*/ - virtual void LoadString(const CefString& string_val, - const CefString& url) =0; - - /// - // Load the contents of |stream| with the optional dummy target |url|. - /// - /*--cef()--*/ - virtual void LoadStream(CefRefPtr stream, - const CefString& url) =0; - - /// - // Execute a string of JavaScript code in this frame. The |script_url| - // parameter is the URL where the script in question can be found, if any. - // The renderer may request this URL to show the developer the source of the - // error. The |start_line| parameter is the base line number to use for error - // reporting. - /// - /*--cef(optional_param=scriptUrl)--*/ - virtual void ExecuteJavaScript(const CefString& jsCode, - const CefString& scriptUrl, - int startLine) =0; - - /// - // Returns true if this is the main (top-level) frame. - /// - /*--cef()--*/ - virtual bool IsMain() =0; - - /// - // Returns true if this is the focused frame. This method should only be - // called on the UI thread. - /// - /*--cef()--*/ - virtual bool IsFocused() =0; - - /// - // Returns the name for this frame. If the frame has an assigned name (for - // example, set via the iframe "name" attribute) then that value will be - // returned. Otherwise a unique name will be constructed based on the frame - // parent hierarchy. The main (top-level) frame will always have an empty name - // value. - /// - /*--cef()--*/ - virtual CefString GetName() =0; - - /// - // Returns the globally unique identifier for this frame. - /// - /*--cef()--*/ - virtual int64 GetIdentifier() =0; - - /// - // Returns the parent of this frame or NULL if this is the main (top-level) - // frame. This method should only be called on the UI thread. - /// - /*--cef()--*/ - virtual CefRefPtr GetParent() =0; - - /// - // Returns the URL currently loaded in this frame. - /// - /*--cef()--*/ - virtual CefString GetURL() =0; - - /// - // Returns the browser that this frame belongs to. - /// - /*--cef()--*/ - virtual CefRefPtr GetBrowser() =0; - - /// - // Visit the DOM document. - /// - /*--cef()--*/ - virtual void VisitDOM(CefRefPtr visitor) =0; - - /// - // Get the V8 context associated with the frame. This method should only be - // called on the UI thread. - /// - /*--cef()--*/ - virtual CefRefPtr GetV8Context() =0; -}; - -#endif // CEF_INCLUDE_CEF_FRAME_H_ diff --git a/cef1/include/cef_geolocation.h b/cef1/include/cef_geolocation.h deleted file mode 100644 index 69c08779c..000000000 --- a/cef1/include/cef_geolocation.h +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) 2012 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_GEOLOCATION_H_ -#define CEF_INCLUDE_CEF_GEOLOCATION_H_ -#pragma once - -#include "include/cef_base.h" - -/// -// Implement this interface to receive geolocation updates. The methods of this -// class will be called on the browser process UI thread. -/// -/*--cef(source=client)--*/ -class CefGetGeolocationCallback : public virtual CefBase { - public: - /// - // Called with the 'best available' location information or, if the location - // update failed, with error information. - /// - /*--cef()--*/ - virtual void OnLocationUpdate(const CefGeoposition& position) =0; -}; - -/// -// Request a one-time geolocation update. This function bypasses any user -// permission checks so should only be used by code that is allowed to access -// location information. -/// -/*--cef()--*/ -bool CefGetGeolocation(CefRefPtr callback); - -#endif // CEF_INCLUDE_CEF_GEOLOCATION_H_ diff --git a/cef1/include/cef_geolocation_handler.h b/cef1/include/cef_geolocation_handler.h deleted file mode 100644 index 4b732b482..000000000 --- a/cef1/include/cef_geolocation_handler.h +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 2012 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_GEOLOCATION_HANDLER_H_ -#define CEF_INCLUDE_CEF_GEOLOCATION_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" - -/// -// Callback interface used for asynchronous continuation of geolocation -// permission requests. -/// -/*--cef(source=library)--*/ -class CefGeolocationCallback : public virtual CefBase { - public: - /// - // Call to allow or deny geolocation access. - /// - /*--cef(capi_name=cont)--*/ - virtual void Continue(bool allow) =0; -}; - - -/// -// Implement this interface to handle events related to geolocation permission -// requests. The methods of this class will be called on the browser process UI -// thread. -/// -/*--cef(source=client)--*/ -class CefGeolocationHandler : public virtual CefBase { - public: - /// - // Called when a page requests permission to access geolocation information. - // |requesting_url| is the URL requesting permission and |request_id| is the - // unique ID for the permission request. Call CefGeolocationCallback::Continue - // to allow or deny the permission request. - /// - /*--cef()--*/ - virtual void OnRequestGeolocationPermission( - CefRefPtr browser, - const CefString& requesting_url, - int request_id, - CefRefPtr callback) { - } - - /// - // Called when a geolocation access request is canceled. |requesting_url| is - // the URL that originally requested permission and |request_id| is the unique - // ID for the permission request. - /// - /*--cef()--*/ - virtual void OnCancelGeolocationPermission( - CefRefPtr browser, - const CefString& requesting_url, - int request_id) { - } -}; - -#endif // CEF_INCLUDE_CEF_GEOLOCATION_HANDLER_H_ diff --git a/cef1/include/cef_jsdialog_handler.h b/cef1/include/cef_jsdialog_handler.h deleted file mode 100644 index d3067f3c0..000000000 --- a/cef1/include/cef_jsdialog_handler.h +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_JSDIALOG_HANDLER_H_ -#define CEF_INCLUDE_CEF_JSDIALOG_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" -#include "include/cef_frame.h" - -/// -// Implement this interface to handle events related to JavaScript dialogs. The -// methods of this class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefJSDialogHandler : public virtual CefBase { - public: - /// - // Called to run a JavaScript alert message. Return false to display the - // default alert or true if you displayed a custom alert. - /// - /*--cef(optional_param=message)--*/ - virtual bool OnJSAlert(CefRefPtr browser, - CefRefPtr frame, - const CefString& message) { return false; } - - /// - // Called to run a JavaScript confirm request. Return false to display the - // default alert or true if you displayed a custom alert. If you handled the - // alert set |retval| to true if the user accepted the confirmation. - /// - /*--cef(optional_param=message)--*/ - virtual bool OnJSConfirm(CefRefPtr browser, - CefRefPtr frame, - const CefString& message, - bool& retval) { return false; } - - /// - // Called to run a JavaScript prompt request. Return false to display the - // default prompt or true if you displayed a custom prompt. If you handled - // the prompt set |retval| to true if the user accepted the prompt and request - // and |result| to the resulting value. - /// - /*--cef(optional_param=message,optional_param=defaultValue)--*/ - virtual bool OnJSPrompt(CefRefPtr browser, - CefRefPtr frame, - const CefString& message, - const CefString& defaultValue, - bool& retval, - CefString& result) { return false; } -}; - -#endif // CEF_INCLUDE_CEF_JSDIALOG_HANDLER_H_ diff --git a/cef1/include/cef_keyboard_handler.h b/cef1/include/cef_keyboard_handler.h deleted file mode 100644 index a8133e91f..000000000 --- a/cef1/include/cef_keyboard_handler.h +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_KEYBOARD_HANDLER_H_ -#define CEF_INCLUDE_CEF_KEYBOARD_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" - -/// -// Implement this interface to handle events related to keyboard input. The -// methods of this class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefKeyboardHandler : public virtual CefBase { - public: - typedef cef_handler_keyevent_type_t KeyEventType; - - /// - // Called when the browser component receives a keyboard event. This method - // is called both before the event is passed to the renderer and after - // JavaScript in the page has had a chance to handle the event. |type| is the - // type of keyboard event, |code| is the windows scan-code for the event, - // |modifiers| is a set of bit- flags describing any pressed modifier keys and - // |isSystemKey| is true if Windows considers this a 'system key' message (see - // http://msdn.microsoft.com/en-us/library/ms646286(VS.85).aspx). If - // |isAfterJavaScript| is true then JavaScript in the page has had a chance - // to handle the event and has chosen not to. Only RAWKEYDOWN, KEYDOWN and - // CHAR events will be sent with |isAfterJavaScript| set to true. Return - // true if the keyboard event was handled or false to allow continued handling - // of the event by the renderer. - /// - /*--cef()--*/ - virtual bool OnKeyEvent(CefRefPtr browser, - KeyEventType type, - int code, - int modifiers, - bool isSystemKey, - bool isAfterJavaScript) { return false; } -}; - -#endif // CEF_INCLUDE_CEF_KEYBOARD_HANDLER_H_ diff --git a/cef1/include/cef_life_span_handler.h b/cef1/include/cef_life_span_handler.h deleted file mode 100644 index 907d755a8..000000000 --- a/cef1/include/cef_life_span_handler.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_LIFE_SPAN_HANDLER_H_ -#define CEF_INCLUDE_CEF_LIFE_SPAN_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" - -class CefClient; - -/// -// Implement this interface to handle events related to browser life span. The -// methods of this class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefLifeSpanHandler : public virtual CefBase { - public: - /// - // Called before a new popup window is created. The |parentBrowser| parameter - // will point to the parent browser window. The |popupFeatures| parameter will - // contain information about the style of popup window requested. Return false - // to have the framework create the new popup window based on the parameters - // in |windowInfo|. Return true to cancel creation of the popup window. By - // default, a newly created popup window will have the same client and - // settings as the parent window. To change the client for the new window - // modify the object that |client| points to. To change the settings for the - // new window modify the |settings| structure. - /// - /*--cef(optional_param=url)--*/ - virtual bool OnBeforePopup(CefRefPtr parentBrowser, - const CefPopupFeatures& popupFeatures, - CefWindowInfo& windowInfo, - const CefString& url, - CefRefPtr& client, - CefBrowserSettings& settings) { return false; } - - /// - // Called after a new window is created. - /// - /*--cef()--*/ - virtual void OnAfterCreated(CefRefPtr browser) {} - - /// - // Called when a modal window is about to display and the modal loop should - // begin running. Return false to use the default modal loop implementation or - // true to use a custom implementation. - /// - /*--cef()--*/ - virtual bool RunModal(CefRefPtr browser) { return false; } - - /// - // Called when a window has recieved a request to close. Return false to - // proceed with the window close or true to cancel the window close. If this - // is a modal window and a custom modal loop implementation was provided in - // RunModal() this callback should be used to restore the opener window to a - // usable state. - /// - /*--cef()--*/ - virtual bool DoClose(CefRefPtr browser) { return false; } - - /// - // Called just before a window is closed. If this is a modal window and a - // custom modal loop implementation was provided in RunModal() this callback - // should be used to exit the custom modal loop. - /// - /*--cef()--*/ - virtual void OnBeforeClose(CefRefPtr browser) {} -}; - -#endif // CEF_INCLUDE_CEF_LIFE_SPAN_HANDLER_H_ diff --git a/cef1/include/cef_load_handler.h b/cef1/include/cef_load_handler.h deleted file mode 100644 index bfa01df25..000000000 --- a/cef1/include/cef_load_handler.h +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_LOAD_HANDLER_H_ -#define CEF_INCLUDE_CEF_LOAD_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" -#include "include/cef_frame.h" - -/// -// Implement this interface to handle events related to browser load status. The -// methods of this class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefLoadHandler : public virtual CefBase { - public: - typedef cef_handler_errorcode_t ErrorCode; - - /// - // Called when the browser begins loading a frame. The |frame| value will - // never be empty -- call the IsMain() method to check if this frame is the - // main frame. Multiple frames may be loading at the same time. Sub-frames may - // start or continue loading after the main frame load has ended. This method - // may not be called for a particular frame if the load request for that frame - // fails. - /// - /*--cef()--*/ - virtual void OnLoadStart(CefRefPtr browser, - CefRefPtr frame) {} - - /// - // Called when the browser is done loading a frame. The |frame| value will - // never be empty -- call the IsMain() method to check if this frame is the - // main frame. Multiple frames may be loading at the same time. Sub-frames may - // start or continue loading after the main frame load has ended. This method - // will always be called for all frames irrespective of whether the request - // completes successfully. - /// - /*--cef()--*/ - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) {} - - /// - // Called when the browser fails to load a resource. |errorCode| is the error - // code number and |failedUrl| is the URL that failed to load. To provide - // custom error text assign the text to |errorText| and return true. - // Otherwise, return false for the default error text. See - // net\base\net_error_list.h for complete descriptions of the error codes. - /// - /*--cef()--*/ - virtual bool OnLoadError(CefRefPtr browser, - CefRefPtr frame, - ErrorCode errorCode, - const CefString& failedUrl, - CefString& errorText) { return false; } -}; - -#endif // CEF_INCLUDE_CEF_LOAD_HANDLER_H_ diff --git a/cef1/include/cef_menu_handler.h b/cef1/include/cef_menu_handler.h deleted file mode 100644 index 81fe115b1..000000000 --- a/cef1/include/cef_menu_handler.h +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_MENU_HANDLER_H_ -#define CEF_INCLUDE_CEF_MENU_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" - -/// -// Implement this interface to handle events related to browser context menus. -// The methods of this class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefMenuHandler : public virtual CefBase { - public: - typedef cef_menu_id_t MenuId; - - /// - // Called before a context menu is displayed. Return false to display the - // default context menu or true to cancel the display. - /// - /*--cef()--*/ - virtual bool OnBeforeMenu(CefRefPtr browser, - const CefMenuInfo& menuInfo) { return false; } - - /// - // Called to optionally override the default text for a context menu item. - // |label| contains the default text and may be modified to substitute - // alternate text. - /// - /*--cef()--*/ - virtual void GetMenuLabel(CefRefPtr browser, - MenuId menuId, - CefString& label) {} - - /// - // Called when an option is selected from the default context menu. Return - // false to execute the default action or true to cancel the action. - /// - /*--cef()--*/ - virtual bool OnMenuAction(CefRefPtr browser, - MenuId menuId) { return false; } -}; - -#endif // CEF_INCLUDE_CEF_MENU_HANDLER_H_ diff --git a/cef1/include/cef_nplugin.h b/cef1/include/cef_nplugin.h deleted file mode 100644 index 4b16fe91f..000000000 --- a/cef1/include/cef_nplugin.h +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - - -#ifndef CEF_INCLUDE_CEF_NPLUGIN_H_ -#define CEF_INCLUDE_CEF_NPLUGIN_H_ -#pragma once - -#include "internal/cef_nplugin_types.h" - -/// -// Netscape plugins are normally built at separate DLLs that are loaded by the -// browser when needed. This interface supports the creation of plugins that -// are an embedded component of the application. Embedded plugins built using -// this interface use the same Netscape Plugin API as DLL-based plugins. -// See https://developer.mozilla.org/En/Gecko_Plugin_API_Reference for complete -// documentation on how to use the Netscape Plugin API. -// -// This class provides attribute information and entry point functions for a -// plugin. -/// -class CefPluginInfo : public cef_plugin_info_t { - public: - CefPluginInfo() { - Init(); - } - virtual ~CefPluginInfo() { - Reset(); - } - - CefPluginInfo(const CefPluginInfo& r) { // NOLINT(runtime/explicit) - Init(); - *this = r; - } - CefPluginInfo(const cef_plugin_info_t& r) { // NOLINT(runtime/explicit) - Init(); - *this = r; - } - - void Reset() { - cef_string_clear(&unique_name); - cef_string_clear(&display_name); - cef_string_clear(&version); - cef_string_clear(&description); - cef_string_clear(&mime_types); - cef_string_clear(&file_extensions); - cef_string_clear(&type_descriptions); - Init(); - } - - void Attach(const cef_plugin_info_t& r) { - Reset(); - *static_cast(this) = r; - } - - void Detach() { - Init(); - } - - CefPluginInfo& operator=(const CefPluginInfo& r) { - return operator=(static_cast(r)); - } - - CefPluginInfo& operator=(const cef_plugin_info_t& r) { - cef_string_copy(r.unique_name.str, r.unique_name.length, &unique_name); - cef_string_copy(r.display_name.str, r.display_name.length, &display_name); - cef_string_copy(r.version.str, r.version.length, &version); - cef_string_copy(r.description.str, r.description.length, &description); - cef_string_copy(r.mime_types.str, r.mime_types.length, &mime_types); - cef_string_copy(r.file_extensions.str, r.file_extensions.length, - &file_extensions); - cef_string_copy(r.type_descriptions.str, r.type_descriptions.length, - &type_descriptions); -#if !defined(OS_POSIX) || defined(OS_MACOSX) - np_getentrypoints = r.np_getentrypoints; -#endif - np_initialize = r.np_initialize; - np_shutdown = r.np_shutdown; - return *this; - } - - protected: - void Init() { - memset(static_cast(this), 0, sizeof(cef_plugin_info_t)); - } -}; - -/// -// Register a plugin with the system. -/// -bool CefRegisterPlugin(const CefPluginInfo& plugin_info); - -#endif // CEF_INCLUDE_CEF_NPLUGIN_H_ diff --git a/cef1/include/cef_origin_whitelist.h b/cef1/include/cef_origin_whitelist.h deleted file mode 100644 index fd434460e..000000000 --- a/cef1/include/cef_origin_whitelist.h +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_ORIGIN_WHITELIST_H_ -#define CEF_INCLUDE_CEF_ORIGIN_WHITELIST_H_ -#pragma once - -#include "include/cef_base.h" - - -/// -// Add an entry to the cross-origin access whitelist. -// -// The same-origin policy restricts how scripts hosted from different origins -// (scheme + domain + port) can communicate. By default, scripts can only access -// resources with the same origin. Scripts hosted on the HTTP and HTTPS schemes -// (but no other schemes) can use the "Access-Control-Allow-Origin" header to -// allow cross-origin requests. For example, https://source.example.com can make -// XMLHttpRequest requests on http://target.example.com if the -// http://target.example.com request returns an "Access-Control-Allow-Origin: -// https://source.example.com" response header. -// -// Scripts in separate frames or iframes and hosted from the same protocol and -// domain suffix can execute cross-origin JavaScript if both pages set the -// document.domain value to the same domain suffix. For example, -// scheme://foo.example.com and scheme://bar.example.com can communicate using -// JavaScript if both domains set document.domain="example.com". -// -// This method is used to allow access to origins that would otherwise violate -// the same-origin policy. Scripts hosted underneath the fully qualified -// |source_origin| URL (like http://www.example.com) will be allowed access to -// all resources hosted on the specified |target_protocol| and |target_domain|. -// If |target_domain| is non-empty and |allow_target_subdomains| if false only -// exact domain matches will be allowed. If |target_domain| is non-empty and -// |allow_target_subdomains| is true sub-domain matches will be allowed. If -// |target_domain| is empty and |allow_target_subdomains| if true all domains -// and IP addresses will be allowed. -// -// This method cannot be used to bypass the restrictions on local or display -// isolated schemes. See the comments on CefRegisterCustomScheme for more -// information. -// -// This function may be called on any thread. Returns false if |source_origin| -// is invalid or the whitelist cannot be accessed. -/// -/*--cef(optional_param=target_domain)--*/ -bool CefAddCrossOriginWhitelistEntry(const CefString& source_origin, - const CefString& target_protocol, - const CefString& target_domain, - bool allow_target_subdomains); - -/// -// Remove an entry from the cross-origin access whitelist. Returns false if -// |source_origin| is invalid or the whitelist cannot be accessed. -/// -/*--cef(optional_param=target_domain)--*/ -bool CefRemoveCrossOriginWhitelistEntry(const CefString& source_origin, - const CefString& target_protocol, - const CefString& target_domain, - bool allow_target_subdomains); - -/// -// Remove all entries from the cross-origin access whitelist. Returns false if -// the whitelist cannot be accessed. -/// -/*--cef()--*/ -bool CefClearCrossOriginWhitelist(); - -#endif // CEF_INCLUDE_CEF_ORIGIN_WHITELIST_H_ diff --git a/cef1/include/cef_permission_handler.h b/cef1/include/cef_permission_handler.h deleted file mode 100644 index aea8e46bb..000000000 --- a/cef1/include/cef_permission_handler.h +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2012 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_PERMISSION_HANDLER_H_ -#define CEF_INCLUDE_CEF_PERMISSION_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" -#include "include/cef_frame.h" - -/// -// Implement this interface to handle events related to browser permissions. -// The methods of this class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefPermissionHandler : public virtual CefBase { - public: - /// - // Called on the UI thread before a script extension is loaded. - // Return false to let the extension load normally. - /// - /*--cef()--*/ - virtual bool OnBeforeScriptExtensionLoad(CefRefPtr browser, - CefRefPtr frame, - const CefString& extensionName) { - return false; - } -}; - -#endif // CEF_INCLUDE_CEF_PERMISSION_HANDLER_H_ diff --git a/cef1/include/cef_print_handler.h b/cef1/include/cef_print_handler.h deleted file mode 100644 index d47fbf632..000000000 --- a/cef1/include/cef_print_handler.h +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_PRINT_HANDLER_H_ -#define CEF_INCLUDE_CEF_PRINT_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" -#include "include/cef_frame.h" - -/// -// Implement this interface to handle events related to printing. The methods of -// this class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefPrintHandler : public virtual CefBase { - public: - /// - // Called to allow customization of standard print options before the print - // dialog is displayed. |printOptions| allows specification of paper size, - // orientation and margins. Note that the specified margins may be adjusted if - // they are outside the range supported by the printer. All units are in - // inches. Return false to display the default print options or true to - // display the modified |printOptions|. - /// - /*--cef()--*/ - virtual bool GetPrintOptions(CefRefPtr browser, - CefPrintOptions& printOptions) { return false; } - - /// - // Called to format print headers and footers. |printInfo| contains platform- - // specific information about the printer context. |url| is the URL if the - // currently printing page, |title| is the title of the currently printing - // page, |currentPage| is the current page number and |maxPages| is the total - // number of pages. Six default header locations are provided by the - // implementation: top left, top center, top right, bottom left, bottom center - // and bottom right. To use one of these default locations just assign a - // string to the appropriate variable. To draw the header and footer yourself - // return true. Otherwise, populate the approprate variables and return false. - /// - /*--cef()--*/ - virtual bool GetPrintHeaderFooter(CefRefPtr browser, - CefRefPtr frame, - const CefPrintInfo& printInfo, - const CefString& url, - const CefString& title, - int currentPage, - int maxPages, - CefString& topLeft, - CefString& topCenter, - CefString& topRight, - CefString& bottomLeft, - CefString& bottomCenter, - CefString& bottomRight) { return false; } -}; - -#endif // CEF_INCLUDE_CEF_PRINT_HANDLER_H_ diff --git a/cef1/include/cef_proxy_handler.h b/cef1/include/cef_proxy_handler.h deleted file mode 100644 index d40c67d7c..000000000 --- a/cef1/include/cef_proxy_handler.h +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_PROXY_HANDLER_H_ -#define CEF_INCLUDE_CEF_PROXY_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" - -/// -// Implement this interface to handle proxy resolution events. -/// -/*--cef(source=client)--*/ -class CefProxyHandler : public virtual CefBase { - public: - /// - // Called to retrieve proxy information for the specified |url|. - /// - /*--cef()--*/ - virtual void GetProxyForUrl(const CefString& url, - CefProxyInfo& proxy_info) {} -}; - -#endif // CEF_INCLUDE_CEF_PROXY_HANDLER_H_ diff --git a/cef1/include/cef_render_handler.h b/cef1/include/cef_render_handler.h deleted file mode 100644 index 643fbbf56..000000000 --- a/cef1/include/cef_render_handler.h +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_RENDER_HANDLER_H_ -#define CEF_INCLUDE_CEF_RENDER_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" -#include - -/// -// Implement this interface to handle events when window rendering is disabled. -// The methods of this class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefRenderHandler : public virtual CefBase { - public: - typedef cef_paint_element_type_t PaintElementType; - typedef std::vector RectList; - - /// - // Called to retrieve the view rectangle which is relative to screen - // coordinates. Return true if the rectangle was provided. - /// - /*--cef()--*/ - virtual bool GetViewRect(CefRefPtr browser, - CefRect& rect) { return false; } - - /// - // Called to retrieve the simulated screen rectangle. Return true if the - // rectangle was provided. - /// - /*--cef()--*/ - virtual bool GetScreenRect(CefRefPtr browser, - CefRect& rect) { return false; } - - /// - // Called to retrieve the translation from view coordinates to actual screen - // coordinates. Return true if the screen coordinates were provided. - /// - /*--cef()--*/ - virtual bool GetScreenPoint(CefRefPtr browser, - int viewX, - int viewY, - int& screenX, - int& screenY) { return false; } - - /// - // Called when the browser wants to show or hide the popup widget. The popup - // should be shown if |show| is true and hidden if |show| is false. - /// - /*--cef()--*/ - virtual void OnPopupShow(CefRefPtr browser, - bool show) {} - - /// - // Called when the browser wants to move or resize the popup widget. |rect| - // contains the new location and size. - /// - /*--cef()--*/ - virtual void OnPopupSize(CefRefPtr browser, - const CefRect& rect) {} - - /// - // Called when an element should be painted. |type| indicates whether the - // element is the view or the popup widget. |buffer| contains the pixel data - // for the whole image. |dirtyRects| contains the set of rectangles that need - // to be repainted. On Windows |buffer| will be width*height*4 bytes in size - // and represents a BGRA image with an upper-left origin. The - // CefBrowserSettings.animation_frame_rate value controls the rate at which - // this method is called. - /// - /*--cef()--*/ - virtual void OnPaint(CefRefPtr browser, - PaintElementType type, - const RectList& dirtyRects, - const void* buffer) {} - - /// - // Called when the browser window's cursor has changed. - /// - /*--cef()--*/ - virtual void OnCursorChange(CefRefPtr browser, - CefCursorHandle cursor) {} -}; - -#endif // CEF_INCLUDE_CEF_RENDER_HANDLER_H_ diff --git a/cef1/include/cef_request.h b/cef1/include/cef_request.h deleted file mode 100644 index 95ade79b1..000000000 --- a/cef1/include/cef_request.h +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_REQUEST_H_ -#define CEF_INCLUDE_CEF_REQUEST_H_ -#pragma once - -#include "include/cef_base.h" -#include -#include - -class CefPostData; -class CefPostDataElement; - -/// -// Class used to represent a web request. The methods of this class may be -// called on any thread. -/// -/*--cef(source=library)--*/ -class CefRequest : public virtual CefBase { - public: - typedef std::multimap HeaderMap; - typedef cef_weburlrequest_flags_t RequestFlags; - - /// - // Create a new CefRequest object. - /// - /*--cef()--*/ - static CefRefPtr CreateRequest(); - - /// - // Get the fully qualified URL. - /// - /*--cef()--*/ - virtual CefString GetURL() =0; - /// - // Set the fully qualified URL. - /// - /*--cef()--*/ - virtual void SetURL(const CefString& url) =0; - - /// - // Get the request method type. The value will default to POST if post data - // is provided and GET otherwise. - /// - /*--cef()--*/ - virtual CefString GetMethod() =0; - /// - // Set the request method type. - /// - /*--cef()--*/ - virtual void SetMethod(const CefString& method) =0; - - /// - // Get the post data. - /// - /*--cef()--*/ - virtual CefRefPtr GetPostData() =0; - /// - // Set the post data. - /// - /*--cef()--*/ - virtual void SetPostData(CefRefPtr postData) =0; - - /// - // Get the header values. - /// - /*--cef()--*/ - virtual void GetHeaderMap(HeaderMap& headerMap) =0; - /// - // Set the header values. - /// - /*--cef()--*/ - virtual void SetHeaderMap(const HeaderMap& headerMap) =0; - - /// - // Set all values at one time. - /// - /*--cef(optional_param=postData)--*/ - virtual void Set(const CefString& url, - const CefString& method, - CefRefPtr postData, - const HeaderMap& headerMap) =0; - - /// - // Get the flags used in combination with CefWebURLRequest. - /// - /*--cef(default_retval=WUR_FLAG_NONE)--*/ - virtual RequestFlags GetFlags() =0; - /// - // Set the flags used in combination with CefWebURLRequest. - /// - /*--cef()--*/ - virtual void SetFlags(RequestFlags flags) =0; - - /// - // Set the URL to the first party for cookies used in combination with - // CefWebURLRequest. - /// - /*--cef()--*/ - virtual CefString GetFirstPartyForCookies() =0; - /// - // Get the URL to the first party for cookies used in combination with - // CefWebURLRequest. - /// - /*--cef()--*/ - virtual void SetFirstPartyForCookies(const CefString& url) =0; -}; - - -/// -// Class used to represent post data for a web request. The methods of this -// class may be called on any thread. -/// -/*--cef(source=library)--*/ -class CefPostData : public virtual CefBase { - public: - typedef std::vector > ElementVector; - - /// - // Create a new CefPostData object. - /// - /*--cef()--*/ - static CefRefPtr CreatePostData(); - - /// - // Returns the number of existing post data elements. - /// - /*--cef()--*/ - virtual size_t GetElementCount() =0; - - /// - // Retrieve the post data elements. - /// - /*--cef(count_func=elements:GetElementCount)--*/ - virtual void GetElements(ElementVector& elements) =0; - - /// - // Remove the specified post data element. Returns true if the removal - // succeeds. - /// - /*--cef()--*/ - virtual bool RemoveElement(CefRefPtr element) =0; - - /// - // Add the specified post data element. Returns true if the add succeeds. - /// - /*--cef()--*/ - virtual bool AddElement(CefRefPtr element) =0; - - /// - // Remove all existing post data elements. - /// - /*--cef()--*/ - virtual void RemoveElements() =0; -}; - - -/// -// Class used to represent a single element in the request post data. The -// methods of this class may be called on any thread. -/// -/*--cef(source=library)--*/ -class CefPostDataElement : public virtual CefBase { - public: - /// - // Post data elements may represent either bytes or files. - /// - typedef cef_postdataelement_type_t Type; - - /// - // Create a new CefPostDataElement object. - /// - /*--cef()--*/ - static CefRefPtr CreatePostDataElement(); - - /// - // Remove all contents from the post data element. - /// - /*--cef()--*/ - virtual void SetToEmpty() =0; - - /// - // The post data element will represent a file. - /// - /*--cef()--*/ - virtual void SetToFile(const CefString& fileName) =0; - - /// - // The post data element will represent bytes. The bytes passed - // in will be copied. - /// - /*--cef()--*/ - virtual void SetToBytes(size_t size, const void* bytes) =0; - - /// - // Return the type of this post data element. - /// - /*--cef(default_retval=PDE_TYPE_EMPTY)--*/ - virtual Type GetType() =0; - - /// - // Return the file name. - /// - /*--cef()--*/ - virtual CefString GetFile() =0; - - /// - // Return the number of bytes. - /// - /*--cef()--*/ - virtual size_t GetBytesCount() =0; - - /// - // Read up to |size| bytes into |bytes| and return the number of bytes - // actually read. - /// - /*--cef()--*/ - virtual size_t GetBytes(size_t size, void* bytes) =0; -}; - -#endif // CEF_INCLUDE_CEF_REQUEST_H_ diff --git a/cef1/include/cef_request_handler.h b/cef1/include/cef_request_handler.h deleted file mode 100644 index a9c7f1d66..000000000 --- a/cef1/include/cef_request_handler.h +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_REQUEST_HANDLER_H_ -#define CEF_INCLUDE_CEF_REQUEST_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" -#include "include/cef_cookie.h" -#include "include/cef_download_handler.h" -#include "include/cef_frame.h" -#include "include/cef_content_filter.h" -#include "include/cef_response.h" -#include "include/cef_request.h" -#include "include/cef_stream.h" - -/// -// Implement this interface to handle events related to browser requests. The -// methods of this class will be called on the thread indicated. -/// -/*--cef(source=client)--*/ -class CefRequestHandler : public virtual CefBase { - public: - typedef cef_handler_navtype_t NavType; - - /// - // Called on the UI thread before browser navigation. Return true to cancel - // the navigation or false to allow the navigation to proceed. - /// - /*--cef()--*/ - virtual bool OnBeforeBrowse(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr request, - NavType navType, - bool isRedirect) { return false; } - - /// - // Called on the IO thread before a resource is loaded. To allow the resource - // to load normally return false. To redirect the resource to a new url - // populate the |redirectUrl| value and return false. To specify data for the - // resource return a CefStream object in |resourceStream|, use the |response| - // object to set mime type, HTTP status code and optional header values, and - // return false. To cancel loading of the resource return true. Any - // modifications to |request| will be observed. If the URL in |request| is - // changed and |redirectUrl| is also set, the URL in |request| will be used. - /// - /*--cef()--*/ - virtual bool OnBeforeResourceLoad(CefRefPtr browser, - CefRefPtr request, - CefString& redirectUrl, - CefRefPtr& resourceStream, - CefRefPtr response, - int loadFlags) { return false; } - - /// - // Called on the IO thread when a resource load is redirected. The |old_url| - // parameter will contain the old URL. The |new_url| parameter will contain - // the new URL and can be changed if desired. - /// - /*--cef()--*/ - virtual void OnResourceRedirect(CefRefPtr browser, - const CefString& old_url, - CefString& new_url) {} - - /// - // Called on the UI thread after a response to the resource request is - // received. Set |filter| if response content needs to be monitored and/or - // modified as it arrives. - /// - /*--cef()--*/ - virtual void OnResourceResponse(CefRefPtr browser, - const CefString& url, - CefRefPtr response, - CefRefPtr& filter) {} - - /// - // Called on the IO thread to handle requests for URLs with an unknown - // protocol component. Return true to indicate that the request should - // succeed because it was handled externally. Set |allowOSExecution| to true - // and return false to attempt execution via the registered OS protocol - // handler, if any. If false is returned and either |allow_os_execution| - // is false or OS protocol handler execution fails then the request will fail - // with an error condition. - // SECURITY WARNING: YOU SHOULD USE THIS METHOD TO ENFORCE RESTRICTIONS BASED - // ON SCHEME, HOST OR OTHER URL ANALYSIS BEFORE ALLOWING OS EXECUTION. - /// - /*--cef()--*/ - virtual bool OnProtocolExecution(CefRefPtr browser, - const CefString& url, - bool& allowOSExecution) { return false; } - - /// - // Called on the UI thread when a server indicates via the - // 'Content-Disposition' header that a response represents a file to download. - // |mimeType| is the mime type for the download, |fileName| is the suggested - // target file name and |contentLength| is either the value of the - // 'Content-Size' header or -1 if no size was provided. Set |handler| to the - // CefDownloadHandler instance that will recieve the file contents. Return - // true to download the file or false to cancel the file download. - /// - /*--cef(optional_param=mimeType)--*/ - virtual bool GetDownloadHandler(CefRefPtr browser, - const CefString& mimeType, - const CefString& fileName, - int64 contentLength, - CefRefPtr& handler) - { return false; } - - /// - // Called on the IO thread when the browser needs credentials from the user. - // |isProxy| indicates whether the host is a proxy server. |host| contains the - // hostname and port number. Set |username| and |password| and return - // true to handle the request. Return false to cancel the request. - /// - /*--cef(optional_param=realm)--*/ - virtual bool GetAuthCredentials(CefRefPtr browser, - bool isProxy, - const CefString& host, - int port, - const CefString& realm, - const CefString& scheme, - CefString& username, - CefString& password) { return false; } - - /// - // Called on the IO thread to retrieve the cookie manager. |main_url| is the - // URL of the top-level frame. Cookies managers can be unique per browser or - // shared across multiple browsers. The global cookie manager will be used if - // this method returns NULL. - /// - /*--cef()--*/ - virtual CefRefPtr GetCookieManager( - CefRefPtr browser, - const CefString& main_url) { return NULL; } -}; - -#endif // CEF_INCLUDE_CEF_REQUEST_HANDLER_H_ diff --git a/cef1/include/cef_resource_bundle_handler.h b/cef1/include/cef_resource_bundle_handler.h deleted file mode 100644 index e7a37d1b5..000000000 --- a/cef1/include/cef_resource_bundle_handler.h +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2012 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_RESOURCE_BUNDLE_HANDLER_H_ -#define CEF_INCLUDE_CEF_RESOURCE_BUNDLE_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" - -/// -// Class used to implement a custom resource bundle interface. The methods of -// this class may be called on multiple threads. -/// -/*--cef(source=client)--*/ -class CefResourceBundleHandler : public virtual CefBase { - public: - /// - // Called to retrieve a localized translation for the string specified by - // |message_id|. To provide the translation set |string| to the translation - // string and return true. To use the default translation return false. - // - // WARNING: Be cautious when implementing this method. ID values are auto- - // generated when CEF is built and may change between versions. Existing ID - // values can be discovered by searching for *_strings.h in the - // "obj/global_intermediate" build output directory. - /// - /*--cef()--*/ - virtual bool GetLocalizedString(int message_id, - CefString& string) =0; - - /// - // Called to retrieve data for the resource specified by |resource_id|. To - // provide the resource data set |data| and |data_size| to the data pointer - // and size respectively and return true. To use the default resource data - // return false. The resource data will not be copied and must remain resident - // in memory. - // - // WARNING: Be cautious when implementing this method. ID values are auto- - // generated when CEF is built and may change between versions. Existing ID - // values can be discovered by searching for *_resources.h in the - // "obj/global_intermediate" build output directory. - /// - /*--cef()--*/ - virtual bool GetDataResource(int resource_id, - void*& data, - size_t& data_size) =0; -}; - -#endif // CEF_INCLUDE_CEF_RESOURCE_BUNDLE_HANDLER_H_ diff --git a/cef1/include/cef_response.h b/cef1/include/cef_response.h deleted file mode 100644 index 5448cd71c..000000000 --- a/cef1/include/cef_response.h +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_RESPONSE_H_ -#define CEF_INCLUDE_CEF_RESPONSE_H_ -#pragma once - -#include "include/cef_base.h" -#include - -/// -// Class used to represent a web response. The methods of this class may be -// called on any thread. -/// -/*--cef(source=library)--*/ -class CefResponse : public virtual CefBase { - public: - typedef std::multimap HeaderMap; - - /// - // Get the response status code. - /// - /*--cef()--*/ - virtual int GetStatus() =0; - /// - // Set the response status code. - /// - /*--cef()--*/ - virtual void SetStatus(int status) = 0; - - /// - // Get the response status text. - /// - /*--cef()--*/ - virtual CefString GetStatusText() =0; - /// - // Set the response status text. - /// - /*--cef()--*/ - virtual void SetStatusText(const CefString& statusText) = 0; - - /// - // Get the response mime type. - /// - /*--cef()--*/ - virtual CefString GetMimeType() = 0; - /// - // Set the response mime type. - /// - /*--cef()--*/ - virtual void SetMimeType(const CefString& mimeType) = 0; - - /// - // Get the value for the specified response header field. - /// - /*--cef()--*/ - virtual CefString GetHeader(const CefString& name) =0; - - /// - // Get all response header fields. - /// - /*--cef()--*/ - virtual void GetHeaderMap(HeaderMap& headerMap) =0; - /// - // Set all response header fields. - /// - /*--cef()--*/ - virtual void SetHeaderMap(const HeaderMap& headerMap) =0; -}; - -#endif // CEF_INCLUDE_CEF_RESPONSE_H_ diff --git a/cef1/include/cef_runnable.h b/cef1/include/cef_runnable.h deleted file mode 100644 index 826ddaa46..000000000 --- a/cef1/include/cef_runnable.h +++ /dev/null @@ -1,346 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. Portions Copyright (c) -// 2006-2011 Google 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: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// The contents of this file are a modified extract of base/task.h - -#ifndef CEF_INCLUDE_CEF_RUNNABLE_H_ -#define CEF_INCLUDE_CEF_RUNNABLE_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_task.h" -#ifdef BUILDING_CEF_SHARED -#include "base/tuple.h" -#else -#include "internal/cef_tuple.h" -#endif - -// CefRunnableMethodTraits ----------------------------------------------------- -// -// This traits-class is used by CefRunnableMethod to manage the lifetime of the -// callee object. By default, it is assumed that the callee supports AddRef -// and Release methods. A particular class can specialize this template to -// define other lifetime management. For example, if the callee is known to -// live longer than the CefRunnableMethod object, then a CefRunnableMethodTraits -// struct could be defined with empty RetainCallee and ReleaseCallee methods. -// -// The DISABLE_RUNNABLE_METHOD_REFCOUNT macro is provided as a convenient way -// for declaring a CefRunnableMethodTraits that disables refcounting. - -template -struct CefRunnableMethodTraits { - CefRunnableMethodTraits() { - } - - ~CefRunnableMethodTraits() { - } - - void RetainCallee(T* obj) { -#ifndef NDEBUG - // Catch NewCefRunnableMethod being called in an object's constructor. - // This isn't safe since the method can be invoked before the constructor - // completes, causing the object to be deleted. - obj->AddRef(); - obj->Release(); -#endif - obj->AddRef(); - } - - void ReleaseCallee(T* obj) { - obj->Release(); - } -}; - -// Convenience macro for declaring a CefRunnableMethodTraits that disables -// refcounting of a class. This is useful if you know that the callee -// will outlive the CefRunnableMethod object and thus do not need the ref -// counts. -// -// The invocation of DISABLE_RUNNABLE_METHOD_REFCOUNT should be done at the -// global namespace scope. Example: -// -// namespace foo { -// class Bar { -// ... -// }; -// } // namespace foo -// -// DISABLE_RUNNABLE_METHOD_REFCOUNT(foo::Bar); -// -// This is different from DISALLOW_COPY_AND_ASSIGN which is declared inside the -// class. -#define DISABLE_RUNNABLE_METHOD_REFCOUNT(TypeName) \ - template <> \ - struct CefRunnableMethodTraits { \ - void RetainCallee(TypeName* manager) {} \ - void ReleaseCallee(TypeName* manager) {} \ - } - -// CefRunnableMethod and CefRunnableFunction ---------------------------------- -// -// CefRunnable methods are a type of task that call a function on an object -// when they are run. We implement both an object and a set of -// NewCefRunnableMethod and NewCefRunnableFunction functions for convenience. -// These functions are overloaded and will infer the template types, -// simplifying calling code. -// -// The template definitions all use the following names: -// T - the class type of the object you're supplying -// this is not needed for the Static version of the call -// Method/Function - the signature of a pointer to the method or function you -// want to call -// Param - the parameter(s) to the method, possibly packed as a Tuple -// A - the first parameter (if any) to the method -// B - the second parameter (if any) to the method -// -// Put these all together and you get an object that can call a method whose -// signature is: -// R T::MyFunction([A[, B]]) -// -// Usage: -// CefPostTask(TID_UI, NewCefRunnableMethod(object, &Object::method[, a[, b]]) -// CefPostTask(TID_UI, NewCefRunnableFunction(&function[, a[, b]]) - -// CefRunnableMethod and NewCefRunnableMethod implementation ------------------ - -template -class CefRunnableMethod : public CefTask { - public: - CefRunnableMethod(T* obj, Method meth, const Params& params) - : obj_(obj), meth_(meth), params_(params) { - traits_.RetainCallee(obj_); - } - - ~CefRunnableMethod() { - T* obj = obj_; - obj_ = NULL; - if (obj) - traits_.ReleaseCallee(obj); - } - - virtual void Execute(CefThreadId threadId) { - if (obj_) - DispatchToMethod(obj_, meth_, params_); - } - - private: - T* obj_; - Method meth_; - Params params_; - CefRunnableMethodTraits traits_; - - IMPLEMENT_REFCOUNTING(CefRunnableMethod); -}; - -template -inline CefRefPtr NewCefRunnableMethod(T* object, Method method) { - return new CefRunnableMethod(object, method, MakeTuple()); -} - -template -inline CefRefPtr NewCefRunnableMethod(T* object, Method method, - const A& a) { - return new CefRunnableMethod >(object, - method, - MakeTuple(a)); -} - -template -inline CefRefPtr NewCefRunnableMethod(T* object, Method method, - const A& a, const B& b) { - return new CefRunnableMethod >(object, method, - MakeTuple(a, b)); -} - -template -inline CefRefPtr NewCefRunnableMethod(T* object, Method method, - const A& a, const B& b, - const C& c) { - return new CefRunnableMethod >(object, method, - MakeTuple(a, b, - c)); -} - -template -inline CefRefPtr NewCefRunnableMethod(T* object, Method method, - const A& a, const B& b, - const C& c, const D& d) { - return new CefRunnableMethod >(object, method, - MakeTuple(a, b, - c, - d)); -} - -template -inline CefRefPtr NewCefRunnableMethod(T* object, Method method, - const A& a, const B& b, - const C& c, const D& d, - const E& e) { - return new CefRunnableMethod >(object, - method, - MakeTuple(a, b, c, d, - e)); -} - -template -inline CefRefPtr NewCefRunnableMethod(T* object, Method method, - const A& a, const B& b, - const C& c, const D& d, - const E& e, const F& f) { - return new CefRunnableMethod >(object, - method, - MakeTuple(a, b, c, d, - e, f)); -} - -template -inline CefRefPtr NewCefRunnableMethod(T* object, Method method, - const A& a, const B& b, - const C& c, const D& d, - const E& e, const F& f, - const G& g) { - return new CefRunnableMethod >(object, - method, - MakeTuple(a, b, c, - d, e, f, - g)); -} - -// CefRunnableFunction and NewCefRunnableFunction implementation -------------- - -template -class CefRunnableFunction : public CefTask { - public: - CefRunnableFunction(Function function, const Params& params) - : function_(function), params_(params) { - } - - ~CefRunnableFunction() { - } - - virtual void Execute(CefThreadId threadId) { - if (function_) - DispatchToFunction(function_, params_); - } - - private: - Function function_; - Params params_; - - IMPLEMENT_REFCOUNTING(CefRunnableFunction); -}; - -template -inline CefRefPtr NewCefRunnableFunction(Function function) { - return new CefRunnableFunction(function, MakeTuple()); -} - -template -inline CefRefPtr NewCefRunnableFunction(Function function, - const A& a) { - return new CefRunnableFunction >(function, MakeTuple(a)); -} - -template -inline CefRefPtr NewCefRunnableFunction(Function function, - const A& a, const B& b) { - return new CefRunnableFunction >(function, - MakeTuple(a, b)); -} - -template -inline CefRefPtr NewCefRunnableFunction(Function function, - const A& a, const B& b, - const C& c) { - return new CefRunnableFunction >(function, - MakeTuple(a, b, - c)); -} - -template -inline CefRefPtr NewCefRunnableFunction(Function function, - const A& a, const B& b, - const C& c, const D& d) { - return new CefRunnableFunction >(function, - MakeTuple(a, b, - c, - d)); -} - -template -inline CefRefPtr NewCefRunnableFunction(Function function, - const A& a, const B& b, - const C& c, const D& d, - const E& e) { - return new CefRunnableFunction >(function, - MakeTuple(a, b, c, d, e)); -} - -template -inline CefRefPtr NewCefRunnableFunction(Function function, - const A& a, const B& b, - const C& c, const D& d, - const E& e, const F& f) { - return new CefRunnableFunction >(function, - MakeTuple(a, b, c, d, e, f)); -} - -template -inline CefRefPtr NewCefRunnableFunction(Function function, - const A& a, const B& b, - const C& c, const D& d, - const E& e, const F& f, - const G& g) { - return new CefRunnableFunction >( - function, MakeTuple(a, b, c, d, e, f, g)); -} - -template -inline CefRefPtr NewCefRunnableFunction(Function function, - const A& a, const B& b, - const C& c, const D& d, - const E& e, const F& f, - const G& g, const H& h) { - return new CefRunnableFunction >( - function, MakeTuple(a, b, c, d, e, f, g, h)); -} - -#endif // CEF_INCLUDE_CEF_RUNNABLE_H_ diff --git a/cef1/include/cef_scheme.h b/cef1/include/cef_scheme.h deleted file mode 100644 index 97786590b..000000000 --- a/cef1/include/cef_scheme.h +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_SCHEME_H_ -#define CEF_INCLUDE_CEF_SCHEME_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" -#include "include/cef_response.h" -#include "include/cef_request.h" - -class CefSchemeHandler; -class CefSchemeHandlerFactory; - -/// -// Register a scheme handler factory for the specified |scheme_name| and -// optional |domain_name|. An empty |domain_name| value for a standard scheme -// will cause the factory to match all domain names. The |domain_name| value -// will be ignored for non-standard schemes. If |scheme_name| is a built-in -// scheme and no handler is returned by |factory| then the built-in scheme -// handler factory will be called. If |scheme_name| is a custom scheme the -// CefRegisterCustomScheme() function should be called for that scheme. -// This function may be called multiple times to change or remove the factory -// that matches the specified |scheme_name| and optional |domain_name|. -// Returns false if an error occurs. This function may be called on any thread. -/// -/*--cef(optional_param=domain_name,optional_param=factory)--*/ -bool CefRegisterSchemeHandlerFactory(const CefString& scheme_name, - const CefString& domain_name, - CefRefPtr factory); - -/// -// Clear all registered scheme handler factories. Returns false on error. This -// function may be called on any thread. -/// -/*--cef()--*/ -bool CefClearSchemeHandlerFactories(); - - -/// -// Class that manages custom scheme registrations. -/// -/*--cef(source=library)--*/ -class CefSchemeRegistrar : public virtual CefBase { - public: - /// - // Register a custom scheme. This method should not be called for the built-in - // HTTP, HTTPS, FILE, FTP, ABOUT and DATA schemes. - // - // If |is_standard| is true the scheme will be treated as a standard scheme. - // Standard schemes are subject to URL canonicalization and parsing rules as - // defined in the Common Internet Scheme Syntax RFC 1738 Section 3.1 available - // at http://www.ietf.org/rfc/rfc1738.txt - // - // In particular, the syntax for standard scheme URLs must be of the form: - //
-  //  [scheme]://[username]:[password]@[host]:[port]/[url-path]
-  // 
- // Standard scheme URLs must have a host component that is a fully qualified - // domain name as defined in Section 3.5 of RFC 1034 [13] and Section 2.1 of - // RFC 1123. These URLs will be canonicalized to "scheme://host/path" in the - // simplest case and "scheme://username:password@host:port/path" in the most - // explicit case. For example, "scheme:host/path" and "scheme:///host/path" - // will both be canonicalized to "scheme://host/path". The origin of a - // standard scheme URL is the combination of scheme, host and port (i.e., - // "scheme://host:port" in the most explicit case). - // - // For non-standard scheme URLs only the "scheme:" component is parsed and - // canonicalized. The remainder of the URL will be passed to the handler - // as-is. For example, "scheme:///some%20text" will remain the same. - // Non-standard scheme URLs cannot be used as a target for form submission. - // - // If |is_local| is true the scheme will be treated as local (i.e., with the - // same security rules as those applied to "file" URLs). Normal pages cannot - // link to or access local URLs. Also, by default, local URLs can only perform - // XMLHttpRequest calls to the same URL (origin + path) that originated the - // request. To allow XMLHttpRequest calls from a local URL to other URLs with - // the same origin set the CefSettings.file_access_from_file_urls_allowed - // value to true. To allow XMLHttpRequest calls from a local URL to all - // origins set the CefSettings.universal_access_from_file_urls_allowed value - // to true. - // - // If |is_display_isolated| is true the scheme will be treated as display- - // isolated. This means that pages cannot display these URLs unless they are - // from the same scheme. For example, pages in another origin cannot create - // iframes or hyperlinks to URLs with this scheme. - // - // This function may be called on any thread. It should only be called once - // per unique |scheme_name| value. If |scheme_name| is already registered or - // if an error occurs this method will return false. - /// - /*--cef()--*/ - virtual bool AddCustomScheme(const CefString& scheme_name, - bool is_standard, - bool is_local, - bool is_display_isolated) =0; -}; - - -/// -// Class that creates CefSchemeHandler instances. The methods of this class will -// always be called on the IO thread. -/// -/*--cef(source=client)--*/ -class CefSchemeHandlerFactory : public virtual CefBase { - public: - /// - // Return a new scheme handler instance to handle the request. |browser| will - // be the browser window that initiated the request. If the request was - // initiated using the CefWebURLRequest API |browser| will be NULL. The - // |request| object passed to this method will not contain cookie data. - /// - /*--cef(optional_param=browser)--*/ - virtual CefRefPtr Create(CefRefPtr browser, - const CefString& scheme_name, - CefRefPtr request) =0; -}; - -/// -// Class used to facilitate asynchronous responses to custom scheme handler -// requests. The methods of this class may be called on any thread. -/// -/*--cef(source=library)--*/ -class CefSchemeHandlerCallback : public virtual CefBase { - public: - /// - // Notify that header information is now available for retrieval. - /// - /*--cef()--*/ - virtual void HeadersAvailable() =0; - - /// - // Notify that response data is now available for reading. - /// - /*--cef()--*/ - virtual void BytesAvailable() =0; - - /// - // Cancel processing of the request. - /// - /*--cef()--*/ - virtual void Cancel() =0; -}; - -/// -// Class used to implement a custom scheme handler interface. The methods of -// this class will always be called on the IO thread. -/// -/*--cef(source=client)--*/ -class CefSchemeHandler : public virtual CefBase { - public: - /// - // Begin processing the request. To handle the request return true and call - // HeadersAvailable() once the response header information is available - // (HeadersAvailable() can also be called from inside this method if header - // information is available immediately). To cancel the request return false. - /// - /*--cef()--*/ - virtual bool ProcessRequest(CefRefPtr request, - CefRefPtr callback) =0; - - /// - // Retrieve response header information. If the response length is not known - // set |response_length| to -1 and ReadResponse() will be called until it - // returns false. If the response length is known set |response_length| - // to a positive value and ReadResponse() will be called until it returns - // false or the specified number of bytes have been read. Use the |response| - // object to set the mime type, http status code and other optional header - // values. To redirect the request to a new URL set |redirectUrl| to the new - // URL. - /// - /*--cef()--*/ - virtual void GetResponseHeaders(CefRefPtr response, - int64& response_length, - CefString& redirectUrl) =0; - - /// - // Read response data. If data is available immediately copy up to - // |bytes_to_read| bytes into |data_out|, set |bytes_read| to the number of - // bytes copied, and return true. To read the data at a later time set - // |bytes_read| to 0, return true and call BytesAvailable() when the data is - // available. To indicate response completion return false. - /// - /*--cef()--*/ - virtual bool ReadResponse(void* data_out, - int bytes_to_read, - int& bytes_read, - CefRefPtr callback) =0; - - /// - // Request processing has been canceled. - /// - /*--cef()--*/ - virtual void Cancel() =0; -}; - -#endif // CEF_INCLUDE_CEF_SCHEME_H_ diff --git a/cef1/include/cef_stream.h b/cef1/include/cef_stream.h deleted file mode 100644 index 8daae1708..000000000 --- a/cef1/include/cef_stream.h +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_STREAM_H_ -#define CEF_INCLUDE_CEF_STREAM_H_ - -#include "include/cef_base.h" - -/// -// Interface the client can implement to provide a custom stream reader. The -// methods of this class may be called on any thread. -/// -/*--cef(source=client)--*/ -class CefReadHandler : public virtual CefBase { - public: - /// - // Read raw binary data. - /// - /*--cef()--*/ - virtual size_t Read(void* ptr, size_t size, size_t n) =0; - - /// - // Seek to the specified offset position. |whence| may be any one of - // SEEK_CUR, SEEK_END or SEEK_SET. Return zero on success and non-zero on - // failure. - /// - /*--cef()--*/ - virtual int Seek(int64 offset, int whence) =0; - - /// - // Return the current offset position. - /// - /*--cef()--*/ - virtual int64 Tell() =0; - - /// - // Return non-zero if at end of file. - /// - /*--cef()--*/ - virtual int Eof() =0; -}; - - -/// -// Class used to read data from a stream. The methods of this class may be -// called on any thread. -/// -/*--cef(source=library)--*/ -class CefStreamReader : public virtual CefBase { - public: - /// - // Create a new CefStreamReader object from a file. - /// - /*--cef()--*/ - static CefRefPtr CreateForFile(const CefString& fileName); - /// - // Create a new CefStreamReader object from data. - /// - /*--cef()--*/ - static CefRefPtr CreateForData(void* data, size_t size); - /// - // Create a new CefStreamReader object from a custom handler. - /// - /*--cef()--*/ - static CefRefPtr CreateForHandler( - CefRefPtr handler); - - /// - // Read raw binary data. - /// - /*--cef()--*/ - virtual size_t Read(void* ptr, size_t size, size_t n) =0; - - /// - // Seek to the specified offset position. |whence| may be any one of - // SEEK_CUR, SEEK_END or SEEK_SET. Returns zero on success and non-zero on - // failure. - /// - /*--cef()--*/ - virtual int Seek(int64 offset, int whence) =0; - - /// - // Return the current offset position. - /// - /*--cef()--*/ - virtual int64 Tell() =0; - - /// - // Return non-zero if at end of file. - /// - /*--cef()--*/ - virtual int Eof() =0; -}; - - -/// -// Interface the client can implement to provide a custom stream writer. The -// methods of this class may be called on any thread. -/// -/*--cef(source=client)--*/ -class CefWriteHandler : public virtual CefBase { - public: - /// - // Write raw binary data. - /// - /*--cef()--*/ - virtual size_t Write(const void* ptr, size_t size, size_t n) =0; - - /// - // Seek to the specified offset position. |whence| may be any one of - // SEEK_CUR, SEEK_END or SEEK_SET. Return zero on success and non-zero on - // failure. - /// - /*--cef()--*/ - virtual int Seek(int64 offset, int whence) =0; - - /// - // Return the current offset position. - /// - /*--cef()--*/ - virtual int64 Tell() =0; - - /// - // Flush the stream. - /// - /*--cef()--*/ - virtual int Flush() =0; -}; - - -/// -// Class used to write data to a stream. The methods of this class may be called -// on any thread. -/// -/*--cef(source=library)--*/ -class CefStreamWriter : public virtual CefBase { - public: - /// - // Create a new CefStreamWriter object for a file. - /// - /*--cef()--*/ - static CefRefPtr CreateForFile(const CefString& fileName); - /// - // Create a new CefStreamWriter object for a custom handler. - /// - /*--cef()--*/ - static CefRefPtr CreateForHandler( - CefRefPtr handler); - - /// - // Write raw binary data. - /// - /*--cef()--*/ - virtual size_t Write(const void* ptr, size_t size, size_t n) =0; - - /// - // Seek to the specified offset position. |whence| may be any one of - // SEEK_CUR, SEEK_END or SEEK_SET. Returns zero on success and non-zero on - // failure. - /// - /*--cef()--*/ - virtual int Seek(int64 offset, int whence) =0; - - /// - // Return the current offset position. - /// - /*--cef()--*/ - virtual int64 Tell() =0; - - /// - // Flush the stream. - /// - /*--cef()--*/ - virtual int Flush() =0; -}; - -#endif // CEF_INCLUDE_CEF_STREAM_H_ diff --git a/cef1/include/cef_task.h b/cef1/include/cef_task.h deleted file mode 100644 index 86550f6a0..000000000 --- a/cef1/include/cef_task.h +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_TASK_H_ -#define CEF_INCLUDE_CEF_TASK_H_ - -#include "include/cef_base.h" - -class CefTask; - -typedef cef_thread_id_t CefThreadId; - -/// -// CEF maintains multiple internal threads that are used for handling different -// types of tasks. The UI thread creates the browser window and is used for all -// interaction with the WebKit rendering engine and V8 JavaScript engine (The -// UI thread will be the same as the main application thread if CefInitialize() -// is called with a CefSettings.multi_threaded_message_loop value of false.) The -// IO thread is used for handling schema and network requests. The FILE thread -// is used for the application cache and other miscellaneous activities. This -// function will return true if called on the specified thread. -/// -/*--cef()--*/ -bool CefCurrentlyOn(CefThreadId threadId); - -/// -// Post a task for execution on the specified thread. This function may be -// called on any thread. -/// -/*--cef()--*/ -bool CefPostTask(CefThreadId threadId, CefRefPtr task); - -/// -// Post a task for delayed execution on the specified thread. This function may -// be called on any thread. -/// -/*--cef()--*/ -bool CefPostDelayedTask(CefThreadId threadId, CefRefPtr task, - int64 delay_ms); - - -/// -// Implement this interface for task execution. The methods of this class may -// be called on any thread. -/// -/*--cef(source=client)--*/ -class CefTask : public virtual CefBase { - public: - /// - // Method that will be executed. |threadId| is the thread executing the call. - /// - /*--cef()--*/ - virtual void Execute(CefThreadId threadId) =0; -}; - -#endif // CEF_INCLUDE_CEF_TASK_H_ diff --git a/cef1/include/cef_url.h b/cef1/include/cef_url.h deleted file mode 100644 index 6caa1e229..000000000 --- a/cef1/include/cef_url.h +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_URL_H_ -#define CEF_INCLUDE_CEF_URL_H_ -#pragma once - -#include "include/cef_base.h" - -/// -// Parse the specified |url| into its component parts. -// Returns false if the URL is empty or invalid. -/// -/*--cef()--*/ -bool CefParseURL(const CefString& url, - CefURLParts& parts); - -/// -// Creates a URL from the specified |parts|, which must contain a non-empty -// spec or a non-empty host and path (at a minimum), but not both. -// Returns false if |parts| isn't initialized as described. -/// -/*--cef()--*/ -bool CefCreateURL(const CefURLParts& parts, - CefString& url); - -#endif // CEF_INCLUDE_CEF_URL_H_ diff --git a/cef1/include/cef_v8.h b/cef1/include/cef_v8.h deleted file mode 100644 index 03a16b09f..000000000 --- a/cef1/include/cef_v8.h +++ /dev/null @@ -1,851 +0,0 @@ -// Copyright (c) 2012 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - - -#ifndef CEF_INCLUDE_CEF_V8_H_ -#define CEF_INCLUDE_CEF_V8_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include - -class CefV8Exception; -class CefV8Handler; -class CefV8StackFrame; -class CefV8Value; - - -/// -// Register a new V8 extension with the specified JavaScript extension code and -// handler. Functions implemented by the handler are prototyped using the -// keyword 'native'. The calling of a native function is restricted to the scope -// in which the prototype of the native function is defined. This function may -// be called on any thread. -// -// Example JavaScript extension code: -//
-//   // create the 'example' global object if it doesn't already exist.
-//   if (!example)
-//     example = {};
-//   // create the 'example.test' global object if it doesn't already exist.
-//   if (!example.test)
-//     example.test = {};
-//   (function() {
-//     // Define the function 'example.test.myfunction'.
-//     example.test.myfunction = function() {
-//       // Call CefV8Handler::Execute() with the function name 'MyFunction'
-//       // and no arguments.
-//       native function MyFunction();
-//       return MyFunction();
-//     };
-//     // Define the getter function for parameter 'example.test.myparam'.
-//     example.test.__defineGetter__('myparam', function() {
-//       // Call CefV8Handler::Execute() with the function name 'GetMyParam'
-//       // and no arguments.
-//       native function GetMyParam();
-//       return GetMyParam();
-//     });
-//     // Define the setter function for parameter 'example.test.myparam'.
-//     example.test.__defineSetter__('myparam', function(b) {
-//       // Call CefV8Handler::Execute() with the function name 'SetMyParam'
-//       // and a single argument.
-//       native function SetMyParam();
-//       if(b) SetMyParam(b);
-//     });
-//
-//     // Extension definitions can also contain normal JavaScript variables
-//     // and functions.
-//     var myint = 0;
-//     example.test.increment = function() {
-//       myint += 1;
-//       return myint;
-//     };
-//   })();
-// 
-// Example usage in the page: -//
-//   // Call the function.
-//   example.test.myfunction();
-//   // Set the parameter.
-//   example.test.myparam = value;
-//   // Get the parameter.
-//   value = example.test.myparam;
-//   // Call another function.
-//   example.test.increment();
-// 
-/// -/*--cef(optional_param=handler)--*/ -bool CefRegisterExtension(const CefString& extension_name, - const CefString& javascript_code, - CefRefPtr handler); - - -/// -// Class that encapsulates a V8 context handle. The methods of this class may -// only be called on the UI thread. -/// -/*--cef(source=library)--*/ -class CefV8Context : public virtual CefBase { - public: - /// - // Returns the current (top) context object in the V8 context stack. - /// - /*--cef()--*/ - static CefRefPtr GetCurrentContext(); - - /// - // Returns the entered (bottom) context object in the V8 context stack. - /// - /*--cef()--*/ - static CefRefPtr GetEnteredContext(); - - /// - // Returns true if V8 is currently inside a context. - /// - /*--cef()--*/ - static bool InContext(); - - /// - // Returns true if this object is valid. Do not call any other methods if this - // method returns false. - /// - /*--cef()--*/ - virtual bool IsValid() =0; - - /// - // Returns the browser for this context. - /// - /*--cef()--*/ - virtual CefRefPtr GetBrowser() =0; - - /// - // Returns the frame for this context. - /// - /*--cef()--*/ - virtual CefRefPtr GetFrame() =0; - - /// - // Returns the global object for this context. The context must be entered - // before calling this method. - /// - /*--cef()--*/ - virtual CefRefPtr GetGlobal() =0; - - /// - // Enter this context. A context must be explicitly entered before creating a - // V8 Object, Array, Function or Date asynchronously. Exit() must be called - // the same number of times as Enter() before releasing this context. V8 - // objects belong to the context in which they are created. Returns true if - // the scope was entered successfully. - /// - /*--cef()--*/ - virtual bool Enter() =0; - - /// - // Exit this context. Call this method only after calling Enter(). Returns - // true if the scope was exited successfully. - /// - /*--cef()--*/ - virtual bool Exit() =0; - - /// - // Returns true if this object is pointing to the same handle as |that| - // object. - /// - /*--cef()--*/ - virtual bool IsSame(CefRefPtr that) =0; - - /// - // Evaluates the specified JavaScript code using this context's global object. - // On success |retval| will be set to the return value, if any, and the - // function will return true. On failure |exception| will be set to the - // exception, if any, and the function will return false. - /// - /*--cef()--*/ - virtual bool Eval(const CefString& code, - CefRefPtr& retval, - CefRefPtr& exception) =0; -}; - - -typedef std::vector > CefV8ValueList; - -/// -// Interface that should be implemented to handle V8 function calls. The methods -// of this class will always be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefV8Handler : public virtual CefBase { - public: - /// - // Handle execution of the function identified by |name|. |object| is the - // receiver ('this' object) of the function. |arguments| is the list of - // arguments passed to the function. If execution succeeds set |retval| to the - // function return value. If execution fails set |exception| to the exception - // that will be thrown. Return true if execution was handled. - /// - /*--cef()--*/ - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) =0; -}; - -/// -// Interface that should be implemented to handle V8 accessor calls. Accessor -// identifiers are registered by calling CefV8Value::SetValue(). The methods -// of this class will always be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefV8Accessor : public virtual CefBase { - public: - /// - // Handle retrieval the accessor value identified by |name|. |object| is the - // receiver ('this' object) of the accessor. If retrieval succeeds set - // |retval| to the return value. If retrieval fails set |exception| to the - // exception that will be thrown. Return true if accessor retrieval was - // handled. - /// - /*--cef()--*/ - virtual bool Get(const CefString& name, - const CefRefPtr object, - CefRefPtr& retval, - CefString& exception) =0; - - /// - // Handle assignment of the accessor value identified by |name|. |object| is - // the receiver ('this' object) of the accessor. |value| is the new value - // being assigned to the accessor. If assignment fails set |exception| to the - // exception that will be thrown. Return true if accessor assignment was - // handled. - /// - /*--cef()--*/ - virtual bool Set(const CefString& name, - const CefRefPtr object, - const CefRefPtr value, - CefString& exception) =0; -}; - -/// -// Class representing a V8 exception. -/// -/*--cef(source=library)--*/ -class CefV8Exception : public virtual CefBase { - public: - /// - // Returns the exception message. - /// - /*--cef()--*/ - virtual CefString GetMessage() =0; - - /// - // Returns the line of source code that the exception occurred within. - /// - /*--cef()--*/ - virtual CefString GetSourceLine() =0; - - /// - // Returns the resource name for the script from where the function causing - // the error originates. - /// - /*--cef()--*/ - virtual CefString GetScriptResourceName() =0; - - /// - // Returns the 1-based number of the line where the error occurred or 0 if the - // line number is unknown. - /// - /*--cef()--*/ - virtual int GetLineNumber() =0; - - /// - // Returns the index within the script of the first character where the error - // occurred. - /// - /*--cef()--*/ - virtual int GetStartPosition() =0; - - /// - // Returns the index within the script of the last character where the error - // occurred. - /// - /*--cef()--*/ - virtual int GetEndPosition() =0; - - /// - // Returns the index within the line of the first character where the error - // occurred. - /// - /*--cef()--*/ - virtual int GetStartColumn() =0; - - /// - // Returns the index within the line of the last character where the error - // occurred. - /// - /*--cef()--*/ - virtual int GetEndColumn() =0; -}; - -/// -// Class representing a V8 value. The methods of this class may only be called -// on the UI thread. -/// -/*--cef(source=library)--*/ -class CefV8Value : public virtual CefBase { - public: - typedef cef_v8_accesscontrol_t AccessControl; - typedef cef_v8_propertyattribute_t PropertyAttribute; - - /// - // Create a new CefV8Value object of type undefined. - /// - /*--cef()--*/ - static CefRefPtr CreateUndefined(); - - /// - // Create a new CefV8Value object of type null. - /// - /*--cef()--*/ - static CefRefPtr CreateNull(); - - /// - // Create a new CefV8Value object of type bool. - /// - /*--cef()--*/ - static CefRefPtr CreateBool(bool value); - - /// - // Create a new CefV8Value object of type int. - /// - /*--cef()--*/ - static CefRefPtr CreateInt(int32 value); - - /// - // Create a new CefV8Value object of type unsigned int. - /// - /*--cef()--*/ - static CefRefPtr CreateUInt(uint32 value); - - /// - // Create a new CefV8Value object of type double. - /// - /*--cef()--*/ - static CefRefPtr CreateDouble(double value); - - /// - // Create a new CefV8Value object of type Date. This method should only be - // called from within the scope of a CefV8ContextHandler, CefV8Handler or - // CefV8Accessor callback, or in combination with calling Enter() and Exit() - // on a stored CefV8Context reference. - /// - /*--cef()--*/ - static CefRefPtr CreateDate(const CefTime& date); - - /// - // Create a new CefV8Value object of type string. - /// - /*--cef(optional_param=value)--*/ - static CefRefPtr CreateString(const CefString& value); - - /// - // Create a new CefV8Value object of type object with optional accessor. This - // method should only be called from within the scope of a - // CefV8ContextHandler, CefV8Handler or CefV8Accessor callback, or in - // combination with calling Enter() and Exit() on a stored CefV8Context - // reference. - /// - /*--cef(optional_param=accessor)--*/ - static CefRefPtr CreateObject(CefRefPtr accessor); - - /// - // Create a new CefV8Value object of type array with the specified |length|. - // If |length| is negative the returned array will have length 0. This method - // should only be called from within the scope of a CefV8ContextHandler, - // CefV8Handler or CefV8Accessor callback, or in combination with calling - // Enter() and Exit() on a stored CefV8Context reference. - /// - /*--cef()--*/ - static CefRefPtr CreateArray(int length); - - /// - // Create a new CefV8Value object of type function. This method should only be - // called from within the scope of a CefV8ContextHandler, CefV8Handler or - // CefV8Accessor callback, or in combination with calling Enter() and Exit() - // on a stored CefV8Context reference. - /// - /*--cef()--*/ - static CefRefPtr CreateFunction(const CefString& name, - CefRefPtr handler); - - /// - // Returns true if this object is valid. Do not call any other methods if this - // method returns false. - /// - /*--cef()--*/ - virtual bool IsValid() =0; - - /// - // True if the value type is undefined. - /// - /*--cef()--*/ - virtual bool IsUndefined() =0; - - /// - // True if the value type is null. - /// - /*--cef()--*/ - virtual bool IsNull() =0; - - /// - // True if the value type is bool. - /// - /*--cef()--*/ - virtual bool IsBool() =0; - - /// - // True if the value type is int. - /// - /*--cef()--*/ - virtual bool IsInt() =0; - - /// - // True if the value type is unsigned int. - /// - /*--cef()--*/ - virtual bool IsUInt() =0; - - /// - // True if the value type is double. - /// - /*--cef()--*/ - virtual bool IsDouble() =0; - - /// - // True if the value type is Date. - /// - /*--cef()--*/ - virtual bool IsDate() =0; - - /// - // True if the value type is string. - /// - /*--cef()--*/ - virtual bool IsString() =0; - - /// - // True if the value type is object. - /// - /*--cef()--*/ - virtual bool IsObject() =0; - - /// - // True if the value type is array. - /// - /*--cef()--*/ - virtual bool IsArray() =0; - - /// - // True if the value type is function. - /// - /*--cef()--*/ - virtual bool IsFunction() =0; - - /// - // Returns true if this object is pointing to the same handle as |that| - // object. - /// - /*--cef()--*/ - virtual bool IsSame(CefRefPtr that) =0; - - /// - // Return a bool value. The underlying data will be converted to if - // necessary. - /// - /*--cef()--*/ - virtual bool GetBoolValue() =0; - - /// - // Return an int value. The underlying data will be converted to if - // necessary. - /// - /*--cef()--*/ - virtual int32 GetIntValue() =0; - - /// - // Return an unisgned int value. The underlying data will be converted to if - // necessary. - /// - /*--cef()--*/ - virtual uint32 GetUIntValue() =0; - - /// - // Return a double value. The underlying data will be converted to if - // necessary. - /// - /*--cef()--*/ - virtual double GetDoubleValue() =0; - - /// - // Return a Date value. The underlying data will be converted to if - // necessary. - /// - /*--cef()--*/ - virtual CefTime GetDateValue() =0; - - /// - // Return a string value. The underlying data will be converted to if - // necessary. - /// - /*--cef()--*/ - virtual CefString GetStringValue() =0; - - - // OBJECT METHODS - These methods are only available on objects. Arrays and - // functions are also objects. String- and integer-based keys can be used - // interchangably with the framework converting between them as necessary. - - /// - // Returns true if this is a user created object. - /// - /*--cef()--*/ - virtual bool IsUserCreated() =0; - - /// - // Returns true if the last method call resulted in an exception. This - // attribute exists only in the scope of the current CEF value object. - /// - /*--cef()--*/ - virtual bool HasException() =0; - - /// - // Returns the exception resulting from the last method call. This attribute - // exists only in the scope of the current CEF value object. - /// - /*--cef()--*/ - virtual CefRefPtr GetException() =0; - - /// - // Clears the last exception and returns true on success. - /// - /*--cef()--*/ - virtual bool ClearException() =0; - - /// - // Returns true if this object will re-throw future exceptions. This attribute - // exists only in the scope of the current CEF value object. - /// - /*--cef()--*/ - virtual bool WillRethrowExceptions() =0; - - /// - // Set whether this object will re-throw future exceptions. By default - // exceptions are not re-thrown. If a exception is re-thrown the current - // context should not be accessed again until after the exception has been - // caught and not re-thrown. Returns true on success. This attribute exists - // only in the scope of the current CEF value object. - /// - /*--cef()--*/ - virtual bool SetRethrowExceptions(bool rethrow) =0; - - /// - // Returns true if the object has a value with the specified identifier. - /// - /*--cef(capi_name=has_value_bykey,optional_param=key)--*/ - virtual bool HasValue(const CefString& key) =0; - - /// - // Returns true if the object has a value with the specified identifier. - /// - /*--cef(capi_name=has_value_byindex,index_param=index)--*/ - virtual bool HasValue(int index) =0; - - /// - // Deletes the value with the specified identifier and returns true on - // success. Returns false if this method is called incorrectly or an exception - // is thrown. For read-only and don't-delete values this method will return - // true even though deletion failed. - /// - /*--cef(capi_name=delete_value_bykey,optional_param=key)--*/ - virtual bool DeleteValue(const CefString& key) =0; - - /// - // Deletes the value with the specified identifier and returns true on - // success. Returns false if this method is called incorrectly, deletion fails - // or an exception is thrown. For read-only and don't-delete values this - // method will return true even though deletion failed. - /// - /*--cef(capi_name=delete_value_byindex,index_param=index)--*/ - virtual bool DeleteValue(int index) =0; - - /// - // Returns the value with the specified identifier on success. Returns NULL - // if this method is called incorrectly or an exception is thrown. - /// - /*--cef(capi_name=get_value_bykey,optional_param=key)--*/ - virtual CefRefPtr GetValue(const CefString& key) =0; - - /// - // Returns the value with the specified identifier on success. Returns NULL - // if this method is called incorrectly or an exception is thrown. - /// - /*--cef(capi_name=get_value_byindex,index_param=index)--*/ - virtual CefRefPtr GetValue(int index) =0; - - /// - // Associates a value with the specified identifier and returns true on - // success. Returns false if this method is called incorrectly or an exception - // is thrown. For read-only values this method will return true even though - // assignment failed. - /// - /*--cef(capi_name=set_value_bykey,optional_param=key)--*/ - virtual bool SetValue(const CefString& key, CefRefPtr value, - PropertyAttribute attribute) =0; - - /// - // Associates a value with the specified identifier and returns true on - // success. Returns false if this method is called incorrectly or an exception - // is thrown. For read-only values this method will return true even though - // assignment failed. - /// - /*--cef(capi_name=set_value_byindex,index_param=index)--*/ - virtual bool SetValue(int index, CefRefPtr value) =0; - - /// - // Registers an identifier and returns true on success. Access to the - // identifier will be forwarded to the CefV8Accessor instance passed to - // CefV8Value::CreateObject(). Returns false if this method is called - // incorrectly or an exception is thrown. For read-only values this method - // will return true even though assignment failed. - /// - /*--cef(capi_name=set_value_byaccessor,optional_param=key)--*/ - virtual bool SetValue(const CefString& key, AccessControl settings, - PropertyAttribute attribute) =0; - - /// - // Read the keys for the object's values into the specified vector. Integer- - // based keys will also be returned as strings. - /// - /*--cef()--*/ - virtual bool GetKeys(std::vector& keys) =0; - - /// - // Sets the user data for this object and returns true on success. Returns - // false if this method is called incorrectly. This method can only be called - // on user created objects. - /// - /*--cef(optional_param=user_data)--*/ - virtual bool SetUserData(CefRefPtr user_data) =0; - - /// - // Returns the user data, if any, assigned to this object. - /// - /*--cef()--*/ - virtual CefRefPtr GetUserData() =0; - - /// - // Returns the amount of externally allocated memory registered for the - // object. - /// - /*--cef()--*/ - virtual int GetExternallyAllocatedMemory() =0; - - /// - // Adjusts the amount of registered external memory for the object. Used to - // give V8 an indication of the amount of externally allocated memory that is - // kept alive by JavaScript objects. V8 uses this information to decide when - // to perform global garbage collection. Each CefV8Value tracks the amount of - // external memory associated with it and automatically decreases the global - // total by the appropriate amount on its destruction. |change_in_bytes| - // specifies the number of bytes to adjust by. This method returns the number - // of bytes associated with the object after the adjustment. This method can - // only be called on user created objects. - /// - /*--cef()--*/ - virtual int AdjustExternallyAllocatedMemory(int change_in_bytes) =0; - - - // ARRAY METHODS - These methods are only available on arrays. - - /// - // Returns the number of elements in the array. - /// - /*--cef()--*/ - virtual int GetArrayLength() =0; - - - // FUNCTION METHODS - These methods are only available on functions. - - /// - // Returns the function name. - /// - /*--cef()--*/ - virtual CefString GetFunctionName() =0; - - /// - // Returns the function handler or NULL if not a CEF-created function. - /// - /*--cef()--*/ - virtual CefRefPtr GetFunctionHandler() =0; - - /// - // Execute the function using the current V8 context. This method should only - // be called from within the scope of a CefV8Handler or CefV8Accessor - // callback, or in combination with calling Enter() and Exit() on a stored - // CefV8Context reference. |object| is the receiver ('this' object) of the - // function. If |object| is empty the current context's global object will be - // used. |arguments| is the list of arguments that will be passed to the - // function. Returns the function return value on success. Returns NULL if - // this method is called incorrectly or an exception is thrown. - /// - /*--cef(optional_param=object)--*/ - virtual CefRefPtr ExecuteFunction( - CefRefPtr object, - const CefV8ValueList& arguments) =0; - - /// - // Execute the function using the specified V8 context. |object| is the - // receiver ('this' object) of the function. If |object| is empty the - // specified context's global object will be used. |arguments| is the list of - // arguments that will be passed to the function. Returns the function return - // value on success. Returns NULL if this method is called incorrectly or an - // exception is thrown. - /// - /*--cef(optional_param=object)--*/ - virtual CefRefPtr ExecuteFunctionWithContext( - CefRefPtr context, - CefRefPtr object, - const CefV8ValueList& arguments) =0; -}; - -/// -// Class representing a V8 stack trace. The methods of this class may only be -// called on the UI thread. -/// -/*--cef(source=library)--*/ -class CefV8StackTrace : public virtual CefBase { - public: - /// - // Returns the stack trace for the currently active context. |frame_limit| is - // the maximum number of frames that will be captured. - /// - /*--cef()--*/ - static CefRefPtr GetCurrent(int frame_limit); - - /// - // Returns true if this object is valid. Do not call any other methods if this - // method returns false. - /// - /*--cef()--*/ - virtual bool IsValid() =0; - - /// - // Returns the number of stack frames. - /// - /*--cef()--*/ - virtual int GetFrameCount() =0; - - /// - // Returns the stack frame at the specified 0-based index. - /// - /*--cef()--*/ - virtual CefRefPtr GetFrame(int index) =0; -}; - -/// -// Class representing a V8 stack frame. The methods of this class may only be -// called on the UI thread. -/// -/*--cef(source=library)--*/ -class CefV8StackFrame : public virtual CefBase { - public: - /// - // Returns true if this object is valid. Do not call any other methods if this - // method returns false. - /// - /*--cef()--*/ - virtual bool IsValid() =0; - - /// - // Returns the name of the resource script that contains the function. - /// - /*--cef()--*/ - virtual CefString GetScriptName() =0; - - /// - // Returns the name of the resource script that contains the function or the - // sourceURL value if the script name is undefined and its source ends with - // a "//@ sourceURL=..." string. - /// - /*--cef()--*/ - virtual CefString GetScriptNameOrSourceURL() =0; - - /// - // Returns the name of the function. - /// - /*--cef()--*/ - virtual CefString GetFunctionName() =0; - - /// - // Returns the 1-based line number for the function call or 0 if unknown. - /// - /*--cef()--*/ - virtual int GetLineNumber() =0; - - /// - // Returns the 1-based column offset on the line for the function call or 0 if - // unknown. - /// - /*--cef()--*/ - virtual int GetColumn() =0; - - /// - // Returns true if the function was compiled using eval(). - /// - /*--cef()--*/ - virtual bool IsEval() =0; - - /// - // Returns true if the function was called as a constructor via "new". - /// - /*--cef()--*/ - virtual bool IsConstructor() =0; -}; - -#endif // CEF_INCLUDE_CEF_V8_H_ diff --git a/cef1/include/cef_v8context_handler.h b/cef1/include/cef_v8context_handler.h deleted file mode 100644 index 0483f3f3e..000000000 --- a/cef1/include/cef_v8context_handler.h +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_V8CONTEXT_HANDLER_H_ -#define CEF_INCLUDE_CEF_V8CONTEXT_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "include/cef_v8.h" - -/// -// Implement this interface to handle V8 context events. The methods of this -// class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefV8ContextHandler : public virtual CefBase { - public: - /// - // Called immediately after the V8 context for a frame has been created. To - // retrieve the JavaScript 'window' object use the CefV8Context::GetGlobal() - // method. - /// - /*--cef()--*/ - virtual void OnContextCreated(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr context) {} - - /// - // Called immediately before the V8 context for a frame is released. No - // references to the context should be kept after this method is called. - /// - /*--cef()--*/ - virtual void OnContextReleased(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr context) {} - - /// - // Called for global uncaught exceptions. Execution of this callback is - // disabled by default. To enable set - // CefSettings.uncaught_exception_stack_size > 0. - /// - /*--cef()--*/ - virtual void OnUncaughtException(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr context, - CefRefPtr exception, - CefRefPtr stackTrace) {} -}; - -#endif // CEF_INCLUDE_CEF_V8CONTEXT_HANDLER_H_ diff --git a/cef1/include/cef_web_plugin.h b/cef1/include/cef_web_plugin.h deleted file mode 100644 index e00b2349b..000000000 --- a/cef1/include/cef_web_plugin.h +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2012 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_WEB_PLUGIN_H_ -#define CEF_INCLUDE_CEF_WEB_PLUGIN_H_ - -#include "include/cef_base.h" - -class CefWebPluginInfo; - -/// -// Returns the number of installed web plugins. This method must be called on -// the UI thread. -/// -/*--cef()--*/ -size_t CefGetWebPluginCount(); - -/// -// Returns information for web plugin at the specified zero-based index. This -// method must be called on the UI thread. -/// -/*--cef()--*/ -CefRefPtr CefGetWebPluginInfo(int index); - -/// -// Returns information for web plugin with the specified name. This method must -// be called on the UI thread. -/// -/*--cef(capi_name=cef_get_web_plugin_info_byname)--*/ -CefRefPtr CefGetWebPluginInfo(const CefString& name); - - -/// -// Information about a specific web plugin. -/// -/*--cef(source=library)--*/ -class CefWebPluginInfo : public virtual CefBase { - public: - /// - // Returns the plugin name (i.e. Flash). - /// - /*--cef()--*/ - virtual CefString GetName() =0; - - /// - // Returns the plugin file path (DLL/bundle/library). - /// - /*--cef()--*/ - virtual CefString GetPath() =0; - - /// - // Returns the version of the plugin (may be OS-specific). - /// - /*--cef()--*/ - virtual CefString GetVersion() =0; - - /// - // Returns a description of the plugin from the version information. - /// - /*--cef()--*/ - virtual CefString GetDescription() =0; -}; - -#endif // CEF_INCLUDE_CEF_WEB_PLUGIN_H_ diff --git a/cef1/include/cef_web_urlrequest.h b/cef1/include/cef_web_urlrequest.h deleted file mode 100644 index c5f471f9a..000000000 --- a/cef1/include/cef_web_urlrequest.h +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_WEB_URLREQUEST_H_ -#define CEF_INCLUDE_CEF_WEB_URLREQUEST_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_request.h" -#include "include/cef_response.h" - -class CefWebURLRequestClient; - -/// -// Class used to make a Web URL request. Web URL requests are not associated -// with a browser instance so no CefClient callbacks will be executed. The -// methods of this class may be called on any thread. -/// -/*--cef(source=library)--*/ -class CefWebURLRequest : public virtual CefBase { - public: - typedef cef_weburlrequest_state_t RequestState; - - /// - // Create a new CefWebUrlRequest object. - /// - /*--cef()--*/ - static CefRefPtr CreateWebURLRequest( - CefRefPtr request, - CefRefPtr client); - - /// - // Cancels the request. - /// - /*--cef()--*/ - virtual void Cancel() =0; - - /// - // Returns the current ready state of the request. - /// - /*--cef(default_retval=WUR_STATE_UNSENT)--*/ - virtual RequestState GetState() =0; -}; - -/// -// Interface that should be implemented by the CefWebURLRequest client. The -// methods of this class will always be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefWebURLRequestClient : public virtual CefBase { - public: - typedef cef_weburlrequest_state_t RequestState; - typedef cef_handler_errorcode_t ErrorCode; - - /// - // Notifies the client that the request state has changed. State change - // notifications will always be sent before the below notification methods - // are called. - /// - /*--cef()--*/ - virtual void OnStateChange(CefRefPtr requester, - RequestState state) =0; - - /// - // Notifies the client that the request has been redirected and provides a - // chance to change the request parameters. - /// - /*--cef()--*/ - virtual void OnRedirect(CefRefPtr requester, - CefRefPtr request, - CefRefPtr response) =0; - - /// - // Notifies the client of the response data. - /// - /*--cef()--*/ - virtual void OnHeadersReceived(CefRefPtr requester, - CefRefPtr response) =0; - - /// - // Notifies the client of the upload progress. - /// - /*--cef()--*/ - virtual void OnProgress(CefRefPtr requester, - uint64 bytesSent, uint64 totalBytesToBeSent) =0; - - /// - // Notifies the client that content has been received. - /// - /*--cef()--*/ - virtual void OnData(CefRefPtr requester, - const void* data, int dataLength) =0; - - /// - // Notifies the client that the request ended with an error. - /// - /*--cef()--*/ - virtual void OnError(CefRefPtr requester, - ErrorCode errorCode) =0; -}; - -#endif // CEF_INCLUDE_CEF_WEB_URLREQUEST_H_ diff --git a/cef1/include/cef_xml_reader.h b/cef1/include/cef_xml_reader.h deleted file mode 100644 index e457e0d8d..000000000 --- a/cef1/include/cef_xml_reader.h +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_XML_READER_H_ -#define CEF_INCLUDE_CEF_XML_READER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_stream.h" - -/// -// Class that supports the reading of XML data via the libxml streaming API. -// The methods of this class should only be called on the thread that creates -// the object. -/// -/*--cef(source=library)--*/ -class CefXmlReader : public virtual CefBase { - public: - typedef cef_xml_encoding_type_t EncodingType; - typedef cef_xml_node_type_t NodeType; - - /// - // Create a new CefXmlReader object. The returned object's methods can only - // be called from the thread that created the object. - /// - /*--cef()--*/ - static CefRefPtr Create(CefRefPtr stream, - EncodingType encodingType, - const CefString& URI); - - /// - // Moves the cursor to the next node in the document. This method must be - // called at least once to set the current cursor position. Returns true if - // the cursor position was set successfully. - /// - /*--cef()--*/ - virtual bool MoveToNextNode() =0; - - /// - // Close the document. This should be called directly to ensure that cleanup - // occurs on the correct thread. - /// - /*--cef()--*/ - virtual bool Close() =0; - - /// - // Returns true if an error has been reported by the XML parser. - /// - /*--cef()--*/ - virtual bool HasError() =0; - - /// - // Returns the error string. - /// - /*--cef()--*/ - virtual CefString GetError() =0; - - - // The below methods retrieve data for the node at the current cursor - // position. - - /// - // Returns the node type. - /// - /*--cef(default_retval=XML_NODE_UNSUPPORTED)--*/ - virtual NodeType GetType() =0; - - /// - // Returns the node depth. Depth starts at 0 for the root node. - /// - /*--cef()--*/ - virtual int GetDepth() =0; - - /// - // Returns the local name. See - // http://www.w3.org/TR/REC-xml-names/#NT-LocalPart for additional details. - /// - /*--cef()--*/ - virtual CefString GetLocalName() =0; - - /// - // Returns the namespace prefix. See http://www.w3.org/TR/REC-xml-names/ for - // additional details. - /// - /*--cef()--*/ - virtual CefString GetPrefix() =0; - - /// - // Returns the qualified name, equal to (Prefix:)LocalName. See - // http://www.w3.org/TR/REC-xml-names/#ns-qualnames for additional details. - /// - /*--cef()--*/ - virtual CefString GetQualifiedName() =0; - - /// - // Returns the URI defining the namespace associated with the node. See - // http://www.w3.org/TR/REC-xml-names/ for additional details. - /// - /*--cef()--*/ - virtual CefString GetNamespaceURI() =0; - - /// - // Returns the base URI of the node. See http://www.w3.org/TR/xmlbase/ for - // additional details. - /// - /*--cef()--*/ - virtual CefString GetBaseURI() =0; - - /// - // Returns the xml:lang scope within which the node resides. See - // http://www.w3.org/TR/REC-xml/#sec-lang-tag for additional details. - /// - /*--cef()--*/ - virtual CefString GetXmlLang() =0; - - /// - // Returns true if the node represents an empty element. is considered - // empty but is not. - /// - /*--cef()--*/ - virtual bool IsEmptyElement() =0; - - /// - // Returns true if the node has a text value. - /// - /*--cef()--*/ - virtual bool HasValue() =0; - - /// - // Returns the text value. - /// - /*--cef()--*/ - virtual CefString GetValue() =0; - - /// - // Returns true if the node has attributes. - /// - /*--cef()--*/ - virtual bool HasAttributes() =0; - - /// - // Returns the number of attributes. - /// - /*--cef()--*/ - virtual size_t GetAttributeCount() =0; - - /// - // Returns the value of the attribute at the specified 0-based index. - /// - /*--cef(capi_name=get_attribute_byindex,index_param=index)--*/ - virtual CefString GetAttribute(int index) =0; - - /// - // Returns the value of the attribute with the specified qualified name. - /// - /*--cef(capi_name=get_attribute_byqname)--*/ - virtual CefString GetAttribute(const CefString& qualifiedName) =0; - - /// - // Returns the value of the attribute with the specified local name and - // namespace URI. - /// - /*--cef(capi_name=get_attribute_bylname)--*/ - virtual CefString GetAttribute(const CefString& localName, - const CefString& namespaceURI) =0; - - /// - // Returns an XML representation of the current node's children. - /// - /*--cef()--*/ - virtual CefString GetInnerXml() =0; - - /// - // Returns an XML representation of the current node including its children. - /// - /*--cef()--*/ - virtual CefString GetOuterXml() =0; - - /// - // Returns the line number for the current node. - /// - /*--cef()--*/ - virtual int GetLineNumber() =0; - - - // Attribute nodes are not traversed by default. The below methods can be - // used to move the cursor to an attribute node. MoveToCarryingElement() can - // be called afterwards to return the cursor to the carrying element. The - // depth of an attribute node will be 1 + the depth of the carrying element. - - /// - // Moves the cursor to the attribute at the specified 0-based index. Returns - // true if the cursor position was set successfully. - /// - /*--cef(capi_name=move_to_attribute_byindex,index_param=index)--*/ - virtual bool MoveToAttribute(int index) =0; - - /// - // Moves the cursor to the attribute with the specified qualified name. - // Returns true if the cursor position was set successfully. - /// - /*--cef(capi_name=move_to_attribute_byqname)--*/ - virtual bool MoveToAttribute(const CefString& qualifiedName) =0; - - /// - // Moves the cursor to the attribute with the specified local name and - // namespace URI. Returns true if the cursor position was set successfully. - /// - /*--cef(capi_name=move_to_attribute_bylname)--*/ - virtual bool MoveToAttribute(const CefString& localName, - const CefString& namespaceURI) =0; - - /// - // Moves the cursor to the first attribute in the current element. Returns - // true if the cursor position was set successfully. - /// - /*--cef()--*/ - virtual bool MoveToFirstAttribute() =0; - - /// - // Moves the cursor to the next attribute in the current element. Returns - // true if the cursor position was set successfully. - /// - /*--cef()--*/ - virtual bool MoveToNextAttribute() =0; - - /// - // Moves the cursor back to the carrying element. Returns true if the cursor - // position was set successfully. - /// - /*--cef()--*/ - virtual bool MoveToCarryingElement() =0; -}; - -#endif // CEF_INCLUDE_CEF_XML_READER_H_ diff --git a/cef1/include/cef_zip_reader.h b/cef1/include/cef_zip_reader.h deleted file mode 100644 index 9498f06ed..000000000 --- a/cef1/include/cef_zip_reader.h +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_ZIP_READER_H_ -#define CEF_INCLUDE_CEF_ZIP_READER_H_ - -#include "include/cef_base.h" -#include "include/cef_stream.h" - -/// -// Class that supports the reading of zip archives via the zlib unzip API. -// The methods of this class should only be called on the thread that creates -// the object. -/// -/*--cef(source=library)--*/ -class CefZipReader : public virtual CefBase { - public: - /// - // Create a new CefZipReader object. The returned object's methods can only - // be called from the thread that created the object. - /// - /*--cef()--*/ - static CefRefPtr Create(CefRefPtr stream); - - /// - // Moves the cursor to the first file in the archive. Returns true if the - // cursor position was set successfully. - /// - /*--cef()--*/ - virtual bool MoveToFirstFile() =0; - - /// - // Moves the cursor to the next file in the archive. Returns true if the - // cursor position was set successfully. - /// - /*--cef()--*/ - virtual bool MoveToNextFile() =0; - - /// - // Moves the cursor to the specified file in the archive. If |caseSensitive| - // is true then the search will be case sensitive. Returns true if the cursor - // position was set successfully. - /// - /*--cef()--*/ - virtual bool MoveToFile(const CefString& fileName, bool caseSensitive) =0; - - /// - // Closes the archive. This should be called directly to ensure that cleanup - // occurs on the correct thread. - /// - /*--cef()--*/ - virtual bool Close() =0; - - - // The below methods act on the file at the current cursor position. - - /// - // Returns the name of the file. - /// - /*--cef()--*/ - virtual CefString GetFileName() =0; - - /// - // Returns the uncompressed size of the file. - /// - /*--cef()--*/ - virtual int64 GetFileSize() =0; - - /// - // Returns the last modified timestamp for the file. - /// - /*--cef()--*/ - virtual time_t GetFileLastModified() =0; - - /// - // Opens the file for reading of uncompressed data. A read password may - // optionally be specified. - /// - /*--cef(optional_param=password)--*/ - virtual bool OpenFile(const CefString& password) =0; - - /// - // Closes the file. - /// - /*--cef()--*/ - virtual bool CloseFile() =0; - - /// - // Read uncompressed file contents into the specified buffer. Returns < 0 if - // an error occurred, 0 if at the end of file, or the number of bytes read. - /// - /*--cef()--*/ - virtual int ReadFile(void* buffer, size_t bufferSize) =0; - - /// - // Returns the current offset in the uncompressed file contents. - /// - /*--cef()--*/ - virtual int64 Tell() =0; - - /// - // Returns true if at end of the file contents. - /// - /*--cef()--*/ - virtual bool Eof() =0; -}; - -#endif // CEF_INCLUDE_CEF_ZIP_READER_H_ diff --git a/cef1/include/cef_zoom_handler.h b/cef1/include/cef_zoom_handler.h deleted file mode 100644 index 7062b64b7..000000000 --- a/cef1/include/cef_zoom_handler.h +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) 2012 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file must follow a specific format in order to -// support the CEF translator tool. See the translator.README.txt file in the -// tools directory for more information. -// - -#ifndef CEF_INCLUDE_CEF_ZOOM_HANDLER_H_ -#define CEF_INCLUDE_CEF_ZOOM_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_browser.h" - -/// -// Implement this interface to customize zoom handling. The methods of this -// class will be called on the UI thread. -/// -/*--cef(source=client)--*/ -class CefZoomHandler : public virtual CefBase { - public: - /// - // Called when the browser wants to retrieve the zoom level for the given - // |url|. Return true if |zoomLevel| has been set to the custom zoom level. - // Return false for the browser's default zoom handling behavior. - /// - /*--cef()--*/ - virtual bool OnGetZoomLevel(CefRefPtr browser, - const CefString& url, - double& zoomLevel) { return false; } - - /// - // Called when the browser's zoom level has been set to |zoomLevel| for the - // given |url|. Return true to indicate that the new setting has been handled. - // Return false to use the browser's default zoom handling behavior. - /// - /*--cef()--*/ - virtual bool OnSetZoomLevel(CefRefPtr browser, - const CefString& url, - double zoomLevel) { return false; } -}; - -#endif // CEF_INCLUDE_CEF_ZOOM_HANDLER_H_ diff --git a/cef1/include/internal/cef_build.h b/cef1/include/internal/cef_build.h deleted file mode 100644 index 4b8c54546..000000000 --- a/cef1/include/internal/cef_build.h +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - - -#ifndef CEF_INCLUDE_INTERNAL_CEF_BUILD_H_ -#define CEF_INCLUDE_INTERNAL_CEF_BUILD_H_ -#pragma once - -#if defined(BUILDING_CEF_SHARED) - -#include "base/compiler_specific.h" - -#else // !BUILDING_CEF_SHARED - -#if defined(_WIN32) -#ifndef OS_WIN -#define OS_WIN 1 -#endif -#elif defined(__APPLE__) -#ifndef OS_MACOSX -#define OS_MACOSX 1 -#endif -#elif defined(__linux__) -#ifndef OS_LINUX -#define OS_LINUX 1 -#endif -#else -#error Please add support for your platform in cef_build.h -#endif - -// For access to standard POSIXish features, use OS_POSIX instead of a -// more specific macro. -#if defined(OS_MACOSX) || defined(OS_LINUX) -#ifndef OS_POSIX -#define OS_POSIX 1 -#endif -#endif - -// Compiler detection. -#if defined(__GNUC__) -#ifndef COMPILER_GCC -#define COMPILER_GCC 1 -#endif -#elif defined(_MSC_VER) -#ifndef COMPILER_MSVC -#define COMPILER_MSVC 1 -#endif -#else -#error Please add support for your compiler in cef_build.h -#endif - -// Annotate a virtual method indicating it must be overriding a virtual -// method in the parent class. -// Use like: -// virtual void foo() OVERRIDE; -#ifndef OVERRIDE -#if defined(COMPILER_MSVC) -#define OVERRIDE override -#elif defined(__clang__) -#define OVERRIDE override -#else -#define OVERRIDE -#endif -#endif - -#ifndef ALLOW_THIS_IN_INITIALIZER_LIST -#if defined(COMPILER_MSVC) - -// MSVC_PUSH_DISABLE_WARNING pushes |n| onto a stack of warnings to be disabled. -// The warning remains disabled until popped by MSVC_POP_WARNING. -#define MSVC_PUSH_DISABLE_WARNING(n) __pragma(warning(push)) \ - __pragma(warning(disable:n)) - -// MSVC_PUSH_WARNING_LEVEL pushes |n| as the global warning level. The level -// remains in effect until popped by MSVC_POP_WARNING(). Use 0 to disable all -// warnings. -#define MSVC_PUSH_WARNING_LEVEL(n) __pragma(warning(push, n)) - -// Pop effects of innermost MSVC_PUSH_* macro. -#define MSVC_POP_WARNING() __pragma(warning(pop)) - -// Allows |this| to be passed as an argument in constructor initializer lists. -// This uses push/pop instead of the seemingly simpler suppress feature to avoid -// having the warning be disabled for more than just |code|. -// -// Example usage: -// Foo::Foo() : x(NULL), ALLOW_THIS_IN_INITIALIZER_LIST(y(this)), z(3) {} -// -// Compiler warning C4355: 'this': used in base member initializer list: -// http://msdn.microsoft.com/en-us/library/3c594ae3(VS.80).aspx -#define ALLOW_THIS_IN_INITIALIZER_LIST(code) MSVC_PUSH_DISABLE_WARNING(4355) \ - code \ - MSVC_POP_WARNING() -#else // !COMPILER_MSVC - -#define ALLOW_THIS_IN_INITIALIZER_LIST(code) code - -#endif // !COMPILER_MSVC -#endif - -#endif // !BUILDING_CEF_SHARED - -#endif // CEF_INCLUDE_INTERNAL_CEF_BUILD_H_ diff --git a/cef1/include/internal/cef_export.h b/cef1/include/internal/cef_export.h deleted file mode 100644 index d333a5db8..000000000 --- a/cef1/include/internal/cef_export.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework Authors. All rights -// reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - -#ifndef CEF_INCLUDE_INTERNAL_CEF_EXPORT_H_ -#define CEF_INCLUDE_INTERNAL_CEF_EXPORT_H_ -#pragma once - -#include "include/internal/cef_build.h" - -#if defined(COMPILER_MSVC) - -#ifdef BUILDING_CEF_SHARED -#define CEF_EXPORT __declspec(dllexport) -#elif USING_CEF_SHARED -#define CEF_EXPORT __declspec(dllimport) -#else -#define CEF_EXPORT -#endif -#define CEF_CALLBACK __stdcall - -#elif defined(COMPILER_GCC) - -#define CEF_EXPORT __attribute__ ((visibility("default"))) -#define CEF_CALLBACK - -#endif // COMPILER_GCC - -#endif // CEF_INCLUDE_INTERNAL_CEF_EXPORT_H_ diff --git a/cef1/include/internal/cef_linux.h b/cef1/include/internal/cef_linux.h deleted file mode 100644 index 0c9003b06..000000000 --- a/cef1/include/internal/cef_linux.h +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright (c) 2010 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - - -#ifndef CEF_INCLUDE_INTERNAL_CEF_LINUX_H_ -#define CEF_INCLUDE_INTERNAL_CEF_LINUX_H_ -#pragma once - -#if defined(OS_LINUX) -#include -#include "include/internal/cef_types_linux.h" -#include "include/internal/cef_types_wrappers.h" - -/// -// Atomic increment and decrement. -/// -inline long CefAtomicIncrement(long volatile *pDest) { // NOLINT(runtime/int) - return __sync_add_and_fetch(pDest, 1); -} -inline long CefAtomicDecrement(long volatile *pDest) { // NOLINT(runtime/int) - return __sync_sub_and_fetch(pDest, 1); -} - -/// -// Critical section wrapper. -/// -class CefCriticalSection { - public: - CefCriticalSection() { - pthread_mutexattr_init(&attr_); - pthread_mutexattr_settype(&attr_, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&lock_, &attr_); - } - virtual ~CefCriticalSection() { - pthread_mutex_destroy(&lock_); - pthread_mutexattr_destroy(&attr_); - } - void Lock() { - pthread_mutex_lock(&lock_); - } - void Unlock() { - pthread_mutex_unlock(&lock_); - } - - pthread_mutex_t lock_; - pthread_mutexattr_t attr_; -}; - -/// -// Handle types. -/// -#define CefWindowHandle cef_window_handle_t -#define CefCursorHandle cef_cursor_handle_t - - -struct CefWindowInfoTraits { - typedef cef_window_info_t struct_type; - - static inline void init(struct_type* s) {} - static inline void clear(struct_type* s) {} - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->m_Widget = src->m_Widget; - target->m_ParentWidget = src->m_ParentWidget; - } -}; - -/// -// Class representing window information. -/// -class CefWindowInfo : public CefStructBase { - public: - typedef CefStructBase parent; - - CefWindowInfo() : parent() {} - explicit CefWindowInfo(const cef_window_info_t& r) : parent(r) {} - explicit CefWindowInfo(const CefWindowInfo& r) : parent(r) {} - - void SetAsChild(CefWindowHandle ParentWidget) { - m_ParentWidget = ParentWidget; - } -}; - - -struct CefPrintInfoTraits { - typedef cef_print_info_t struct_type; - - static inline void init(struct_type* s) {} - static inline void clear(struct_type* s) {} - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->m_Scale = src->m_Scale; - } -}; - -/// -// Class representing print context information. -/// -typedef CefStructBase CefPrintInfo; - - -struct CefKeyInfoTraits { - typedef cef_key_info_t struct_type; - - static inline void init(struct_type* s) {} - static inline void clear(struct_type* s) {} - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->key = src->key; - } -}; - -/// -// Class representing key information. -/// -typedef CefStructBase CefKeyInfo; - -#endif // OS_LINUX - -#endif // CEF_INCLUDE_INTERNAL_CEF_LINUX_H_ diff --git a/cef1/include/internal/cef_mac.h b/cef1/include/internal/cef_mac.h deleted file mode 100644 index d979e80fe..000000000 --- a/cef1/include/internal/cef_mac.h +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright (c) 2010 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - - -#ifndef CEF_INCLUDE_INTERNAL_CEF_MAC_H_ -#define CEF_INCLUDE_INTERNAL_CEF_MAC_H_ -#pragma once - -#if defined(OS_MACOSX) -#include -#include "include/internal/cef_types_mac.h" -#include "include/internal/cef_types_wrappers.h" - -/// -// Atomic increment and decrement. -/// -inline long CefAtomicIncrement(long volatile *pDest) { // NOLINT(runtime/int) - return __sync_add_and_fetch(pDest, 1); -} -inline long CefAtomicDecrement(long volatile *pDest) { // NOLINT(runtime/int) - return __sync_sub_and_fetch(pDest, 1); -} - -/// -// Handle types. -/// -#define CefWindowHandle cef_window_handle_t -#define CefCursorHandle cef_cursor_handle_t - -/// -// Critical section wrapper. -/// -class CefCriticalSection { - public: - CefCriticalSection() { - pthread_mutexattr_init(&attr_); - pthread_mutexattr_settype(&attr_, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&lock_, &attr_); - } - virtual ~CefCriticalSection() { - pthread_mutex_destroy(&lock_); - pthread_mutexattr_destroy(&attr_); - } - void Lock() { - pthread_mutex_lock(&lock_); - } - void Unlock() { - pthread_mutex_unlock(&lock_); - } - - pthread_mutex_t lock_; - pthread_mutexattr_t attr_; -}; - - -struct CefWindowInfoTraits { - typedef cef_window_info_t struct_type; - - static inline void init(struct_type* s) {} - - static inline void clear(struct_type* s) { - cef_string_clear(&s->m_windowName); - } - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->m_View = src->m_View; - target->m_ParentView = src->m_ParentView; - cef_string_set(src->m_windowName.str, src->m_windowName.length, - &target->m_windowName, copy); - target->m_x = src->m_x; - target->m_y = src->m_y; - target->m_nWidth = src->m_nWidth; - target->m_nHeight = src->m_nHeight; - target->m_bHidden = src->m_bHidden; - target->m_bWindowRenderingDisabled = src->m_bWindowRenderingDisabled; - target->m_bTransparentPainting = src->m_bTransparentPainting; - } -}; - -/// -// Class representing window information. -/// -class CefWindowInfo : public CefStructBase { - public: - typedef CefStructBase parent; - - CefWindowInfo() : parent() {} - explicit CefWindowInfo(const cef_window_info_t& r) : parent(r) {} - explicit CefWindowInfo(const CefWindowInfo& r) : parent(r) {} - - void SetAsChild(CefWindowHandle ParentView, int x, int y, int width, - int height) { - m_ParentView = ParentView; - m_x = x; - m_y = y; - m_nWidth = width; - m_nHeight = height; - m_bHidden = false; - } - - void SetAsOffScreen(NSView* parent) { - m_bWindowRenderingDisabled = true; - m_ParentView = parent; - } - - void SetTransparentPainting(int transparentPainting) { - m_bTransparentPainting = transparentPainting; - } -}; - - -struct CefPrintInfoTraits { - typedef cef_print_info_t struct_type; - - static inline void init(struct_type* s) {} - static inline void clear(struct_type* s) {} - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->m_Scale = src->m_Scale; - } -}; - -/// -// Class representing print context information. -/// -typedef CefStructBase CefPrintInfo; - -struct CefKeyInfoTraits { - typedef cef_key_info_t struct_type; - - static inline void init(struct_type* s) {} - static inline void clear(struct_type* s) {} - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->keyCode = src->keyCode; - target->character = src->character; - target->characterNoModifiers = src->characterNoModifiers; - } -}; - -/// -// Class representing key information. -/// -typedef CefStructBase CefKeyInfo; - - -#endif // OS_MACOSX - -#endif // CEF_INCLUDE_INTERNAL_CEF_MAC_H_ diff --git a/cef1/include/internal/cef_nplugin_types.h b/cef1/include/internal/cef_nplugin_types.h deleted file mode 100644 index 0113f72fb..000000000 --- a/cef1/include/internal/cef_nplugin_types.h +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - - -#ifndef CEF_INCLUDE_INTERNAL_CEF_NPLUGIN_TYPES_H_ -#define CEF_INCLUDE_INTERNAL_CEF_NPLUGIN_TYPES_H_ -#pragma once - -#include "include/internal/cef_export.h" -#include "include/internal/cef_string.h" -#include "third_party/npapi/bindings/npapi.h" -#include "third_party/npapi/bindings/nphostapi.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// Netscape plugins are normally built at separate DLLs that are loaded by the -// browser when needed. This interface supports the creation of plugins that -// are an embedded component of the application. Embedded plugins built using -// this interface use the same Netscape Plugin API as DLL-based plugins. -// See https://developer.mozilla.org/En/Gecko_Plugin_API_Reference for complete -// documentation on how to use the Netscape Plugin API. - -// This structure provides attribute information and entry point functions for -// a plugin. -typedef struct _cef_plugin_info_t { - // The unique name that identifies the plugin. - cef_string_t unique_name; - - // The friendly display name of the plugin. - cef_string_t display_name; - - // The version string of the plugin. - cef_string_t version; - - // A description of the plugin. - cef_string_t description; - - // A pipe (|) delimited list of mime type values that the plugin supports. - cef_string_t mime_types; - - // A pipe (|) delimited list of extension values. Each value is associated - // with the mime type value at the same position. Multiple file extensions - // for the same mime type may be delimited with commas (,). - cef_string_t file_extensions; - - // A pipe (|) delimited list of description values. Each value is associated - // with the mime type value at the same position. - cef_string_t type_descriptions; - - // Entry point function pointers. -#if !defined(OS_POSIX) || defined(OS_MACOSX) - NP_GetEntryPointsFunc np_getentrypoints; -#endif - NP_InitializeFunc np_initialize; - NP_ShutdownFunc np_shutdown; -} cef_plugin_info_t; - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_INTERNAL_CEF_NPLUGIN_TYPES_H_ diff --git a/cef1/include/internal/cef_ptr.h b/cef1/include/internal/cef_ptr.h deleted file mode 100644 index fcbe69e5c..000000000 --- a/cef1/include/internal/cef_ptr.h +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright (c) 2008 Marshall A. Greenblatt. Portions Copyright (c) -// 2006-2008 Google 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: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - - -#ifndef CEF_INCLUDE_INTERNAL_CEF_PTR_H_ -#define CEF_INCLUDE_INTERNAL_CEF_PTR_H_ -#pragma once - -#include - -/// -// Smart pointer implementation borrowed from base/ref_counted.h -//

-// A smart pointer class for reference counted objects. Use this class instead -// of calling AddRef and Release manually on a reference counted object to -// avoid common memory leaks caused by forgetting to Release an object -// reference. Sample usage: -//

-//   class MyFoo : public CefBase {
-//    ...
-//   };
-//
-//   void some_function() {
-//     // The MyFoo object that |foo| represents starts with a single
-//     // reference.
-//     CefRefPtr<MyFoo> foo = new MyFoo();
-//     foo->Method(param);
-//     // |foo| is released when this function returns
-//   }
-//
-//   void some_other_function() {
-//     CefRefPtr<MyFoo> foo = new MyFoo();
-//     ...
-//     foo = NULL;  // explicitly releases |foo|
-//     ...
-//     if (foo)
-//       foo->Method(param);
-//   }
-// 
-// The above examples show how CefRefPtr<T> acts like a pointer to T. -// Given two CefRefPtr<T> classes, it is also possible to exchange -// references between the two objects, like so: -//
-//   {
-//     CefRefPtr<MyFoo> a = new MyFoo();
-//     CefRefPtr<MyFoo> b;
-//
-//     b.swap(a);
-//     // now, |b| references the MyFoo object, and |a| references NULL.
-//   }
-// 
-// To make both |a| and |b| in the above example reference the same MyFoo -// object, simply use the assignment operator: -//
-//   {
-//     CefRefPtr<MyFoo> a = new MyFoo();
-//     CefRefPtr<MyFoo> b;
-//
-//     b = a;
-//     // now, |a| and |b| each own a reference to the same MyFoo object.
-//     // the reference count of the underlying MyFoo object will be 2.
-//   }
-// 
-// Reference counted objects can also be passed as function parameters and -// used as function return values: -//
-//   void some_func_with_param(CefRefPtr<MyFoo> param) {
-//     // A reference is added to the MyFoo object that |param| represents
-//     // during the scope of some_func_with_param() and released when
-//     // some_func_with_param() goes out of scope.
-//   }
-//
-//   CefRefPtr<MyFoo> some_func_with_retval() {
-//     // The MyFoo object that |foox| represents starts with a single
-//     // reference.
-//     CefRefPtr<MyFoo> foox = new MyFoo();
-//
-//     // Creating the return value adds an additional reference.
-//     return foox;
-//
-//     // When some_func_with_retval() goes out of scope the original |foox|
-//     // reference is released.
-//   }
-//
-//   void and_another_function() {
-//     CefRefPtr<MyFoo> foo = new MyFoo();
-//
-//     // pass |foo| as a parameter.
-//     some_function(foo);
-//
-//     CefRefPtr<MyFoo> foo2 = some_func_with_retval();
-//     // Now, since we kept a reference to the some_func_with_retval() return
-//     // value, |foo2| is the only class pointing to the MyFoo object created
-//     in some_func_with_retval(), and it has a reference count of 1.
-//
-//     some_func_with_retval();
-//     // Now, since we didn't keep a reference to the some_func_with_retval()
-//     // return value, the MyFoo object created in some_func_with_retval()
-//     // will automatically be released.
-//   }
-// 
-// And in standard containers: -//
-//   {
-//      // Create a vector that holds MyFoo objects.
-//      std::vector<CefRefPtr<MyFoo> > MyFooVec;
-//
-//     // The MyFoo object that |foo| represents starts with a single
-//     // reference.
-//     CefRefPtr<MyFoo> foo = new MyFoo();
-//
-//     // When the MyFoo object is added to |MyFooVec| the reference count
-//     // is increased to 2.
-//     MyFooVec.push_back(foo);
-//   }
-// 
-//

-/// -template -class CefRefPtr { - public: - CefRefPtr() : ptr_(NULL) { - } - - CefRefPtr(T* p) : ptr_(p) { // NOLINT(runtime/explicit) - if (ptr_) - ptr_->AddRef(); - } - - CefRefPtr(const CefRefPtr& r) : ptr_(r.ptr_) { - if (ptr_) - ptr_->AddRef(); - } - - ~CefRefPtr() { - if (ptr_) - ptr_->Release(); - } - - T* get() const { return ptr_; } - operator T*() const { return ptr_; } - T* operator->() const { return ptr_; } - - CefRefPtr& operator=(T* p) { - // AddRef first so that self assignment should work - if (p) - p->AddRef(); - if (ptr_ ) - ptr_ ->Release(); - ptr_ = p; - return *this; - } - - CefRefPtr& operator=(const CefRefPtr& r) { - return *this = r.ptr_; - } - - void swap(T** pp) { - T* p = ptr_; - ptr_ = *pp; - *pp = p; - } - - void swap(CefRefPtr& r) { - swap(&r.ptr_); // NOLINT(build/include_what_you_use) - } - - private: - T* ptr_; -}; - -#endif // CEF_INCLUDE_INTERNAL_CEF_PTR_H_ diff --git a/cef1/include/internal/cef_string.h b/cef1/include/internal/cef_string.h deleted file mode 100644 index a7876fe56..000000000 --- a/cef1/include/internal/cef_string.h +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (c) 2010 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - -#ifndef CEF_INCLUDE_INTERNAL_CEF_STRING_H_ -#define CEF_INCLUDE_INTERNAL_CEF_STRING_H_ -#pragma once - -// The CEF interface is built with one string type as the default. Comment out -// all but one of the CEF_STRING_TYPE_* defines below to specify the default. -// If you change the default you MUST recompile all of CEF. - -// Build with the UTF8 string type as default. -// #define CEF_STRING_TYPE_UTF8 1 - -// Build with the UTF16 string type as default. -#define CEF_STRING_TYPE_UTF16 1 - -// Build with the wide string type as default. -// #define CEF_STRING_TYPE_WIDE 1 - - -#include "include/internal/cef_string_types.h" - -#ifdef __cplusplus -#include "include/internal/cef_string_wrappers.h" -#if defined(CEF_STRING_TYPE_UTF16) -typedef CefStringUTF16 CefString; -#elif defined(CEF_STRING_TYPE_UTF8) -typedef CefStringUTF8 CefString; -#elif defined(CEF_STRING_TYPE_WIDE) -typedef CefStringWide CefString; -#endif -#endif // __cplusplus - -#if defined(CEF_STRING_TYPE_UTF8) -typedef char cef_char_t; -typedef cef_string_utf8_t cef_string_t; -typedef cef_string_userfree_utf8_t cef_string_userfree_t; -#define cef_string_set cef_string_utf8_set -#define cef_string_copy cef_string_utf8_copy -#define cef_string_clear cef_string_utf8_clear -#define cef_string_userfree_alloc cef_string_userfree_utf8_alloc -#define cef_string_userfree_free cef_string_userfree_utf8_free -#define cef_string_from_ascii cef_string_utf8_copy -#define cef_string_to_utf8 cef_string_utf8_copy -#define cef_string_from_utf8 cef_string_utf8_copy -#define cef_string_to_utf16 cef_string_utf8_to_utf16 -#define cef_string_from_utf16 cef_string_utf16_to_utf8 -#define cef_string_to_wide cef_string_utf8_to_wide -#define cef_string_from_wide cef_string_wide_to_utf8 -#elif defined(CEF_STRING_TYPE_UTF16) -typedef char16 cef_char_t; -typedef cef_string_userfree_utf16_t cef_string_userfree_t; -typedef cef_string_utf16_t cef_string_t; -#define cef_string_set cef_string_utf16_set -#define cef_string_copy cef_string_utf16_copy -#define cef_string_clear cef_string_utf16_clear -#define cef_string_userfree_alloc cef_string_userfree_utf16_alloc -#define cef_string_userfree_free cef_string_userfree_utf16_free -#define cef_string_from_ascii cef_string_ascii_to_utf16 -#define cef_string_to_utf8 cef_string_utf16_to_utf8 -#define cef_string_from_utf8 cef_string_utf8_to_utf16 -#define cef_string_to_utf16 cef_string_utf16_copy -#define cef_string_from_utf16 cef_string_utf16_copy -#define cef_string_to_wide cef_string_utf16_to_wide -#define cef_string_from_wide cef_string_wide_to_utf16 -#elif defined(CEF_STRING_TYPE_WIDE) -typedef wchar_t cef_char_t; -typedef cef_string_wide_t cef_string_t; -typedef cef_string_userfree_wide_t cef_string_userfree_t; -#define cef_string_set cef_string_wide_set -#define cef_string_copy cef_string_wide_copy -#define cef_string_clear cef_string_wide_clear -#define cef_string_userfree_alloc cef_string_userfree_wide_alloc -#define cef_string_userfree_free cef_string_userfree_wide_free -#define cef_string_from_ascii cef_string_ascii_to_wide -#define cef_string_to_utf8 cef_string_wide_to_utf8 -#define cef_string_from_utf8 cef_string_utf8_to_wide -#define cef_string_to_utf16 cef_string_wide_to_utf16 -#define cef_string_from_utf16 cef_string_utf16_to_wide -#define cef_string_to_wide cef_string_wide_copy -#define cef_string_from_wide cef_string_wide_copy -#else -#error Please choose a string type. -#endif - -#endif // CEF_INCLUDE_INTERNAL_CEF_STRING_H_ diff --git a/cef1/include/internal/cef_string_list.h b/cef1/include/internal/cef_string_list.h deleted file mode 100644 index 52a0abf2f..000000000 --- a/cef1/include/internal/cef_string_list.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2009 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - -#ifndef CEF_INCLUDE_INTERNAL_CEF_STRING_LIST_H_ -#define CEF_INCLUDE_INTERNAL_CEF_STRING_LIST_H_ -#pragma once - -#include "include/internal/cef_export.h" -#include "include/internal/cef_string.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/// -// CEF string maps are a set of key/value string pairs. -/// -typedef void* cef_string_list_t; - -/// -// Allocate a new string map. -/// -CEF_EXPORT cef_string_list_t cef_string_list_alloc(); - -/// -// Return the number of elements in the string list. -/// -CEF_EXPORT int cef_string_list_size(cef_string_list_t list); - -/// -// Retrieve the value at the specified zero-based string list index. Returns -// true (1) if the value was successfully retrieved. -/// -CEF_EXPORT int cef_string_list_value(cef_string_list_t list, - int index, cef_string_t* value); - -/// -// Append a new value at the end of the string list. -/// -CEF_EXPORT void cef_string_list_append(cef_string_list_t list, - const cef_string_t* value); - -/// -// Clear the string list. -/// -CEF_EXPORT void cef_string_list_clear(cef_string_list_t list); - -/// -// Free the string list. -/// -CEF_EXPORT void cef_string_list_free(cef_string_list_t list); - -/// -// Creates a copy of an existing string list. -/// -CEF_EXPORT cef_string_list_t cef_string_list_copy(cef_string_list_t list); - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_INTERNAL_CEF_STRING_LIST_H_ diff --git a/cef1/include/internal/cef_string_map.h b/cef1/include/internal/cef_string_map.h deleted file mode 100644 index 93eea2a55..000000000 --- a/cef1/include/internal/cef_string_map.h +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2009 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - -#ifndef CEF_INCLUDE_INTERNAL_CEF_STRING_MAP_H_ -#define CEF_INCLUDE_INTERNAL_CEF_STRING_MAP_H_ -#pragma once - -#include "include/internal/cef_export.h" -#include "include/internal/cef_string.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/// -// CEF string maps are a set of key/value string pairs. -/// -typedef void* cef_string_map_t; - -/// -// Allocate a new string map. -/// -CEF_EXPORT cef_string_map_t cef_string_map_alloc(); - -/// -// Return the number of elements in the string map. -/// -CEF_EXPORT int cef_string_map_size(cef_string_map_t map); - -/// -// Return the value assigned to the specified key. -/// -CEF_EXPORT int cef_string_map_find(cef_string_map_t map, - const cef_string_t* key, - cef_string_t* value); - -/// -// Return the key at the specified zero-based string map index. -/// -CEF_EXPORT int cef_string_map_key(cef_string_map_t map, int index, - cef_string_t* key); - -/// -// Return the value at the specified zero-based string map index. -/// -CEF_EXPORT int cef_string_map_value(cef_string_map_t map, int index, - cef_string_t* value); - -/// -// Append a new key/value pair at the end of the string map. -/// -CEF_EXPORT int cef_string_map_append(cef_string_map_t map, - const cef_string_t* key, - const cef_string_t* value); - -/// -// Clear the string map. -/// -CEF_EXPORT void cef_string_map_clear(cef_string_map_t map); - -/// -// Free the string map. -/// -CEF_EXPORT void cef_string_map_free(cef_string_map_t map); - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_INTERNAL_CEF_STRING_MAP_H_ diff --git a/cef1/include/internal/cef_string_multimap.h b/cef1/include/internal/cef_string_multimap.h deleted file mode 100644 index cd3904244..000000000 --- a/cef1/include/internal/cef_string_multimap.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - -#ifndef CEF_INCLUDE_INTERNAL_CEF_STRING_MULTIMAP_H_ -#define CEF_INCLUDE_INTERNAL_CEF_STRING_MULTIMAP_H_ -#pragma once - -#include "include/internal/cef_export.h" -#include "include/internal/cef_string.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/// -// CEF string multimaps are a set of key/value string pairs. -// More than one value can be assigned to a single key. -/// -typedef void* cef_string_multimap_t; - -/// -// Allocate a new string multimap. -/// -CEF_EXPORT cef_string_multimap_t cef_string_multimap_alloc(); - -/// -// Return the number of elements in the string multimap. -/// -CEF_EXPORT int cef_string_multimap_size(cef_string_multimap_t map); - -/// -// Return the number of values with the specified key. -/// -CEF_EXPORT int cef_string_multimap_find_count(cef_string_multimap_t map, - const cef_string_t* key); - -/// -// Return the value_index-th value with the specified key. -/// -CEF_EXPORT int cef_string_multimap_enumerate(cef_string_multimap_t map, - const cef_string_t* key, - int value_index, - cef_string_t* value); - -/// -// Return the key at the specified zero-based string multimap index. -/// -CEF_EXPORT int cef_string_multimap_key(cef_string_multimap_t map, int index, - cef_string_t* key); - -/// -// Return the value at the specified zero-based string multimap index. -/// -CEF_EXPORT int cef_string_multimap_value(cef_string_multimap_t map, int index, - cef_string_t* value); - -/// -// Append a new key/value pair at the end of the string multimap. -/// -CEF_EXPORT int cef_string_multimap_append(cef_string_multimap_t map, - const cef_string_t* key, - const cef_string_t* value); - -/// -// Clear the string multimap. -/// -CEF_EXPORT void cef_string_multimap_clear(cef_string_multimap_t map); - -/// -// Free the string multimap. -/// -CEF_EXPORT void cef_string_multimap_free(cef_string_multimap_t map); - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_INTERNAL_CEF_STRING_MULTIMAP_H_ diff --git a/cef1/include/internal/cef_string_types.h b/cef1/include/internal/cef_string_types.h deleted file mode 100644 index 7ab6671cb..000000000 --- a/cef1/include/internal/cef_string_types.h +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright (c) 2010 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - -#ifndef CEF_INCLUDE_INTERNAL_CEF_STRING_TYPES_H_ -#define CEF_INCLUDE_INTERNAL_CEF_STRING_TYPES_H_ -#pragma once - -// CEF provides functions for converting between UTF-8, -16 and -32 strings. -// CEF string types are safe for reading from multiple threads but not for -// modification. It is the user's responsibility to provide synchronization if -// modifying CEF strings from multiple threads. - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/internal/cef_build.h" -#include "include/internal/cef_export.h" -#include - -// CEF character type definitions. wchar_t is 2 bytes on Windows and 4 bytes on -// most other platforms. - -#if defined(OS_WIN) -typedef wchar_t char16; -#else // !OS_WIN -typedef unsigned short char16; // NOLINT (runtime/int) -#ifndef WCHAR_T_IS_UTF32 -#define WCHAR_T_IS_UTF32 -#endif // WCHAR_T_IS_UTF32 -#endif // !OS_WIN - - -// CEF string type definitions. Whomever allocates |str| is responsible for -// providing an appropriate |dtor| implementation that will free the string in -// the same memory space. When reusing an existing string structure make sure -// to call |dtor| for the old value before assigning new |str| and |dtor| -// values. Static strings will have a NULL |dtor| value. Using the below -// functions if you want this managed for you. - -typedef struct _cef_string_wide_t { - wchar_t* str; - size_t length; - void (*dtor)(wchar_t* str); -} cef_string_wide_t; - -typedef struct _cef_string_utf8_t { - char* str; - size_t length; - void (*dtor)(char* str); -} cef_string_utf8_t; - -typedef struct _cef_string_utf16_t { - char16* str; - size_t length; - void (*dtor)(char16* str); -} cef_string_utf16_t; - - -/// -// These functions set string values. If |copy| is true (1) the value will be -// copied instead of referenced. It is up to the user to properly manage -// the lifespan of references. -/// - -CEF_EXPORT int cef_string_wide_set(const wchar_t* src, size_t src_len, - cef_string_wide_t* output, int copy); -CEF_EXPORT int cef_string_utf8_set(const char* src, size_t src_len, - cef_string_utf8_t* output, int copy); -CEF_EXPORT int cef_string_utf16_set(const char16* src, size_t src_len, - cef_string_utf16_t* output, int copy); - - -/// -// Convenience macros for copying values. -/// - -#define cef_string_wide_copy(src, src_len, output) \ - cef_string_wide_set(src, src_len, output, true) -#define cef_string_utf8_copy(src, src_len, output) \ - cef_string_utf8_set(src, src_len, output, true) -#define cef_string_utf16_copy(src, src_len, output) \ - cef_string_utf16_set(src, src_len, output, true) - - -/// -// These functions clear string values. The structure itself is not freed. -/// - -CEF_EXPORT void cef_string_wide_clear(cef_string_wide_t* str); -CEF_EXPORT void cef_string_utf8_clear(cef_string_utf8_t* str); -CEF_EXPORT void cef_string_utf16_clear(cef_string_utf16_t* str); - - -/// -// These functions compare two string values with the same results as strcmp(). -/// - -CEF_EXPORT int cef_string_wide_cmp(const cef_string_wide_t* str1, - const cef_string_wide_t* str2); -CEF_EXPORT int cef_string_utf8_cmp(const cef_string_utf8_t* str1, - const cef_string_utf8_t* str2); -CEF_EXPORT int cef_string_utf16_cmp(const cef_string_utf16_t* str1, - const cef_string_utf16_t* str2); - - -/// -// These functions convert between UTF-8, -16, and -32 strings. They are -// potentially slow so unnecessary conversions should be avoided. The best -// possible result will always be written to |output| with the boolean return -// value indicating whether the conversion is 100% valid. -/// - -CEF_EXPORT int cef_string_wide_to_utf8(const wchar_t* src, size_t src_len, - cef_string_utf8_t* output); -CEF_EXPORT int cef_string_utf8_to_wide(const char* src, size_t src_len, - cef_string_wide_t* output); - -CEF_EXPORT int cef_string_wide_to_utf16(const wchar_t* src, size_t src_len, - cef_string_utf16_t* output); -CEF_EXPORT int cef_string_utf16_to_wide(const char16* src, size_t src_len, - cef_string_wide_t* output); - -CEF_EXPORT int cef_string_utf8_to_utf16(const char* src, size_t src_len, - cef_string_utf16_t* output); -CEF_EXPORT int cef_string_utf16_to_utf8(const char16* src, size_t src_len, - cef_string_utf8_t* output); - - -/// -// These functions convert an ASCII string, typically a hardcoded constant, to a -// Wide/UTF16 string. Use instead of the UTF8 conversion routines if you know -// the string is ASCII. -/// - -CEF_EXPORT int cef_string_ascii_to_wide(const char* src, size_t src_len, - cef_string_wide_t* output); -CEF_EXPORT int cef_string_ascii_to_utf16(const char* src, size_t src_len, - cef_string_utf16_t* output); - - - -/// -// It is sometimes necessary for the system to allocate string structures with -// the expectation that the user will free them. The userfree types act as a -// hint that the user is responsible for freeing the structure. -/// - -typedef cef_string_wide_t* cef_string_userfree_wide_t; -typedef cef_string_utf8_t* cef_string_userfree_utf8_t; -typedef cef_string_utf16_t* cef_string_userfree_utf16_t; - - -/// -// These functions allocate a new string structure. They must be freed by -// calling the associated free function. -/// - -CEF_EXPORT cef_string_userfree_wide_t cef_string_userfree_wide_alloc(); -CEF_EXPORT cef_string_userfree_utf8_t cef_string_userfree_utf8_alloc(); -CEF_EXPORT cef_string_userfree_utf16_t cef_string_userfree_utf16_alloc(); - - -/// -// These functions free the string structure allocated by the associated -// alloc function. Any string contents will first be cleared. -/// - -CEF_EXPORT void cef_string_userfree_wide_free(cef_string_userfree_wide_t str); -CEF_EXPORT void cef_string_userfree_utf8_free(cef_string_userfree_utf8_t str); -CEF_EXPORT void cef_string_userfree_utf16_free(cef_string_userfree_utf16_t str); - - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_INTERNAL_CEF_STRING_TYPES_H_ diff --git a/cef1/include/internal/cef_string_wrappers.h b/cef1/include/internal/cef_string_wrappers.h deleted file mode 100644 index b3012331b..000000000 --- a/cef1/include/internal/cef_string_wrappers.h +++ /dev/null @@ -1,712 +0,0 @@ -// Copyright (c) 2010 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - -#ifndef CEF_INCLUDE_INTERNAL_CEF_STRING_WRAPPERS_H_ -#define CEF_INCLUDE_INTERNAL_CEF_STRING_WRAPPERS_H_ -#pragma once - -#include -#include -#include "include/internal/cef_string_types.h" - -#ifdef BUILDING_CEF_SHARED -#include "base/string16.h" -#endif - - -/// -// Traits implementation for wide character strings. -/// -struct CefStringTraitsWide { - typedef wchar_t char_type; - typedef cef_string_wide_t struct_type; - typedef cef_string_userfree_wide_t userfree_struct_type; - - static inline void clear(struct_type *s) { cef_string_wide_clear(s); } - static inline int set(const char_type* src, size_t src_size, - struct_type* output, int copy) { - return cef_string_wide_set(src, src_size, output, copy); - } - static inline int compare(const struct_type* s1, const struct_type* s2) { - return cef_string_wide_cmp(s1, s2); - } - static inline userfree_struct_type userfree_alloc() { - return cef_string_userfree_wide_alloc(); - } - static inline void userfree_free(userfree_struct_type ufs) { - return cef_string_userfree_wide_free(ufs); - } - - // Conversion methods. - static inline bool from_ascii(const char* str, size_t len, struct_type *s) { - return cef_string_ascii_to_wide(str, len, s) ? true : false; - } - static inline std::string to_string(const struct_type *s) { - cef_string_utf8_t cstr; - memset(&cstr, 0, sizeof(cstr)); - cef_string_wide_to_utf8(s->str, s->length, &cstr); - std::string str; - if (cstr.length > 0) - str = std::string(cstr.str, cstr.length); - cef_string_utf8_clear(&cstr); - return str; - } - static inline bool from_string(const std::string& str, struct_type *s) { - return cef_string_utf8_to_wide(str.c_str(), str.length(), s) ? true : false; - } - static inline std::wstring to_wstring(const struct_type *s) { - return std::wstring(s->str, s->length); - } - static inline bool from_wstring(const std::wstring& str, struct_type *s) { - return cef_string_wide_set(str.c_str(), str.length(), s, true) ? - true : false; - } -#if defined(BUILDING_CEF_SHARED) -#if defined(WCHAR_T_IS_UTF32) - static inline string16 to_string16(const struct_type *s) { - cef_string_utf16_t cstr; - memset(&cstr, 0, sizeof(cstr)); - cef_string_wide_to_utf16(s->str, s->length, &cstr); - string16 str; - if (cstr.length > 0) - str = string16(cstr.str, cstr.length); - cef_string_utf16_clear(&cstr); - return str; - } - static inline bool from_string16(const string16& str, struct_type *s) { - return cef_string_utf16_to_wide(str.c_str(), str.length(), s) ? - true : false; - } -#else // WCHAR_T_IS_UTF32 - static inline string16 to_string16(const struct_type *s) { - return string16(s->str, s->length); - } - static inline bool from_string16(const string16& str, struct_type *s) { - return cef_string_wide_set(str.c_str(), str.length(), s, true) ? - true : false; - } -#endif // WCHAR_T_IS_UTF32 -#endif // BUILDING_CEF_SHARED -}; - -/// -// Traits implementation for utf8 character strings. -/// -struct CefStringTraitsUTF8 { - typedef char char_type; - typedef cef_string_utf8_t struct_type; - typedef cef_string_userfree_utf8_t userfree_struct_type; - - static inline void clear(struct_type *s) { cef_string_utf8_clear(s); } - static inline int set(const char_type* src, size_t src_size, - struct_type* output, int copy) { - return cef_string_utf8_set(src, src_size, output, copy); - } - static inline int compare(const struct_type* s1, const struct_type* s2) { - return cef_string_utf8_cmp(s1, s2); - } - static inline userfree_struct_type userfree_alloc() { - return cef_string_userfree_utf8_alloc(); - } - static inline void userfree_free(userfree_struct_type ufs) { - return cef_string_userfree_utf8_free(ufs); - } - - // Conversion methods. - static inline bool from_ascii(const char* str, size_t len, struct_type* s) { - return cef_string_utf8_copy(str, len, s) ? true : false; - } - static inline std::string to_string(const struct_type* s) { - return std::string(s->str, s->length); - } - static inline bool from_string(const std::string& str, struct_type* s) { - return cef_string_utf8_copy(str.c_str(), str.length(), s) ? true : false; - } - static inline std::wstring to_wstring(const struct_type* s) { - cef_string_wide_t cstr; - memset(&cstr, 0, sizeof(cstr)); - cef_string_utf8_to_wide(s->str, s->length, &cstr); - std::wstring str; - if (cstr.length > 0) - str = std::wstring(cstr.str, cstr.length); - cef_string_wide_clear(&cstr); - return str; - } - static inline bool from_wstring(const std::wstring& str, struct_type* s) { - return cef_string_wide_to_utf8(str.c_str(), str.length(), s) ? true : false; - } -#if defined(BUILDING_CEF_SHARED) - static inline string16 to_string16(const struct_type* s) { - cef_string_utf16_t cstr; - memset(&cstr, 0, sizeof(cstr)); - cef_string_utf8_to_utf16(s->str, s->length, &cstr); - string16 str; - if (cstr.length > 0) - str = string16(cstr.str, cstr.length); - cef_string_utf16_clear(&cstr); - return str; - } - static inline bool from_string16(const string16& str, struct_type* s) { - return cef_string_utf16_to_utf8(str.c_str(), str.length(), s) ? - true : false; - } -#endif // BUILDING_CEF_SHARED -}; - -/// -// Traits implementation for utf16 character strings. -/// -struct CefStringTraitsUTF16 { - typedef char16 char_type; - typedef cef_string_utf16_t struct_type; - typedef cef_string_userfree_utf16_t userfree_struct_type; - - static inline void clear(struct_type *s) { cef_string_utf16_clear(s); } - static inline int set(const char_type* src, size_t src_size, - struct_type* output, int copy) { - return cef_string_utf16_set(src, src_size, output, copy); - } - static inline int compare(const struct_type* s1, const struct_type* s2) { - return cef_string_utf16_cmp(s1, s2); - } - static inline userfree_struct_type userfree_alloc() { - return cef_string_userfree_utf16_alloc(); - } - static inline void userfree_free(userfree_struct_type ufs) { - return cef_string_userfree_utf16_free(ufs); - } - - // Conversion methods. - static inline bool from_ascii(const char* str, size_t len, struct_type* s) { - return cef_string_ascii_to_utf16(str, len, s) ? true : false; - } - static inline std::string to_string(const struct_type* s) { - cef_string_utf8_t cstr; - memset(&cstr, 0, sizeof(cstr)); - cef_string_utf16_to_utf8(s->str, s->length, &cstr); - std::string str; - if (cstr.length > 0) - str = std::string(cstr.str, cstr.length); - cef_string_utf8_clear(&cstr); - return str; - } - static inline bool from_string(const std::string& str, struct_type* s) { - return cef_string_utf8_to_utf16(str.c_str(), str.length(), s) ? - true : false; - } -#if defined(WCHAR_T_IS_UTF32) - static inline std::wstring to_wstring(const struct_type* s) { - cef_string_wide_t cstr; - memset(&cstr, 0, sizeof(cstr)); - cef_string_utf16_to_wide(s->str, s->length, &cstr); - std::wstring str; - if (cstr.length > 0) - str = std::wstring(cstr.str, cstr.length); - cef_string_wide_clear(&cstr); - return str; - } - static inline bool from_wstring(const std::wstring& str, struct_type* s) { - return cef_string_wide_to_utf16(str.c_str(), str.length(), s) ? - true : false; - } -#else // WCHAR_T_IS_UTF32 - static inline std::wstring to_wstring(const struct_type* s) { - return std::wstring(s->str, s->length); - } - static inline bool from_wstring(const std::wstring& str, struct_type* s) { - return cef_string_utf16_set(str.c_str(), str.length(), s, true) ? - true : false; - } -#endif // WCHAR_T_IS_UTF32 -#if defined(BUILDING_CEF_SHARED) - static inline string16 to_string16(const struct_type* s) { - return string16(s->str, s->length); - } - static inline bool from_string16(const string16& str, struct_type* s) { - return cef_string_utf16_set(str.c_str(), str.length(), s, true) ? - true : false; - } -#endif // BUILDING_CEF_SHARED -}; - -/// -// CEF string classes can convert between all supported string types. For -// example, the CefStringWide class uses wchar_t as the underlying character -// type and provides two approaches for converting data to/from a UTF8 string -// (std::string). -//

-// 1. Implicit conversion using the assignment operator overload. -//

-//   CefStringWide aCefString;
-//   std::string aUTF8String;
-//   aCefString = aUTF8String; // Assign std::string to CefStringWide
-//   aUTF8String = aCefString; // Assign CefStringWide to std::string
-// 
-// 2. Explicit conversion using the FromString/ToString methods. -//
-//   CefStringWide aCefString;
-//   std::string aUTF8String;
-//   aCefString.FromString(aUTF8String); // Assign std::string to CefStringWide
-//   aUTF8String = aCefString.ToString(); // Assign CefStringWide to std::string
-// 
-// Conversion will only occur if the assigned value is a different string type. -// Assigning a std::string to a CefStringUTF8, for example, will copy the data -// without performing a conversion. -//

-// CEF string classes are safe for reading from multiple threads but not for -// modification. It is the user's responsibility to provide synchronization if -// modifying CEF strings from multiple threads. -/// -template -class CefStringBase { - public: - typedef typename traits::char_type char_type; - typedef typename traits::struct_type struct_type; - typedef typename traits::userfree_struct_type userfree_struct_type; - - /// - // Default constructor. - /// - CefStringBase() : string_(NULL), owner_(false) {} - - /// - // Create a new string from an existing string. Data will always be copied. - /// - CefStringBase(const CefStringBase& str) - : string_(NULL), owner_(false) { - FromString(str.c_str(), str.length(), true); - } - - /// - // Create a new string from an existing std::string. Data will be always - // copied. Translation will occur if necessary based on the underlying string - // type. - /// - CefStringBase(const std::string& src) // NOLINT(runtime/explicit) - : string_(NULL), owner_(false) { - FromString(src); - } - CefStringBase(const char* src) // NOLINT(runtime/explicit) - : string_(NULL), owner_(false) { - if (src) - FromString(std::string(src)); - } - - /// - // Create a new string from an existing std::wstring. Data will be always - // copied. Translation will occur if necessary based on the underlying string - // type. - /// - CefStringBase(const std::wstring& src) // NOLINT(runtime/explicit) - : string_(NULL), owner_(false) { - FromWString(src); - } - CefStringBase(const wchar_t* src) // NOLINT(runtime/explicit) - : string_(NULL), owner_(false) { - if (src) - FromWString(std::wstring(src)); - } - -#if (defined(BUILDING_CEF_SHARED) && defined(WCHAR_T_IS_UTF32)) - /// - // Create a new string from an existing string16. Data will be always - // copied. Translation will occur if necessary based on the underlying string - // type. - /// - CefStringBase(const string16& src) // NOLINT(runtime/explicit) - : string_(NULL), owner_(false) { - FromString16(src); - } - CefStringBase(const char16* src) // NOLINT(runtime/explicit) - : string_(NULL), owner_(false) { - if (src) - FromString16(string16(src)); - } -#endif // BUILDING_CEF_SHARED && WCHAR_T_IS_UTF32 - - /// - // Create a new string from an existing character array. If |copy| is true - // this class will copy the data. Otherwise, this class will reference the - // existing data. Referenced data must exist for the lifetime of this class - // and will not be freed by this class. - /// - CefStringBase(const char_type* src, size_t src_len, bool copy) - : string_(NULL), owner_(false) { - if (src && src_len > 0) - FromString(src, src_len, copy); - } - - /// - // Create a new string referencing an existing string structure without taking - // ownership. Referenced structures must exist for the lifetime of this class - // and will not be freed by this class. - /// - CefStringBase(const struct_type* src) // NOLINT(runtime/explicit) - : string_(NULL), owner_(false) { - if (!src) - return; - // Reference the existing structure without taking ownership. - Attach(const_cast(src), false); - } - - virtual ~CefStringBase() { ClearAndFree(); } - - - // The following methods are named for compatibility with the standard library - // string template types. - - /// - // Return a read-only pointer to the string data. - /// - const char_type* c_str() const { return (string_ ? string_->str : NULL); } - - /// - // Return the length of the string data. - /// - size_t length() const { return (string_ ? string_->length : 0); } - - /// - // Return the length of the string data. - /// - inline size_t size() const { return length(); } - - /// - // Returns true if the string is empty. - /// - bool empty() const { return (string_ == NULL || string_->length == 0); } - - /// - // Compare this string to the specified string. - /// - int compare(const CefStringBase& str) const { - if (empty() && str.empty()) - return 0; - if (empty()) - return -1; - if (str.empty()) - return 1; - return traits::compare(string_, str.GetStruct()); - } - - /// - // Clear the string data. - /// - void clear() { - if (string_) - traits::clear(string_); - } - - - // The following methods are unique to CEF string template types. - - /// - // Returns true if this class owns the underlying string structure. - /// - bool IsOwner() const { return owner_; } - - /// - // Returns a read-only pointer to the underlying string structure. May return - // NULL if no structure is currently allocated. - /// - const struct_type* GetStruct() const { return string_; } - - /// - // Returns a writable pointer to the underlying string structure. Will never - // return NULL. - /// - struct_type* GetWritableStruct() { - AllocIfNeeded(); - return string_; - } - - /// - // Clear the state of this class. The underlying string structure and data - // will be freed if this class owns the structure. - /// - void ClearAndFree() { - if (!string_) - return; - if (owner_) { - clear(); - delete string_; - } - string_ = NULL; - owner_ = false; - } - - /// - // Attach to the specified string structure. If |owner| is true this class - // will take ownership of the structure. - /// - void Attach(struct_type* str, bool owner) { - // Free the previous structure and data, if any. - ClearAndFree(); - - string_ = str; - owner_ = owner; - } - - /// - // Take ownership of the specified userfree structure's string data. The - // userfree structure itself will be freed. Only use this method with userfree - // structures. - /// - void AttachToUserFree(userfree_struct_type str) { - // Free the previous structure and data, if any. - ClearAndFree(); - - if (!str) - return; - - AllocIfNeeded(); - owner_ = true; - memcpy(string_, str, sizeof(struct_type)); - - // Free the |str| structure but not the data. - memset(str, 0, sizeof(struct_type)); - traits::userfree_free(str); - } - - /// - // Detach from the underlying string structure. To avoid memory leaks only use - // this method if you already hold a pointer to the underlying string - // structure. - /// - void Detach() { - string_ = NULL; - owner_ = false; - } - - /// - // Create a userfree structure and give it ownership of this class' string - // data. This class will be disassociated from the data. May return NULL if - // this string class currently contains no data. - /// - userfree_struct_type DetachToUserFree() { - if (empty()) - return NULL; - - userfree_struct_type str = traits::userfree_alloc(); - memcpy(str, string_, sizeof(struct_type)); - - // Free this class' structure but not the data. - memset(string_, 0, sizeof(struct_type)); - ClearAndFree(); - - return str; - } - - /// - // Set this string's data to the specified character array. If |copy| is true - // this class will copy the data. Otherwise, this class will reference the - // existing data. Referenced data must exist for the lifetime of this class - // and will not be freed by this class. - /// - bool FromString(const char_type* src, size_t src_len, bool copy) { - if (src == NULL || src_len == 0) { - clear(); - return true; - } - AllocIfNeeded(); - return traits::set(src, src_len, string_, copy) ? true : false; - } - - /// - // Set this string's data from an existing ASCII string. Data will be always - // copied. Translation will occur if necessary based on the underlying string - // type. - /// - bool FromASCII(const char* str) { - size_t len = str ? strlen(str) : 0; - if (len == 0) { - clear(); - return true; - } - AllocIfNeeded(); - return traits::from_ascii(str, len, string_); - } - - /// - // Return this string's data as a std::string. Translation will occur if - // necessary based on the underlying string type. - /// - std::string ToString() const { - if (empty()) - return std::string(); - return traits::to_string(string_); - } - - /// - // Set this string's data from an existing std::string. Data will be always - // copied. Translation will occur if necessary based on the underlying string - // type. - /// - bool FromString(const std::string& str) { - if (str.empty()) { - clear(); - return true; - } - AllocIfNeeded(); - return traits::from_string(str, string_); - } - - /// - // Return this string's data as a std::wstring. Translation will occur if - // necessary based on the underlying string type. - /// - std::wstring ToWString() const { - if (empty()) - return std::wstring(); - return traits::to_wstring(string_); - } - - /// - // Set this string's data from an existing std::wstring. Data will be always - // copied. Translation will occur if necessary based on the underlying string - // type. - /// - bool FromWString(const std::wstring& str) { - if (str.empty()) { - clear(); - return true; - } - AllocIfNeeded(); - return traits::from_wstring(str, string_); - } -#if defined(BUILDING_CEF_SHARED) - /// - // Return this string's data as a string16. Translation will occur if - // necessary based on the underlying string type. - /// - string16 ToString16() const { - if (empty()) - return string16(); - return traits::to_string16(string_); - } - - /// - // Set this string's data from an existing string16. Data will be always - // copied. Translation will occur if necessary based on the underlying string - // type. - /// - bool FromString16(const string16& str) { - if (str.empty()) { - clear(); - return true; - } - AllocIfNeeded(); - return traits::from_string16(str, string_); - } -#endif // BUILDING_CEF_SHARED - - /// - // Comparison operator overloads. - /// - bool operator<(const CefStringBase& str) const { - return (compare(str) < 0); - } - bool operator<=(const CefStringBase& str) const { - return (compare(str) <= 0); - } - bool operator>(const CefStringBase& str) const { - return (compare(str) > 0); - } - bool operator>=(const CefStringBase& str) const { - return (compare(str) >= 0); - } - bool operator==(const CefStringBase& str) const { - return (compare(str) == 0); - } - bool operator!=(const CefStringBase& str) const { - return (compare(str) != 0); - } - - /// - // Assignment operator overloads. - /// - CefStringBase& operator=(const CefStringBase& str) { - FromString(str.c_str(), str.length(), true); - return *this; - } - operator std::string() const { - return ToString(); - } - CefStringBase& operator=(const std::string& str) { - FromString(str); - return *this; - } - CefStringBase& operator=(const char* str) { - FromString(std::string(str)); - return *this; - } - operator std::wstring() const { - return ToWString(); - } - CefStringBase& operator=(const std::wstring& str) { - FromWString(str); - return *this; - } - CefStringBase& operator=(const wchar_t* str) { - FromWString(std::wstring(str)); - return *this; - } -#if (defined(BUILDING_CEF_SHARED) && defined(WCHAR_T_IS_UTF32)) - operator string16() const { - return ToString16(); - } - CefStringBase& operator=(const string16& str) { - FromString16(str); - return *this; - } - CefStringBase& operator=(const char16* str) { - FromString16(string16(str)); - return *this; - } -#endif // BUILDING_CEF_SHARED && WCHAR_T_IS_UTF32 - - private: - // Allocate the string structure if it doesn't already exist. - void AllocIfNeeded() { - if (string_ == NULL) { - string_ = new struct_type; - memset(string_, 0, sizeof(struct_type)); - owner_ = true; - } - } - - struct_type* string_; - bool owner_; -}; - - -typedef CefStringBase CefStringWide; -typedef CefStringBase CefStringUTF8; -typedef CefStringBase CefStringUTF16; - -#endif // CEF_INCLUDE_INTERNAL_CEF_STRING_WRAPPERS_H_ diff --git a/cef1/include/internal/cef_time.h b/cef1/include/internal/cef_time.h deleted file mode 100644 index 64e601fe0..000000000 --- a/cef1/include/internal/cef_time.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - -#ifndef CEF_INCLUDE_INTERNAL_CEF_TIME_H_ -#define CEF_INCLUDE_INTERNAL_CEF_TIME_H_ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/internal/cef_export.h" -#include - -/// -// Time information. Values should always be in UTC. -/// -typedef struct _cef_time_t { - int year; // Four digit year "2007" - int month; // 1-based month (values 1 = January, etc.) - int day_of_week; // 0-based day of week (0 = Sunday, etc.) - int day_of_month; // 1-based day of month (1-31) - int hour; // Hour within the current day (0-23) - int minute; // Minute within the current hour (0-59) - int second; // Second within the current minute (0-59 plus leap - // seconds which may take it up to 60). - int millisecond; // Milliseconds within the current second (0-999) -} cef_time_t; - -/// -// Converts cef_time_t to/from time_t. Returns true (1) on success and false (0) -// on failure. -/// -CEF_EXPORT int cef_time_to_timet(const cef_time_t* cef_time, time_t* time); -CEF_EXPORT int cef_time_from_timet(time_t time, cef_time_t* cef_time); - -/// -// Converts cef_time_t to/from a double which is the number of seconds since -// epoch (Jan 1, 1970). Webkit uses this format to represent time. A value of 0 -// means "not initialized". Returns true (1) on success and false (0) on -// failure. -/// -CEF_EXPORT int cef_time_to_doublet(const cef_time_t* cef_time, double* time); -CEF_EXPORT int cef_time_from_doublet(double time, cef_time_t* cef_time); - -/// -// Retrieve the current system time. -// -CEF_EXPORT int cef_time_now(cef_time_t* cef_time); - -/// -// Retrieve the delta in milliseconds between two time values. -// -CEF_EXPORT int cef_time_delta(const cef_time_t* cef_time1, - const cef_time_t* cef_time2, - long long* delta); - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_INTERNAL_CEF_TIME_H_ diff --git a/cef1/include/internal/cef_tuple.h b/cef1/include/internal/cef_tuple.h deleted file mode 100644 index d9a1a2c96..000000000 --- a/cef1/include/internal/cef_tuple.h +++ /dev/null @@ -1,1082 +0,0 @@ -// Copyright (c) 2006-2011 Google 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: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// The contents of this file are identical to base/tuple.h - -// A Tuple is a generic templatized container, similar in concept to std::pair. -// There are classes Tuple0 to Tuple6, cooresponding to the number of elements -// it contains. The convenient MakeTuple() function takes 0 to 6 arguments, -// and will construct and return the appropriate Tuple object. The functions -// DispatchToMethod and DispatchToFunction take a function pointer or instance -// and method pointer, and unpack a tuple into arguments to the call. -// -// Tuple elements are copied by value, and stored in the tuple. See the unit -// tests for more details of how/when the values are copied. -// -// Example usage: -// // These two methods of creating a Tuple are identical. -// Tuple2 tuple_a(1, "wee"); -// Tuple2 tuple_b = MakeTuple(1, "wee"); -// -// void SomeFunc(int a, const char* b) { } -// DispatchToFunction(&SomeFunc, tuple_a); // SomeFunc(1, "wee") -// DispatchToFunction( -// &SomeFunc, MakeTuple(10, "foo")); // SomeFunc(10, "foo") -// -// struct { void SomeMeth(int a, int b, int c) { } } foo; -// DispatchToMethod(&foo, &Foo::SomeMeth, MakeTuple(1, 2, 3)); -// // foo->SomeMeth(1, 2, 3); - -#ifndef CEF_INCLUDE_INTERNAL_CEF_TUPLE_H_ -#define CEF_INCLUDE_INTERNAL_CEF_TUPLE_H_ -#pragma once - -#if defined(OS_CHROMEOS) -// To troubleshoot crosbug.com/7327. -#include "base/logging.h" -#endif -// Traits ---------------------------------------------------------------------- -// -// A simple traits class for tuple arguments. -// -// ValueType: the bare, nonref version of a type (same as the type for nonrefs). -// RefType: the ref version of a type (same as the type for refs). -// ParamType: what type to pass to functions (refs should not be constified). - -template -struct TupleTraits { - typedef P ValueType; - typedef P& RefType; - typedef const P& ParamType; -}; - -template -struct TupleTraits { - typedef P ValueType; - typedef P& RefType; - typedef P& ParamType; -}; - -template -struct TupleTypes { }; - -// Tuple ----------------------------------------------------------------------- -// -// This set of classes is useful for bundling 0 or more heterogeneous data types -// into a single variable. The advantage of this is that it greatly simplifies -// function objects that need to take an arbitrary number of parameters; see -// RunnableMethod and IPC::MessageWithTuple. -// -// Tuple0 is supplied to act as a 'void' type. It can be used, for example, -// when dispatching to a function that accepts no arguments (see the -// Dispatchers below). -// Tuple1 is rarely useful. One such use is when A is non-const ref that you -// want filled by the dispatchee, and the tuple is merely a container for that -// output (a "tier"). See MakeRefTuple and its usages. - -struct Tuple0 { - typedef Tuple0 ValueTuple; - typedef Tuple0 RefTuple; - typedef Tuple0 ParamTuple; -}; - -template -struct Tuple1 { - public: - typedef A TypeA; - - Tuple1() {} - explicit Tuple1(typename TupleTraits::ParamType a) : a(a) {} - - A a; -}; - -template -struct Tuple2 { - public: - typedef A TypeA; - typedef B TypeB; - - Tuple2() {} - Tuple2(typename TupleTraits::ParamType a, - typename TupleTraits::ParamType b) - : a(a), b(b) { - } - - A a; - B b; -}; - -template -struct Tuple3 { - public: - typedef A TypeA; - typedef B TypeB; - typedef C TypeC; - - Tuple3() {} - Tuple3(typename TupleTraits::ParamType a, - typename TupleTraits::ParamType b, - typename TupleTraits::ParamType c) - : a(a), b(b), c(c) { - } - - A a; - B b; - C c; -}; - -template -struct Tuple4 { - public: - typedef A TypeA; - typedef B TypeB; - typedef C TypeC; - typedef D TypeD; - - Tuple4() {} - Tuple4(typename TupleTraits::ParamType a, - typename TupleTraits::ParamType b, - typename TupleTraits::ParamType c, - typename TupleTraits::ParamType d) - : a(a), b(b), c(c), d(d) { - } - - A a; - B b; - C c; - D d; -}; - -template -struct Tuple5 { - public: - typedef A TypeA; - typedef B TypeB; - typedef C TypeC; - typedef D TypeD; - typedef E TypeE; - - Tuple5() {} - Tuple5(typename TupleTraits::ParamType a, - typename TupleTraits::ParamType b, - typename TupleTraits::ParamType c, - typename TupleTraits::ParamType d, - typename TupleTraits::ParamType e) - : a(a), b(b), c(c), d(d), e(e) { - } - - A a; - B b; - C c; - D d; - E e; -}; - -template -struct Tuple6 { - public: - typedef A TypeA; - typedef B TypeB; - typedef C TypeC; - typedef D TypeD; - typedef E TypeE; - typedef F TypeF; - - Tuple6() {} - Tuple6(typename TupleTraits::ParamType a, - typename TupleTraits::ParamType b, - typename TupleTraits::ParamType c, - typename TupleTraits::ParamType d, - typename TupleTraits::ParamType e, - typename TupleTraits::ParamType f) - : a(a), b(b), c(c), d(d), e(e), f(f) { - } - - A a; - B b; - C c; - D d; - E e; - F f; -}; - -template -struct Tuple7 { - public: - typedef A TypeA; - typedef B TypeB; - typedef C TypeC; - typedef D TypeD; - typedef E TypeE; - typedef F TypeF; - typedef G TypeG; - - Tuple7() {} - Tuple7(typename TupleTraits::ParamType a, - typename TupleTraits::ParamType b, - typename TupleTraits::ParamType c, - typename TupleTraits::ParamType d, - typename TupleTraits::ParamType e, - typename TupleTraits::ParamType f, - typename TupleTraits::ParamType g) - : a(a), b(b), c(c), d(d), e(e), f(f), g(g) { - } - - A a; - B b; - C c; - D d; - E e; - F f; - G g; -}; - -template -struct Tuple8 { - public: - typedef A TypeA; - typedef B TypeB; - typedef C TypeC; - typedef D TypeD; - typedef E TypeE; - typedef F TypeF; - typedef G TypeG; - typedef H TypeH; - - Tuple8() {} - Tuple8(typename TupleTraits::ParamType a, - typename TupleTraits::ParamType b, - typename TupleTraits::ParamType c, - typename TupleTraits::ParamType d, - typename TupleTraits::ParamType e, - typename TupleTraits::ParamType f, - typename TupleTraits::ParamType g, - typename TupleTraits::ParamType h) - : a(a), b(b), c(c), d(d), e(e), f(f), g(g), h(h) { - } - - A a; - B b; - C c; - D d; - E e; - F f; - G g; - H h; -}; - -// Tuple types ---------------------------------------------------------------- -// -// Allows for selection of ValueTuple/RefTuple/ParamTuple without needing the -// definitions of class types the tuple takes as parameters. - -template <> -struct TupleTypes< Tuple0 > { - typedef Tuple0 ValueTuple; - typedef Tuple0 RefTuple; - typedef Tuple0 ParamTuple; -}; - -template -struct TupleTypes< Tuple1 > { - typedef Tuple1::ValueType> ValueTuple; - typedef Tuple1::RefType> RefTuple; - typedef Tuple1::ParamType> ParamTuple; -}; - -template -struct TupleTypes< Tuple2 > { - typedef Tuple2::ValueType, - typename TupleTraits::ValueType> ValueTuple; -typedef Tuple2::RefType, - typename TupleTraits::RefType> RefTuple; - typedef Tuple2::ParamType, - typename TupleTraits::ParamType> ParamTuple; -}; - -template -struct TupleTypes< Tuple3 > { - typedef Tuple3::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType> ValueTuple; -typedef Tuple3::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType> RefTuple; - typedef Tuple3::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType> ParamTuple; -}; - -template -struct TupleTypes< Tuple4 > { - typedef Tuple4::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType> ValueTuple; -typedef Tuple4::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType> RefTuple; - typedef Tuple4::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType> ParamTuple; -}; - -template -struct TupleTypes< Tuple5 > { - typedef Tuple5::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType> ValueTuple; -typedef Tuple5::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType> RefTuple; - typedef Tuple5::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType> ParamTuple; -}; - -template -struct TupleTypes< Tuple6 > { - typedef Tuple6::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType> ValueTuple; -typedef Tuple6::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType> RefTuple; - typedef Tuple6::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType> ParamTuple; -}; - -template -struct TupleTypes< Tuple7 > { - typedef Tuple7::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType> ValueTuple; -typedef Tuple7::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType> RefTuple; - typedef Tuple7::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType> ParamTuple; -}; - -template -struct TupleTypes< Tuple8 > { - typedef Tuple8::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType, - typename TupleTraits::ValueType> ValueTuple; -typedef Tuple8::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType, - typename TupleTraits::RefType> RefTuple; - typedef Tuple8::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType, - typename TupleTraits::ParamType> ParamTuple; -}; - -// Tuple creators ------------------------------------------------------------- -// -// Helper functions for constructing tuples while inferring the template -// argument types. - -inline Tuple0 MakeTuple() { - return Tuple0(); -} - -template -inline Tuple1 MakeTuple(const A& a) { - return Tuple1(a); -} - -template -inline Tuple2 MakeTuple(const A& a, const B& b) { - return Tuple2(a, b); -} - -template -inline Tuple3 MakeTuple(const A& a, const B& b, const C& c) { - return Tuple3(a, b, c); -} - -template -inline Tuple4 MakeTuple(const A& a, const B& b, const C& c, - const D& d) { - return Tuple4(a, b, c, d); -} - -template -inline Tuple5 MakeTuple(const A& a, const B& b, const C& c, - const D& d, const E& e) { - return Tuple5(a, b, c, d, e); -} - -template -inline Tuple6 MakeTuple(const A& a, const B& b, const C& c, - const D& d, const E& e, const F& f) { - return Tuple6(a, b, c, d, e, f); -} - -template -inline Tuple7 MakeTuple(const A& a, const B& b, const C& c, - const D& d, const E& e, const F& f, - const G& g) { - return Tuple7(a, b, c, d, e, f, g); -} - -template -inline Tuple8 MakeTuple(const A& a, const B& b, - const C& c, const D& d, - const E& e, const F& f, - const G& g, const H& h) { - return Tuple8(a, b, c, d, e, f, g, h); -} - -// The following set of helpers make what Boost refers to as "Tiers" - a tuple -// of references. - -template -inline Tuple1 MakeRefTuple(A& a) { - return Tuple1(a); -} - -template -inline Tuple2 MakeRefTuple(A& a, B& b) { - return Tuple2(a, b); -} - -template -inline Tuple3 MakeRefTuple(A& a, B& b, C& c) { - return Tuple3(a, b, c); -} - -template -inline Tuple4 MakeRefTuple(A& a, B& b, C& c, D& d) { - return Tuple4(a, b, c, d); -} - -template -inline Tuple5 MakeRefTuple(A& a, B& b, C& c, D& d, E& e) { - return Tuple5(a, b, c, d, e); -} - -template -inline Tuple6 MakeRefTuple(A& a, B& b, C& c, D& d, E& e, - F& f) { - return Tuple6(a, b, c, d, e, f); -} - -template -inline Tuple7 MakeRefTuple(A& a, B& b, C& c, D& d, - E& e, F& f, G& g) { - return Tuple7(a, b, c, d, e, f, g); -} - -template -inline Tuple8 MakeRefTuple(A& a, B& b, C& c, - D& d, E& e, F& f, - G& g, H& h) { - return Tuple8(a, b, c, d, e, f, g, h); -} - -// Dispatchers ---------------------------------------------------------------- -// -// Helper functions that call the given method on an object, with the unpacked -// tuple arguments. Notice that they all have the same number of arguments, -// so you need only write: -// DispatchToMethod(object, &Object::method, args); -// This is very useful for templated dispatchers, since they don't need to know -// what type |args| is. - -// Non-Static Dispatchers with no out params. - -template -inline void DispatchToMethod(ObjT* obj, Method method, const Tuple0& arg) { - (obj->*method)(); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, const A& arg) { - (obj->*method)(arg); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, const Tuple1& arg) { -#if defined(OS_CHROMEOS) - // To troubleshoot crosbug.com/7327. - CHECK(obj); - CHECK(&arg); - CHECK(method); -#endif - (obj->*method)(arg.a); -} - -template -inline void DispatchToMethod(ObjT* obj, - Method method, - const Tuple2& arg) { - (obj->*method)(arg.a, arg.b); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple3& arg) { - (obj->*method)(arg.a, arg.b, arg.c); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple4& arg) { - (obj->*method)(arg.a, arg.b, arg.c, arg.d); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple5& arg) { - (obj->*method)(arg.a, arg.b, arg.c, arg.d, arg.e); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple6& arg) { - (obj->*method)(arg.a, arg.b, arg.c, arg.d, arg.e, arg.f); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple7& arg) { - (obj->*method)(arg.a, arg.b, arg.c, arg.d, arg.e, arg.f, arg.g); -} - -// Static Dispatchers with no out params. - -template -inline void DispatchToFunction(Function function, const Tuple0& arg) { - (*function)(); -} - -template -inline void DispatchToFunction(Function function, const A& arg) { - (*function)(arg); -} - -template -inline void DispatchToFunction(Function function, const Tuple1& arg) { - (*function)(arg.a); -} - -template -inline void DispatchToFunction(Function function, const Tuple2& arg) { - (*function)(arg.a, arg.b); -} - -template -inline void DispatchToFunction(Function function, const Tuple3& arg) { - (*function)(arg.a, arg.b, arg.c); -} - -template -inline void DispatchToFunction(Function function, - const Tuple4& arg) { - (*function)(arg.a, arg.b, arg.c, arg.d); -} - -template -inline void DispatchToFunction(Function function, - const Tuple5& arg) { - (*function)(arg.a, arg.b, arg.c, arg.d, arg.e); -} - -template -inline void DispatchToFunction(Function function, - const Tuple6& arg) { - (*function)(arg.a, arg.b, arg.c, arg.d, arg.e, arg.f); -} - -template -inline void DispatchToFunction(Function function, - const Tuple7& arg) { - (*function)(arg.a, arg.b, arg.c, arg.d, arg.e, arg.f, arg.g); -} - -template -inline void DispatchToFunction(Function function, - const Tuple8& arg) { - (*function)(arg.a, arg.b, arg.c, arg.d, arg.e, arg.f, arg.g, arg.h); -} - -// Dispatchers with 0 out param (as a Tuple0). - -template -inline void DispatchToMethod(ObjT* obj, - Method method, - const Tuple0& arg, Tuple0*) { - (obj->*method)(); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, const A& arg, Tuple0*) { - (obj->*method)(arg); -} - -template -inline void DispatchToMethod(ObjT* obj, - Method method, - const Tuple1& arg, Tuple0*) { - (obj->*method)(arg.a); -} - -template -inline void DispatchToMethod(ObjT* obj, - Method method, - const Tuple2& arg, Tuple0*) { - (obj->*method)(arg.a, arg.b); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple3& arg, Tuple0*) { - (obj->*method)(arg.a, arg.b, arg.c); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple4& arg, Tuple0*) { - (obj->*method)(arg.a, arg.b, arg.c, arg.d); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple5& arg, Tuple0*) { - (obj->*method)(arg.a, arg.b, arg.c, arg.d, arg.e); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple6& arg, Tuple0*) { - (obj->*method)(arg.a, arg.b, arg.c, arg.d, arg.e, arg.f); -} - -// Dispatchers with 1 out param. - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple0& in, - Tuple1* out) { - (obj->*method)(&out->a); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const InA& in, - Tuple1* out) { - (obj->*method)(in, &out->a); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple1& in, - Tuple1* out) { - (obj->*method)(in.a, &out->a); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple2& in, - Tuple1* out) { - (obj->*method)(in.a, in.b, &out->a); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple3& in, - Tuple1* out) { - (obj->*method)(in.a, in.b, in.c, &out->a); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple4& in, - Tuple1* out) { - (obj->*method)(in.a, in.b, in.c, in.d, &out->a); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple5& in, - Tuple1* out) { - (obj->*method)(in.a, in.b, in.c, in.d, in.e, &out->a); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple6& in, - Tuple1* out) { - (obj->*method)(in.a, in.b, in.c, in.d, in.e, in.f, &out->a); -} - -// Dispatchers with 2 out params. - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple0& in, - Tuple2* out) { - (obj->*method)(&out->a, &out->b); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const InA& in, - Tuple2* out) { - (obj->*method)(in, &out->a, &out->b); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple1& in, - Tuple2* out) { - (obj->*method)(in.a, &out->a, &out->b); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple2& in, - Tuple2* out) { - (obj->*method)(in.a, in.b, &out->a, &out->b); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple3& in, - Tuple2* out) { - (obj->*method)(in.a, in.b, in.c, &out->a, &out->b); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple4& in, - Tuple2* out) { - (obj->*method)(in.a, in.b, in.c, in.d, &out->a, &out->b); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple5& in, - Tuple2* out) { - (obj->*method)(in.a, in.b, in.c, in.d, in.e, &out->a, &out->b); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple6& in, - Tuple2* out) { - (obj->*method)(in.a, in.b, in.c, in.d, in.e, in.f, &out->a, &out->b); -} - -// Dispatchers with 3 out params. - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple0& in, - Tuple3* out) { - (obj->*method)(&out->a, &out->b, &out->c); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const InA& in, - Tuple3* out) { - (obj->*method)(in, &out->a, &out->b, &out->c); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple1& in, - Tuple3* out) { - (obj->*method)(in.a, &out->a, &out->b, &out->c); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple2& in, - Tuple3* out) { - (obj->*method)(in.a, in.b, &out->a, &out->b, &out->c); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple3& in, - Tuple3* out) { - (obj->*method)(in.a, in.b, in.c, &out->a, &out->b, &out->c); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple4& in, - Tuple3* out) { - (obj->*method)(in.a, in.b, in.c, in.d, &out->a, &out->b, &out->c); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple5& in, - Tuple3* out) { - (obj->*method)(in.a, in.b, in.c, in.d, in.e, &out->a, &out->b, &out->c); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple6& in, - Tuple3* out) { - (obj->*method)(in.a, in.b, in.c, in.d, in.e, in.f, &out->a, &out->b, &out->c); -} - -// Dispatchers with 4 out params. - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple0& in, - Tuple4* out) { - (obj->*method)(&out->a, &out->b, &out->c, &out->d); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const InA& in, - Tuple4* out) { - (obj->*method)(in, &out->a, &out->b, &out->c, &out->d); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple1& in, - Tuple4* out) { - (obj->*method)(in.a, &out->a, &out->b, &out->c, &out->d); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple2& in, - Tuple4* out) { - (obj->*method)(in.a, in.b, &out->a, &out->b, &out->c, &out->d); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple3& in, - Tuple4* out) { - (obj->*method)(in.a, in.b, in.c, &out->a, &out->b, &out->c, &out->d); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple4& in, - Tuple4* out) { - (obj->*method)(in.a, in.b, in.c, in.d, &out->a, &out->b, &out->c, &out->d); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple5& in, - Tuple4* out) { - (obj->*method)(in.a, in.b, in.c, in.d, in.e, - &out->a, &out->b, &out->c, &out->d); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple6& in, - Tuple4* out) { - (obj->*method)(in.a, in.b, in.c, in.d, in.e, in.f, - &out->a, &out->b, &out->c, &out->d); -} - -// Dispatchers with 5 out params. - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple0& in, - Tuple5* out) { - (obj->*method)(&out->a, &out->b, &out->c, &out->d, &out->e); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const InA& in, - Tuple5* out) { - (obj->*method)(in, &out->a, &out->b, &out->c, &out->d, &out->e); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple1& in, - Tuple5* out) { - (obj->*method)(in.a, &out->a, &out->b, &out->c, &out->d, &out->e); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple2& in, - Tuple5* out) { - (obj->*method)(in.a, in.b, &out->a, &out->b, &out->c, &out->d, &out->e); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple3& in, - Tuple5* out) { - (obj->*method)(in.a, in.b, in.c, &out->a, &out->b, &out->c, &out->d, &out->e); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple4& in, - Tuple5* out) { - (obj->*method)(in.a, in.b, in.c, in.d, &out->a, &out->b, &out->c, &out->d, - &out->e); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple5& in, - Tuple5* out) { - (obj->*method)(in.a, in.b, in.c, in.d, in.e, - &out->a, &out->b, &out->c, &out->d, &out->e); -} - -template -inline void DispatchToMethod(ObjT* obj, Method method, - const Tuple6& in, - Tuple5* out) { - (obj->*method)(in.a, in.b, in.c, in.d, in.e, in.f, - &out->a, &out->b, &out->c, &out->d, &out->e); -} - -#endif // CEF_INCLUDE_INTERNAL_CEF_TUPLE_H_ diff --git a/cef1/include/internal/cef_types.h b/cef1/include/internal/cef_types.h deleted file mode 100644 index 9adfe0d9d..000000000 --- a/cef1/include/internal/cef_types.h +++ /dev/null @@ -1,1205 +0,0 @@ -// Copyright (c) 2010 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - - -#ifndef CEF_INCLUDE_INTERNAL_CEF_TYPES_H_ -#define CEF_INCLUDE_INTERNAL_CEF_TYPES_H_ -#pragma once - -#include "include/internal/cef_build.h" -#include "include/internal/cef_string.h" -#include "include/internal/cef_string_list.h" -#include "include/internal/cef_time.h" - -// Bring in platform-specific definitions. -#if defined(OS_WIN) -#include "include/internal/cef_types_win.h" -#elif defined(OS_MACOSX) -#include "include/internal/cef_types_mac.h" -#elif defined(OS_LINUX) -#include "include/internal/cef_types_linux.h" -#endif - -#include // For size_t - -// The NSPR system headers define 64-bit as |long| when possible, except on -// Mac OS X. In order to not have typedef mismatches, we do the same on LP64. -// -// On Mac OS X, |long long| is used for 64-bit types for compatibility with -// format macros even in the LP64 model. -#if defined(__LP64__) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) -typedef long int64; // NOLINT(runtime/int) -typedef unsigned long uint64; // NOLINT(runtime/int) -#else -typedef long long int64; // NOLINT(runtime/int) -typedef unsigned long long uint64; // NOLINT(runtime/int) -#endif - -// TODO: Remove these type guards. These are to avoid conflicts with -// obsolete/protypes.h in the Gecko SDK. -#ifndef _INT32 -#define _INT32 -typedef int int32; -#endif - -// TODO: Remove these type guards. These are to avoid conflicts with -// obsolete/protypes.h in the Gecko SDK. -#ifndef _UINT32 -#define _UINT32 -typedef unsigned int uint32; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/// -// Log severity levels. -/// -enum cef_log_severity_t { - LOGSEVERITY_VERBOSE = -1, - LOGSEVERITY_INFO, - LOGSEVERITY_WARNING, - LOGSEVERITY_ERROR, - LOGSEVERITY_ERROR_REPORT, - // Disables logging completely. - LOGSEVERITY_DISABLE = 99 -}; - -/// -// Initialization settings. Specify NULL or 0 to get the recommended default -// values. -/// -typedef struct _cef_settings_t { - /// - // Size of this structure. - /// - size_t size; - - /// - // Set to true (1) to have the message loop run in a separate thread. If - // false (0) than the CefDoMessageLoopWork() function must be called from - // your application message loop. - /// - bool multi_threaded_message_loop; - - /// - // The location where cache data will be stored on disk. If empty an - // in-memory cache will be used. HTML5 databases such as localStorage will - // only persist across sessions if a cache path is specified. - /// - cef_string_t cache_path; - - /// - // Value that will be returned as the User-Agent HTTP header. If empty the - // default User-Agent string will be used. - /// - cef_string_t user_agent; - - /// - // Value that will be inserted as the product portion of the default - // User-Agent string. If empty the Chromium product version will be used. If - // |userAgent| is specified this value will be ignored. - /// - cef_string_t product_version; - - /// - // The locale string that will be passed to WebKit. If empty the default - // locale of "en-US" will be used. This value is ignored on Linux where locale - // is determined using environment variable parsing with the precedence order: - // LANGUAGE, LC_ALL, LC_MESSAGES and LANG. - /// - cef_string_t locale; - - /// - // List of fully qualified paths to plugins (including plugin name) that will - // be loaded in addition to any plugins found in the default search paths. - /// - cef_string_list_t extra_plugin_paths; - - /// - // The directory and file name to use for the debug log. If empty, the - // default name of "debug.log" will be used and the file will be written - // to the application directory. - /// - cef_string_t log_file; - - /// - // The log severity. Only messages of this severity level or higher will be - // logged. - /// - cef_log_severity_t log_severity; - - /// - // Enable DCHECK in release mode to ease debugging. - /// - bool release_dcheck_enabled; - - /// - // The graphics implementation that CEF will use for rendering GPU accelerated - // content like WebGL, accelerated layers and 3D CSS. - /// - cef_graphics_implementation_t graphics_implementation; - - /// - // Quota limit for localStorage data across all origins. Default size is 5MB. - /// - unsigned int local_storage_quota; - - /// - // Quota limit for sessionStorage data per namespace. Default size is 5MB. - /// - unsigned int session_storage_quota; - - /// - // Custom flags that will be used when initializing the V8 JavaScript engine. - // The consequences of using custom flags may not be well tested. - /// - cef_string_t javascript_flags; - -#if defined(OS_WIN) - /// - // Set to true (1) to use the system proxy resolver on Windows when - // "Automatically detect settings" is checked. This setting is disabled - // by default for performance reasons. - /// - bool auto_detect_proxy_settings_enabled; -#endif - - /// - // The fully qualified path for the resources directory. If this value is - // empty the chrome.pak and/or devtools_resources.pak files must be located in - // the module directory on Windows/Linux or the app bundle Resources directory - // on Mac OS X. - /// - cef_string_t resources_dir_path; - - /// - // The fully qualified path for the locales directory. If this value is empty - // the locales directory must be located in the module directory. This value - // is ignored on Mac OS X where pack files are always loaded from the app - // bundle Resources directory. - /// - cef_string_t locales_dir_path; - - /// - // Set to true (1) to disable loading of pack files for resources and locales. - // A resource bundle handler must be provided for the browser and renderer - // processes via CefApp::GetResourceBundleHandler() if loading of pack files - // is disabled. - /// - bool pack_loading_disabled; - - /// - // The number of stack trace frames to capture for uncaught exceptions. - // Specify a positive value to enable the CefV8ContextHandler:: - // OnUncaughtException() callback. Specify 0 (default value) and - // OnUncaughtException() will not be called. - /// - int uncaught_exception_stack_size; - - /// - // By default CEF V8 references will be invalidated (the IsValid() method will - // return false) after the owning context has been released. This reduces the - // need for external record keeping and avoids crashes due to the use of V8 - // references after the associated context has been released. - // - // CEF currently offers two context safety implementations with different - // performance characteristics. The default implementation (value of 0) uses a - // map of hash values and should provide better performance in situations with - // a small number contexts. The alternate implementation (value of 1) uses a - // hidden value attached to each context and should provide better performance - // in situations with a large number of contexts. - // - // If you need better performance in the creation of V8 references and you - // plan to manually track context lifespan you can disable context safety by - // specifying a value of -1. - /// - int context_safety_implementation; -} cef_settings_t; - -/// -// Browser initialization settings. Specify NULL or 0 to get the recommended -// default values. The consequences of using custom values may not be well -// tested. -/// -typedef struct _cef_browser_settings_t { - /// - // Size of this structure. - /// - size_t size; - - /// - // Disable drag & drop of URLs from other windows. - /// - bool drag_drop_disabled; - - /// - // Disable default navigation resulting from drag & drop of URLs. - /// - bool load_drops_disabled; - - /// - // Disable history back/forward navigation. - /// - bool history_disabled; - - /// - // The number of frames per second (fps) for animation and windowless - // rendering. When window rendering is enabled and the JavaScript - // requestAnimationFrame method is used the browser client area will be - // invalidated at the rate specified. When window rendering is disabled the - // CefRenderHandler::OnPaint() method will be called at the rate specified. - // This value must be between 0 and 90. Specify a value of zero for the - // default frame rate of 30 fps. Changing this value may affect display - // performance and/or CPU usage. - /// - int animation_frame_rate; - - // The below values map to WebPreferences settings. - - /// - // Font settings. - /// - cef_string_t standard_font_family; - cef_string_t fixed_font_family; - cef_string_t serif_font_family; - cef_string_t sans_serif_font_family; - cef_string_t cursive_font_family; - cef_string_t fantasy_font_family; - int default_font_size; - int default_fixed_font_size; - int minimum_font_size; - int minimum_logical_font_size; - - /// - // Set to true (1) to disable loading of fonts from remote sources. - /// - bool remote_fonts_disabled; - - /// - // Default encoding for Web content. If empty "ISO-8859-1" will be used. - /// - cef_string_t default_encoding; - - /// - // Set to true (1) to attempt automatic detection of content encoding. - /// - bool encoding_detector_enabled; - - /// - // Set to true (1) to disable JavaScript. - /// - bool javascript_disabled; - - /// - // Set to true (1) to disallow JavaScript from opening windows. - /// - bool javascript_open_windows_disallowed; - - /// - // Set to true (1) to disallow JavaScript from closing windows. - /// - bool javascript_close_windows_disallowed; - - /// - // Set to true (1) to disallow JavaScript from accessing the clipboard. - /// - bool javascript_access_clipboard_disallowed; - - /// - // Set to true (1) to disable DOM pasting in the editor. DOM pasting also - // depends on |javascript_cannot_access_clipboard| being false (0). - /// - bool dom_paste_disabled; - - /// - // Set to true (1) to enable drawing of the caret position. - /// - bool caret_browsing_enabled; - - /// - // Set to true (1) to disable Java. - /// - bool java_disabled; - - /// - // Set to true (1) to disable plugins. - /// - bool plugins_disabled; - - /// - // Set to true (1) to allow access to all URLs from file URLs. - /// - bool universal_access_from_file_urls_allowed; - - /// - // Set to true (1) to allow access to file URLs from other file URLs. - /// - bool file_access_from_file_urls_allowed; - - /// - // Set to true (1) to allow risky security behavior such as cross-site - // scripting (XSS). Use with extreme care. - /// - bool web_security_disabled; - - /// - // Set to true (1) to enable console warnings about XSS attempts. - /// - bool xss_auditor_enabled; - - /// - // Set to true (1) to suppress the network load of image URLs. A cached - // image will still be rendered if requested. - /// - bool image_load_disabled; - - /// - // Set to true (1) to shrink standalone images to fit the page. - /// - bool shrink_standalone_images_to_fit; - - /// - // Set to true (1) to disable browser backwards compatibility features. - /// - bool site_specific_quirks_disabled; - - /// - // Set to true (1) to disable resize of text areas. - /// - bool text_area_resize_disabled; - - /// - // Set to true (1) to disable use of the page cache. - /// - bool page_cache_disabled; - - /// - // Set to true (1) to not have the tab key advance focus to links. - /// - bool tab_to_links_disabled; - - /// - // Set to true (1) to disable hyperlink pings ( and window.sendPing). - /// - bool hyperlink_auditing_disabled; - - /// - // Set to true (1) to enable the user style sheet for all pages. - /// - bool user_style_sheet_enabled; - - /// - // Location of the user style sheet. This must be a data URL of the form - // "data:text/css;charset=utf-8;base64,csscontent" where "csscontent" is the - // base64 encoded contents of the CSS file. - /// - cef_string_t user_style_sheet_location; - - /// - // Set to true (1) to disable style sheets. - /// - bool author_and_user_styles_disabled; - - /// - // Set to true (1) to disable local storage. - /// - bool local_storage_disabled; - - /// - // Set to true (1) to disable databases. - /// - bool databases_disabled; - - /// - // Set to true (1) to disable application cache. - /// - bool application_cache_disabled; - - /// - // Set to true (1) to disable WebGL. - /// - bool webgl_disabled; - - /// - // Set to true (1) to enable accelerated compositing. This is turned off by - // default because the current in-process GPU implementation does not - // support it correctly. - /// - bool accelerated_compositing_enabled; - - /// - // Set to true (1) to disable accelerated layers. This affects features like - // 3D CSS transforms. - /// - bool accelerated_layers_disabled; - - /// - // Set to true (1) to disable accelerated video. - /// - bool accelerated_video_disabled; - - /// - // Set to true (1) to disable accelerated 2d canvas. - /// - bool accelerated_2d_canvas_disabled; - - /// - // Set to true (1) to disable accelerated filters. - /// - bool accelerated_filters_disabled; - - /// - // Set to true (1) to disable accelerated plugins. - /// - bool accelerated_plugins_disabled; - - /// - // Set to true (1) to enable fullscreen mode. - /// - bool fullscreen_enabled; -} cef_browser_settings_t; - -/// -// URL component parts. -/// -typedef struct _cef_urlparts_t { - /// - // The complete URL specification. - /// - cef_string_t spec; - - /// - // Scheme component not including the colon (e.g., "http"). - /// - cef_string_t scheme; - - /// - // User name component. - /// - cef_string_t username; - - /// - // Password component. - /// - cef_string_t password; - - /// - // Host component. This may be a hostname, an IPv4 address or an IPv6 literal - // surrounded by square brackets (e.g., "[2001:db8::1]"). - /// - cef_string_t host; - - /// - // Port number component. - /// - cef_string_t port; - - /// - // Path component including the first slash following the host. - /// - cef_string_t path; - - /// - // Query string component (i.e., everything following the '?'). - /// - cef_string_t query; -} cef_urlparts_t; - -/// -// Cookie information. -/// -typedef struct _cef_cookie_t { - /// - // The cookie name. - /// - cef_string_t name; - - /// - // The cookie value. - /// - cef_string_t value; - - /// - // If |domain| is empty a host cookie will be created instead of a domain - // cookie. Domain cookies are stored with a leading "." and are visible to - // sub-domains whereas host cookies are not. - /// - cef_string_t domain; - - /// - // If |path| is non-empty only URLs at or below the path will get the cookie - // value. - /// - cef_string_t path; - - /// - // If |secure| is true the cookie will only be sent for HTTPS requests. - /// - bool secure; - - /// - // If |httponly| is true the cookie will only be sent for HTTP requests. - /// - bool httponly; - - /// - // The cookie creation date. This is automatically populated by the system on - // cookie creation. - /// - cef_time_t creation; - - /// - // The cookie last access date. This is automatically populated by the system - // on access. - /// - cef_time_t last_access; - - /// - // The cookie expiration date is only valid if |has_expires| is true. - /// - bool has_expires; - cef_time_t expires; -} cef_cookie_t; - -/// -// Storage types. -/// -enum cef_storage_type_t { - ST_LOCALSTORAGE = 0, - ST_SESSIONSTORAGE, -}; - -/// -// Mouse button types. -/// -enum cef_mouse_button_type_t { - MBT_LEFT = 0, - MBT_MIDDLE, - MBT_RIGHT, -}; - -/// -// Key types. -/// -enum cef_key_type_t { - KT_KEYUP = 0, - KT_KEYDOWN, - KT_CHAR, -}; - -/// -// Various browser navigation types supported by chrome. -/// -enum cef_handler_navtype_t { - NAVTYPE_LINKCLICKED = 0, - NAVTYPE_FORMSUBMITTED, - NAVTYPE_BACKFORWARD, - NAVTYPE_RELOAD, - NAVTYPE_FORMRESUBMITTED, - NAVTYPE_OTHER, - NAVTYPE_LINKDROPPED, -}; - -/// -// Supported error code values. See net\base\net_error_list.h for complete -// descriptions of the error codes. -/// -enum cef_handler_errorcode_t { - ERR_FAILED = -2, - ERR_ABORTED = -3, - ERR_INVALID_ARGUMENT = -4, - ERR_INVALID_HANDLE = -5, - ERR_FILE_NOT_FOUND = -6, - ERR_TIMED_OUT = -7, - ERR_FILE_TOO_BIG = -8, - ERR_UNEXPECTED = -9, - ERR_ACCESS_DENIED = -10, - ERR_NOT_IMPLEMENTED = -11, - ERR_CONNECTION_CLOSED = -100, - ERR_CONNECTION_RESET = -101, - ERR_CONNECTION_REFUSED = -102, - ERR_CONNECTION_ABORTED = -103, - ERR_CONNECTION_FAILED = -104, - ERR_NAME_NOT_RESOLVED = -105, - ERR_INTERNET_DISCONNECTED = -106, - ERR_SSL_PROTOCOL_ERROR = -107, - ERR_ADDRESS_INVALID = -108, - ERR_ADDRESS_UNREACHABLE = -109, - ERR_SSL_CLIENT_AUTH_CERT_NEEDED = -110, - ERR_TUNNEL_CONNECTION_FAILED = -111, - ERR_NO_SSL_VERSIONS_ENABLED = -112, - ERR_SSL_VERSION_OR_CIPHER_MISMATCH = -113, - ERR_SSL_RENEGOTIATION_REQUESTED = -114, - ERR_CERT_COMMON_NAME_INVALID = -200, - ERR_CERT_DATE_INVALID = -201, - ERR_CERT_AUTHORITY_INVALID = -202, - ERR_CERT_CONTAINS_ERRORS = -203, - ERR_CERT_NO_REVOCATION_MECHANISM = -204, - ERR_CERT_UNABLE_TO_CHECK_REVOCATION = -205, - ERR_CERT_REVOKED = -206, - ERR_CERT_INVALID = -207, - ERR_CERT_END = -208, - ERR_INVALID_URL = -300, - ERR_DISALLOWED_URL_SCHEME = -301, - ERR_UNKNOWN_URL_SCHEME = -302, - ERR_TOO_MANY_REDIRECTS = -310, - ERR_UNSAFE_REDIRECT = -311, - ERR_UNSAFE_PORT = -312, - ERR_INVALID_RESPONSE = -320, - ERR_INVALID_CHUNKED_ENCODING = -321, - ERR_METHOD_NOT_SUPPORTED = -322, - ERR_UNEXPECTED_PROXY_AUTH = -323, - ERR_EMPTY_RESPONSE = -324, - ERR_RESPONSE_HEADERS_TOO_BIG = -325, - ERR_CACHE_MISS = -400, - ERR_INSECURE_RESPONSE = -501, -}; - -/// -// "Verb" of a drag-and-drop operation as negotiated between the source and -// destination. These constants match their equivalents in WebCore's -// DragActions.h and should not be renumbered. -/// -enum cef_drag_operations_mask_t { - DRAG_OPERATION_NONE = 0, - DRAG_OPERATION_COPY = 1, - DRAG_OPERATION_LINK = 2, - DRAG_OPERATION_GENERIC = 4, - DRAG_OPERATION_PRIVATE = 8, - DRAG_OPERATION_MOVE = 16, - DRAG_OPERATION_DELETE = 32, - DRAG_OPERATION_EVERY = UINT_MAX -}; - -/// -// V8 access control values. -/// -enum cef_v8_accesscontrol_t { - V8_ACCESS_CONTROL_DEFAULT = 0, - V8_ACCESS_CONTROL_ALL_CAN_READ = 1, - V8_ACCESS_CONTROL_ALL_CAN_WRITE = 1 << 1, - V8_ACCESS_CONTROL_PROHIBITS_OVERWRITING = 1 << 2 -}; - -/// -// V8 property attribute values. -/// -enum cef_v8_propertyattribute_t { - V8_PROPERTY_ATTRIBUTE_NONE = 0, // Writeable, Enumerable, - // Configurable - V8_PROPERTY_ATTRIBUTE_READONLY = 1 << 0, // Not writeable - V8_PROPERTY_ATTRIBUTE_DONTENUM = 1 << 1, // Not enumerable - V8_PROPERTY_ATTRIBUTE_DONTDELETE = 1 << 2 // Not configurable -}; - -/// -// Structure representing menu information. -/// -typedef struct _cef_menu_info_t { - /// - // Values from the cef_handler_menutypebits_t enumeration. - /// - int typeFlags; - - /// - // If window rendering is enabled |x| and |y| will be in screen coordinates. - // Otherwise, |x| and |y| will be in view coordinates. - /// - int x; - int y; - - cef_string_t linkUrl; - cef_string_t imageUrl; - cef_string_t pageUrl; - cef_string_t frameUrl; - cef_string_t selectionText; - cef_string_t misspelledWord; - - /// - // Values from the cef_handler_menucapabilitybits_t enumeration. - /// - int editFlags; - - cef_string_t securityInfo; -} cef_menu_info_t; - -/// -// The cef_menu_info_t typeFlags value will be a combination of the -// following values. -/// -enum cef_menu_typebits_t { - /// - // No node is selected - /// - MENUTYPE_NONE = 0x0, - /// - // The top page is selected - /// - MENUTYPE_PAGE = 0x1, - /// - // A subframe page is selected - /// - MENUTYPE_FRAME = 0x2, - /// - // A link is selected - /// - MENUTYPE_LINK = 0x4, - /// - // An image is selected - /// - MENUTYPE_IMAGE = 0x8, - /// - // There is a textual or mixed selection that is selected - /// - MENUTYPE_SELECTION = 0x10, - /// - // An editable element is selected - /// - MENUTYPE_EDITABLE = 0x20, - /// - // A misspelled word is selected - /// - MENUTYPE_MISSPELLED_WORD = 0x40, - /// - // A video node is selected - /// - MENUTYPE_VIDEO = 0x80, - /// - // A video node is selected - /// - MENUTYPE_AUDIO = 0x100, -}; - -/// -// The cef_menu_info_t editFlags value will be a combination of the -// following values. -/// -enum cef_menu_capabilitybits_t { - // Values from WebContextMenuData::EditFlags in WebContextMenuData.h - MENU_CAN_DO_NONE = 0x0, - MENU_CAN_UNDO = 0x1, - MENU_CAN_REDO = 0x2, - MENU_CAN_CUT = 0x4, - MENU_CAN_COPY = 0x8, - MENU_CAN_PASTE = 0x10, - MENU_CAN_DELETE = 0x20, - MENU_CAN_SELECT_ALL = 0x40, - MENU_CAN_TRANSLATE = 0x80, - // Values unique to CEF - MENU_CAN_GO_FORWARD = 0x10000000, - MENU_CAN_GO_BACK = 0x20000000, -}; - -/// -// Supported menu ID values. -/// -enum cef_menu_id_t { - MENU_ID_NAV_BACK = 10, - MENU_ID_NAV_FORWARD = 11, - MENU_ID_NAV_RELOAD = 12, - MENU_ID_NAV_RELOAD_NOCACHE = 13, - MENU_ID_NAV_STOP = 14, - MENU_ID_UNDO = 20, - MENU_ID_REDO = 21, - MENU_ID_CUT = 22, - MENU_ID_COPY = 23, - MENU_ID_PASTE = 24, - MENU_ID_DELETE = 25, - MENU_ID_SELECTALL = 26, - MENU_ID_PRINT = 30, - MENU_ID_VIEWSOURCE = 31, -}; - -enum cef_paint_element_type_t { - PET_VIEW = 0, - PET_POPUP, -}; - -/// -// Post data elements may represent either bytes or files. -/// -enum cef_postdataelement_type_t { - PDE_TYPE_EMPTY = 0, - PDE_TYPE_BYTES, - PDE_TYPE_FILE, -}; - -enum cef_weburlrequest_flags_t { - WUR_FLAG_NONE = 0, - WUR_FLAG_SKIP_CACHE = 0x1, - WUR_FLAG_ALLOW_CACHED_CREDENTIALS = 0x2, - WUR_FLAG_ALLOW_COOKIES = 0x4, - WUR_FLAG_REPORT_UPLOAD_PROGRESS = 0x8, - WUR_FLAG_REPORT_LOAD_TIMING = 0x10, - WUR_FLAG_REPORT_RAW_HEADERS = 0x20 -}; - -enum cef_weburlrequest_state_t { - WUR_STATE_UNSENT = 0, - WUR_STATE_STARTED = 1, - WUR_STATE_HEADERS_RECEIVED = 2, - WUR_STATE_LOADING = 3, - WUR_STATE_DONE = 4, - WUR_STATE_ERROR = 5, - WUR_STATE_ABORT = 6, -}; - -/// -// Focus sources. -/// -enum cef_handler_focus_source_t { - /// - // The source is explicit navigation via the API (LoadURL(), etc). - /// - FOCUS_SOURCE_NAVIGATION = 0, - /// - // The source is a system-generated focus event. - /// - FOCUS_SOURCE_SYSTEM, - /// - // The source is a child widget of the browser window requesting focus. - /// - FOCUS_SOURCE_WIDGET, -}; - -/// -// Key event types. -/// -enum cef_handler_keyevent_type_t { - KEYEVENT_RAWKEYDOWN = 0, - KEYEVENT_KEYDOWN, - KEYEVENT_KEYUP, - KEYEVENT_CHAR -}; - -/// -// Key event modifiers. -/// -enum cef_handler_keyevent_modifiers_t { - KEY_SHIFT = 1 << 0, - KEY_CTRL = 1 << 1, - KEY_ALT = 1 << 2, - KEY_META = 1 << 3, - KEY_KEYPAD = 1 << 4, // Only used on Mac OS-X -}; - -/// -// Structure representing a rectangle. -/// -typedef struct _cef_rect_t { - int x; - int y; - int width; - int height; -} cef_rect_t; - -/// -// Existing thread IDs. -/// -enum cef_thread_id_t { - TID_UI = 0, - TID_IO = 1, - TID_FILE = 2, -}; - -/// -// Paper type for printing. -/// -enum cef_paper_type_t { - PT_LETTER = 0, - PT_LEGAL, - PT_EXECUTIVE, - PT_A3, - PT_A4, - PT_CUSTOM -}; - -/// -// Paper metric information for printing. -/// -struct cef_paper_metrics { - enum cef_paper_type_t paper_type; - // Length and width needed if paper_type is custom_size - // Units are in inches. - double length; - double width; -}; - -/// -// Paper print margins. -/// -struct cef_print_margins { - // Margin size in inches for left/right/top/bottom (this is content margins). - double left; - double right; - double top; - double bottom; - // Margin size (top/bottom) in inches for header/footer. - double header; - double footer; -}; - -/// -// Page orientation for printing. -/// -enum cef_page_orientation { - PORTRAIT = 0, - LANDSCAPE -}; - -/// -// Printing options. -/// -typedef struct _cef_print_options_t { - enum cef_page_orientation page_orientation; - struct cef_paper_metrics paper_metrics; - struct cef_print_margins paper_margins; -} cef_print_options_t; - -/// -// Supported XML encoding types. The parser supports ASCII, ISO-8859-1, and -// UTF16 (LE and BE) by default. All other types must be translated to UTF8 -// before being passed to the parser. If a BOM is detected and the correct -// decoder is available then that decoder will be used automatically. -/// -enum cef_xml_encoding_type_t { - XML_ENCODING_NONE = 0, - XML_ENCODING_UTF8, - XML_ENCODING_UTF16LE, - XML_ENCODING_UTF16BE, - XML_ENCODING_ASCII, -}; - -/// -// XML node types. -/// -enum cef_xml_node_type_t { - XML_NODE_UNSUPPORTED = 0, - XML_NODE_PROCESSING_INSTRUCTION, - XML_NODE_DOCUMENT_TYPE, - XML_NODE_ELEMENT_START, - XML_NODE_ELEMENT_END, - XML_NODE_ATTRIBUTE, - XML_NODE_TEXT, - XML_NODE_CDATA, - XML_NODE_ENTITY_REFERENCE, - XML_NODE_WHITESPACE, - XML_NODE_COMMENT, -}; - -/// -// Status message types. -/// -enum cef_handler_statustype_t { - STATUSTYPE_TEXT = 0, - STATUSTYPE_MOUSEOVER_URL, - STATUSTYPE_KEYBOARD_FOCUS_URL, -}; - -/// -// Popup window features. -/// -typedef struct _cef_popup_features_t { - int x; - bool xSet; - int y; - bool ySet; - int width; - bool widthSet; - int height; - bool heightSet; - - bool menuBarVisible; - bool statusBarVisible; - bool toolBarVisible; - bool locationBarVisible; - bool scrollbarsVisible; - bool resizable; - - bool fullscreen; - bool dialog; - cef_string_list_t additionalFeatures; -} cef_popup_features_t; - -/// -// DOM document types. -/// -enum cef_dom_document_type_t { - DOM_DOCUMENT_TYPE_UNKNOWN = 0, - DOM_DOCUMENT_TYPE_HTML, - DOM_DOCUMENT_TYPE_XHTML, - DOM_DOCUMENT_TYPE_PLUGIN, -}; - -/// -// DOM event category flags. -/// -enum cef_dom_event_category_t { - DOM_EVENT_CATEGORY_UNKNOWN = 0x0, - DOM_EVENT_CATEGORY_UI = 0x1, - DOM_EVENT_CATEGORY_MOUSE = 0x2, - DOM_EVENT_CATEGORY_MUTATION = 0x4, - DOM_EVENT_CATEGORY_KEYBOARD = 0x8, - DOM_EVENT_CATEGORY_TEXT = 0x10, - DOM_EVENT_CATEGORY_COMPOSITION = 0x20, - DOM_EVENT_CATEGORY_DRAG = 0x40, - DOM_EVENT_CATEGORY_CLIPBOARD = 0x80, - DOM_EVENT_CATEGORY_MESSAGE = 0x100, - DOM_EVENT_CATEGORY_WHEEL = 0x200, - DOM_EVENT_CATEGORY_BEFORE_TEXT_INSERTED = 0x400, - DOM_EVENT_CATEGORY_OVERFLOW = 0x800, - DOM_EVENT_CATEGORY_PAGE_TRANSITION = 0x1000, - DOM_EVENT_CATEGORY_POPSTATE = 0x2000, - DOM_EVENT_CATEGORY_PROGRESS = 0x4000, - DOM_EVENT_CATEGORY_XMLHTTPREQUEST_PROGRESS = 0x8000, - DOM_EVENT_CATEGORY_BEFORE_LOAD = 0x10000, -}; - -/// -// DOM event processing phases. -/// -enum cef_dom_event_phase_t { - DOM_EVENT_PHASE_UNKNOWN = 0, - DOM_EVENT_PHASE_CAPTURING, - DOM_EVENT_PHASE_AT_TARGET, - DOM_EVENT_PHASE_BUBBLING, -}; - -/// -// DOM node types. -/// -enum cef_dom_node_type_t { - DOM_NODE_TYPE_UNSUPPORTED = 0, - DOM_NODE_TYPE_ELEMENT, - DOM_NODE_TYPE_ATTRIBUTE, - DOM_NODE_TYPE_TEXT, - DOM_NODE_TYPE_CDATA_SECTION, - DOM_NODE_TYPE_ENTITY_REFERENCE, - DOM_NODE_TYPE_ENTITY, - DOM_NODE_TYPE_PROCESSING_INSTRUCTIONS, - DOM_NODE_TYPE_COMMENT, - DOM_NODE_TYPE_DOCUMENT, - DOM_NODE_TYPE_DOCUMENT_TYPE, - DOM_NODE_TYPE_DOCUMENT_FRAGMENT, - DOM_NODE_TYPE_NOTATION, - DOM_NODE_TYPE_XPATH_NAMESPACE, -}; - -/// -// Proxy types. -/// -enum cef_proxy_type_t { - CEF_PROXY_TYPE_DIRECT = 0, - CEF_PROXY_TYPE_NAMED, - CEF_PROXY_TYPE_PAC_STRING, -}; - -/// -// Proxy information. -/// -typedef struct _cef_proxy_info_t { - enum cef_proxy_type_t proxyType; - cef_string_t proxyList; -} cef_proxy_info_t; - -/// -// Geoposition error codes. -/// -enum cef_geoposition_error_code_t { - GEOPOSITON_ERROR_NONE = 0, - GEOPOSITON_ERROR_PERMISSION_DENIED, - GEOPOSITON_ERROR_POSITION_UNAVAILABLE, - GEOPOSITON_ERROR_TIMEOUT, -}; - -/// -// Structure representing geoposition information. The properties of this -// structure correspond to those of the JavaScript Position object although -// their types may differ. -/// -typedef struct _cef_geoposition_t { - /// - // Latitude in decimal degrees north (WGS84 coordinate frame). - /// - double latitude; - - /// - // Longitude in decimal degrees west (WGS84 coordinate frame). - /// - double longitude; - - /// - // Altitude in meters (above WGS84 datum). - /// - double altitude; - - /// - // Accuracy of horizontal position in meters. - /// - double accuracy; - - /// - // Accuracy of altitude in meters. - /// - double altitude_accuracy; - - /// - // Heading in decimal degrees clockwise from true north. - /// - double heading; - - /// - // Horizontal component of device velocity in meters per second. - /// - double speed; - - /// - // Time of position measurement in miliseconds since Epoch in UTC time. This - // is taken from the host computer's system clock. - /// - cef_time_t timestamp; - - /// - // Error code, see enum above. - /// - cef_geoposition_error_code_t error_code; - - /// - // Human-readable error message. - /// - cef_string_t error_message; -} cef_geoposition_t; - -#ifdef __cplusplus -} -#endif - -#endif // CEF_INCLUDE_INTERNAL_CEF_TYPES_H_ diff --git a/cef1/include/internal/cef_types_linux.h b/cef1/include/internal/cef_types_linux.h deleted file mode 100644 index 15966907e..000000000 --- a/cef1/include/internal/cef_types_linux.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2010 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - - -#ifndef CEF_INCLUDE_INTERNAL_CEF_TYPES_LINUX_H_ -#define CEF_INCLUDE_INTERNAL_CEF_TYPES_LINUX_H_ -#pragma once - -#include "include/internal/cef_build.h" - -#if defined(OS_LINUX) -#include -#include "include/internal/cef_string.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// Window handle. -#define cef_window_handle_t GtkWidget* -#define cef_cursor_handle_t void* - -/// -// Supported graphics implementations. -/// -enum cef_graphics_implementation_t { - DESKTOP_IN_PROCESS = 0, - DESKTOP_IN_PROCESS_COMMAND_BUFFER, -}; - -/// -// Class representing window information. -/// -typedef struct _cef_window_info_t { - // Pointer for the parent GtkBox widget. - cef_window_handle_t m_ParentWidget; - - // Pointer for the new browser widget. - cef_window_handle_t m_Widget; -} cef_window_info_t; - -/// -// Class representing print context information. -/// -typedef struct _cef_print_info_t { - double m_Scale; -} cef_print_info_t; - -/// -// Class representing key information. -/// -typedef struct _cef_key_info_t { - int key; -} cef_key_info_t; - -#ifdef __cplusplus -} -#endif - -#endif // OS_LINUX - -#endif // CEF_INCLUDE_INTERNAL_CEF_TYPES_LINUX_H_ diff --git a/cef1/include/internal/cef_types_mac.h b/cef1/include/internal/cef_types_mac.h deleted file mode 100644 index a10c54016..000000000 --- a/cef1/include/internal/cef_types_mac.h +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) 2010 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - - -#ifndef CEF_INCLUDE_INTERNAL_CEF_TYPES_MAC_H_ -#define CEF_INCLUDE_INTERNAL_CEF_TYPES_MAC_H_ -#pragma once - -#include "include/internal/cef_build.h" - -#if defined(OS_MACOSX) -#include "include/internal/cef_string.h" - -// Window handle. -#ifdef __cplusplus -#ifdef __OBJC__ -@class NSCursor; -@class NSView; -#else -class NSCursor; -struct NSView; -#endif -#define cef_window_handle_t NSView* -#define cef_cursor_handle_t NSCursor* -#else -#define cef_window_handle_t void* -#define cef_cursor_handle_t void* -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/// -// Supported graphics implementations. -/// -enum cef_graphics_implementation_t { - DESKTOP_IN_PROCESS = 0, - DESKTOP_IN_PROCESS_COMMAND_BUFFER, -}; - -/// -// Class representing window information. -/// -typedef struct _cef_window_info_t { - cef_string_t m_windowName; - int m_x; - int m_y; - int m_nWidth; - int m_nHeight; - int m_bHidden; - - // NSView pointer for the parent view. - cef_window_handle_t m_ParentView; - - // If window rendering is disabled no browser window will be created. Set - // |m_ParentView| to the window that will act as the parent for popup menus, - // dialog boxes, etc. - int m_bWindowRenderingDisabled; - - // Set to true to enable transparent painting. - int m_bTransparentPainting; - - // NSView pointer for the new browser view. - cef_window_handle_t m_View; -} cef_window_info_t; - -/// -// Class representing print context information. -/// -typedef struct _cef_print_info_t { - double m_Scale; -} cef_print_info_t; - -/// -// Class representing key information. -/// -typedef struct _cef_key_info_t { - int keyCode; - int character; - int characterNoModifiers; -} cef_key_info_t; - -#ifdef __cplusplus -} -#endif - -#endif // OS_MACOSX - -#endif // CEF_INCLUDE_INTERNAL_CEF_TYPES_MAC_H_ diff --git a/cef1/include/internal/cef_types_win.h b/cef1/include/internal/cef_types_win.h deleted file mode 100644 index 9b5e48e59..000000000 --- a/cef1/include/internal/cef_types_win.h +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) 2009 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - - -#ifndef CEF_INCLUDE_INTERNAL_CEF_TYPES_WIN_H_ -#define CEF_INCLUDE_INTERNAL_CEF_TYPES_WIN_H_ -#pragma once - -#include "include/internal/cef_build.h" - -#if defined(OS_WIN) -#include -#include "include/internal/cef_string.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// Window handle. -#define cef_window_handle_t HWND -#define cef_cursor_handle_t HCURSOR - -/// -// Supported graphics implementations. -/// -enum cef_graphics_implementation_t { - ANGLE_IN_PROCESS = 0, - ANGLE_IN_PROCESS_COMMAND_BUFFER, - DESKTOP_IN_PROCESS, - DESKTOP_IN_PROCESS_COMMAND_BUFFER, -}; - -/// -// Class representing window information. -/// -typedef struct _cef_window_info_t { - // Standard parameters required by CreateWindowEx() - DWORD m_dwExStyle; - cef_string_t m_windowName; - DWORD m_dwStyle; - int m_x; - int m_y; - int m_nWidth; - int m_nHeight; - cef_window_handle_t m_hWndParent; - HMENU m_hMenu; - - // If window rendering is disabled no browser window will be created. Set - // |m_hWndParent| to the window that will act as the parent for popup menus, - // dialog boxes, etc. - BOOL m_bWindowRenderingDisabled; - - // Set to true to enable transparent painting. - BOOL m_bTransparentPainting; - - // Handle for the new browser window. - cef_window_handle_t m_hWnd; -} cef_window_info_t; - -/// -// Class representing print context information. -/// -typedef struct _cef_print_info_t { - HDC m_hDC; - RECT m_Rect; - double m_Scale; -} cef_print_info_t; - -/// -// Class representing key information. -/// -typedef struct _cef_key_info_t { - int key; - BOOL sysChar; - BOOL imeChar; -} cef_key_info_t; - -#ifdef __cplusplus -} -#endif - -#endif // OS_WIN - -#endif // CEF_INCLUDE_INTERNAL_CEF_TYPES_WIN_H_ diff --git a/cef1/include/internal/cef_types_wrappers.h b/cef1/include/internal/cef_types_wrappers.h deleted file mode 100644 index 8668237df..000000000 --- a/cef1/include/internal/cef_types_wrappers.h +++ /dev/null @@ -1,686 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - -#ifndef CEF_INCLUDE_INTERNAL_CEF_TYPES_WRAPPERS_H_ -#define CEF_INCLUDE_INTERNAL_CEF_TYPES_WRAPPERS_H_ -#pragma once - -#include "include/internal/cef_string.h" -#include "include/internal/cef_string_list.h" -#include "include/internal/cef_types.h" - -/// -// Template class that provides common functionality for CEF structure wrapping. -/// -template -class CefStructBase : public traits::struct_type { - public: - typedef typename traits::struct_type struct_type; - - CefStructBase() : attached_to_(NULL) { - Init(); - } - virtual ~CefStructBase() { - // Only clear this object's data if it isn't currently attached to a - // structure. - if (!attached_to_) - Clear(this); - } - - CefStructBase(const CefStructBase& r) { - Init(); - *this = r; - } - CefStructBase(const struct_type& r) { // NOLINT(runtime/explicit) - Init(); - *this = r; - } - - /// - // Clear this object's values. - /// - void Reset() { - Clear(this); - Init(); - } - - /// - // Attach to the source structure's existing values. DetachTo() can be called - // to insert the values back into the existing structure. - /// - void AttachTo(struct_type& source) { - // Only clear this object's data if it isn't currently attached to a - // structure. - if (!attached_to_) - Clear(this); - - // This object is now attached to the new structure. - attached_to_ = &source; - - // Transfer ownership of the values from the source structure. - memcpy(static_cast(this), &source, sizeof(struct_type)); - } - - /// - // Relinquish ownership of values to the target structure. - /// - void DetachTo(struct_type& target) { - if (attached_to_ != &target) { - // Clear the target structure's values only if we are not currently - // attached to that structure. - Clear(&target); - } - - // Transfer ownership of the values to the target structure. - memcpy(&target, static_cast(this), sizeof(struct_type)); - - // Remove the references from this object. - Init(); - } - - /// - // Set this object's values. If |copy| is true the source structure's values - // will be copied instead of referenced. - /// - void Set(const struct_type& source, bool copy) { - traits::set(&source, this, copy); - } - - CefStructBase& operator=(const CefStructBase& s) { - return operator=(static_cast(s)); - } - - CefStructBase& operator=(const struct_type& s) { - Set(s, true); - return *this; - } - - protected: - void Init() { - memset(static_cast(this), 0, sizeof(struct_type)); - attached_to_ = NULL; - traits::init(this); - } - - static void Clear(struct_type* s) { traits::clear(s); } - - struct_type* attached_to_; -}; - - -struct CefRectTraits { - typedef cef_rect_t struct_type; - - static inline void init(struct_type* s) {} - static inline void clear(struct_type* s) {} - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - *target = *src; - } -}; - -/// -// Class representing a rectangle. -/// -class CefRect : public CefStructBase { - public: - typedef CefStructBase parent; - - CefRect() : parent() {} - CefRect(const cef_rect_t& r) : parent(r) {} // NOLINT(runtime/explicit) - CefRect(const CefRect& r) : parent(r) {} // NOLINT(runtime/explicit) - CefRect(int x, int y, int width, int height) : parent() { - Set(x, y, width, height); - } - - bool IsEmpty() const { return width <= 0 || height <= 0; } - void Set(int x, int y, int width, int height) { - this->x = x, this->y = y, this->width = width, this->height = height; - } -}; - -inline bool operator==(const CefRect& a, const CefRect& b) { - return a.x == b.x && a.y == b.y && a.width == b.width && a.height == b.height; -} - -inline bool operator!=(const CefRect& a, const CefRect& b) { - return !(a == b); -} - - -struct CefPrintOptionsTraits { - typedef cef_print_options_t struct_type; - - static inline void init(struct_type* s) {} - static inline void clear(struct_type* s) {} - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - *target = *src; - } -}; - -/// -// Class representing print options. -/// -typedef CefStructBase CefPrintOptions; - - - -struct CefPopupFeaturesTraits { - typedef cef_popup_features_t struct_type; - - static inline void init(struct_type* s) { - s->menuBarVisible = true; - s->statusBarVisible = true; - s->toolBarVisible = true; - s->locationBarVisible = true; - s->scrollbarsVisible = true; - s->resizable = true; - } - - static inline void clear(struct_type* s) { - if (s->additionalFeatures) - cef_string_list_free(s->additionalFeatures); - } - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - if (target->additionalFeatures) - cef_string_list_free(target->additionalFeatures); - target->additionalFeatures = src->additionalFeatures ? - cef_string_list_copy(src->additionalFeatures) : NULL; - - target->x = src->x; - target->xSet = src->xSet; - target->y = src->y; - target->ySet = src->ySet; - target->width = src->width; - target->widthSet = src->widthSet; - target->height = src->height; - target->heightSet = src->heightSet; - target->menuBarVisible = src->menuBarVisible; - target->statusBarVisible = src->statusBarVisible; - target->toolBarVisible = src->toolBarVisible; - target->locationBarVisible = src->locationBarVisible; - target->scrollbarsVisible = src->scrollbarsVisible; - target->resizable = src->resizable; - target->fullscreen = src->fullscreen; - target->dialog = src->dialog; - } -}; - -/// -// Class representing popup window features. -/// -typedef CefStructBase CefPopupFeatures; - - -struct CefSettingsTraits { - typedef cef_settings_t struct_type; - - static inline void init(struct_type* s) { - s->size = sizeof(struct_type); - } - - static inline void clear(struct_type* s) { - cef_string_clear(&s->cache_path); - cef_string_clear(&s->user_agent); - cef_string_clear(&s->product_version); - cef_string_clear(&s->locale); - if (s->extra_plugin_paths) - cef_string_list_free(s->extra_plugin_paths); - cef_string_clear(&s->log_file); - cef_string_clear(&s->javascript_flags); - cef_string_clear(&s->resources_dir_path); - cef_string_clear(&s->locales_dir_path); - } - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->multi_threaded_message_loop = src->multi_threaded_message_loop; - - cef_string_set(src->cache_path.str, src->cache_path.length, - &target->cache_path, copy); - cef_string_set(src->user_agent.str, src->user_agent.length, - &target->user_agent, copy); - cef_string_set(src->product_version.str, src->product_version.length, - &target->product_version, copy); - cef_string_set(src->locale.str, src->locale.length, &target->locale, copy); - - if (target->extra_plugin_paths) - cef_string_list_free(target->extra_plugin_paths); - target->extra_plugin_paths = src->extra_plugin_paths ? - cef_string_list_copy(src->extra_plugin_paths) : NULL; - - cef_string_set(src->log_file.str, src->log_file.length, &target->log_file, - copy); - target->log_severity = src->log_severity; - target->release_dcheck_enabled = src->release_dcheck_enabled; - target->graphics_implementation = src->graphics_implementation; - target->local_storage_quota = src->local_storage_quota; - target->session_storage_quota = src->session_storage_quota; - cef_string_set(src->javascript_flags.str, src->javascript_flags.length, - &target->javascript_flags, copy); - -#if defined(OS_WIN) - target->auto_detect_proxy_settings_enabled = - src->auto_detect_proxy_settings_enabled; -#endif - - cef_string_set(src->resources_dir_path.str, src->resources_dir_path.length, - &target->resources_dir_path, copy); - cef_string_set(src->locales_dir_path.str, src->locales_dir_path.length, - &target->locales_dir_path, copy); - target->pack_loading_disabled = src->pack_loading_disabled; - target->uncaught_exception_stack_size = src->uncaught_exception_stack_size; - target->context_safety_implementation = src->context_safety_implementation; - } -}; - -/// -// Class representing initialization settings. -/// -typedef CefStructBase CefSettings; - - -struct CefBrowserSettingsTraits { - typedef cef_browser_settings_t struct_type; - - static inline void init(struct_type* s) { - s->size = sizeof(struct_type); - } - - static inline void clear(struct_type* s) { - cef_string_clear(&s->standard_font_family); - cef_string_clear(&s->fixed_font_family); - cef_string_clear(&s->serif_font_family); - cef_string_clear(&s->sans_serif_font_family); - cef_string_clear(&s->cursive_font_family); - cef_string_clear(&s->fantasy_font_family); - cef_string_clear(&s->default_encoding); - cef_string_clear(&s->user_style_sheet_location); - } - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->drag_drop_disabled = src->drag_drop_disabled; - target->load_drops_disabled = src->load_drops_disabled; - target->history_disabled = src->history_disabled; - target->animation_frame_rate = src->animation_frame_rate; - - cef_string_set(src->standard_font_family.str, - src->standard_font_family.length, &target->standard_font_family, copy); - cef_string_set(src->fixed_font_family.str, src->fixed_font_family.length, - &target->fixed_font_family, copy); - cef_string_set(src->serif_font_family.str, src->serif_font_family.length, - &target->serif_font_family, copy); - cef_string_set(src->sans_serif_font_family.str, - src->sans_serif_font_family.length, &target->sans_serif_font_family, - copy); - cef_string_set(src->cursive_font_family.str, - src->cursive_font_family.length, &target->cursive_font_family, copy); - cef_string_set(src->fantasy_font_family.str, - src->fantasy_font_family.length, &target->fantasy_font_family, copy); - - target->default_font_size = src->default_font_size; - target->default_fixed_font_size = src->default_fixed_font_size; - target->minimum_font_size = src->minimum_font_size; - target->minimum_logical_font_size = src->minimum_logical_font_size; - target->remote_fonts_disabled = src->remote_fonts_disabled; - - cef_string_set(src->default_encoding.str, src->default_encoding.length, - &target->default_encoding, copy); - - target->encoding_detector_enabled = src->encoding_detector_enabled; - target->javascript_disabled = src->javascript_disabled; - target->javascript_open_windows_disallowed = - src->javascript_open_windows_disallowed; - target->javascript_close_windows_disallowed = - src->javascript_close_windows_disallowed; - target->javascript_access_clipboard_disallowed = - src->javascript_access_clipboard_disallowed; - target->dom_paste_disabled = src->dom_paste_disabled; - target->caret_browsing_enabled = src->caret_browsing_enabled; - target->java_disabled = src->java_disabled; - target->plugins_disabled = src->plugins_disabled; - target->universal_access_from_file_urls_allowed = - src->universal_access_from_file_urls_allowed; - target->file_access_from_file_urls_allowed = - src->file_access_from_file_urls_allowed; - target->web_security_disabled = src->web_security_disabled; - target->xss_auditor_enabled = src->xss_auditor_enabled; - target->image_load_disabled = src->image_load_disabled; - target->shrink_standalone_images_to_fit = - src->shrink_standalone_images_to_fit; - target->site_specific_quirks_disabled = src->site_specific_quirks_disabled; - target->text_area_resize_disabled = src->text_area_resize_disabled; - target->page_cache_disabled = src->page_cache_disabled; - target->tab_to_links_disabled = src->tab_to_links_disabled; - target->hyperlink_auditing_disabled = src->hyperlink_auditing_disabled; - target->user_style_sheet_enabled = src->user_style_sheet_enabled; - - cef_string_set(src->user_style_sheet_location.str, - src->user_style_sheet_location.length, - &target->user_style_sheet_location, copy); - - target->author_and_user_styles_disabled = - src->author_and_user_styles_disabled; - target->local_storage_disabled = src->local_storage_disabled; - target->databases_disabled = src->databases_disabled; - target->application_cache_disabled = src->application_cache_disabled; - target->webgl_disabled = src->webgl_disabled; - target->accelerated_compositing_enabled = - src->accelerated_compositing_enabled; - target->accelerated_layers_disabled = src->accelerated_layers_disabled; - target->accelerated_video_disabled = src->accelerated_video_disabled; - target->accelerated_2d_canvas_disabled = - src->accelerated_2d_canvas_disabled; - target->accelerated_filters_disabled = src->accelerated_filters_disabled; - target->accelerated_plugins_disabled = src->accelerated_plugins_disabled; - target->fullscreen_enabled = src->fullscreen_enabled; - } -}; - -/// -// Class representing browser initialization settings. -/// -typedef CefStructBase CefBrowserSettings; - - -struct CefURLPartsTraits { - typedef cef_urlparts_t struct_type; - - static inline void init(struct_type* s) {} - - static inline void clear(struct_type* s) { - cef_string_clear(&s->spec); - cef_string_clear(&s->scheme); - cef_string_clear(&s->username); - cef_string_clear(&s->password); - cef_string_clear(&s->host); - cef_string_clear(&s->port); - cef_string_clear(&s->path); - cef_string_clear(&s->query); - } - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - cef_string_set(src->spec.str, src->spec.length, &target->spec, copy); - cef_string_set(src->scheme.str, src->scheme.length, &target->scheme, copy); - cef_string_set(src->username.str, src->username.length, &target->username, - copy); - cef_string_set(src->password.str, src->password.length, &target->password, - copy); - cef_string_set(src->host.str, src->host.length, &target->host, copy); - cef_string_set(src->port.str, src->port.length, &target->port, copy); - cef_string_set(src->path.str, src->path.length, &target->path, copy); - cef_string_set(src->query.str, src->query.length, &target->query, copy); - } -}; - -/// -// Class representing a URL's component parts. -/// -typedef CefStructBase CefURLParts; - - -struct CefTimeTraits { - typedef cef_time_t struct_type; - - static inline void init(struct_type* s) {} - - static inline void clear(struct_type* s) {} - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - *target = *src; - } -}; - -/// -// Class representing a time. -/// -class CefTime : public CefStructBase { - public: - typedef CefStructBase parent; - - CefTime() : parent() {} - CefTime(const cef_time_t& r) : parent(r) {} // NOLINT(runtime/explicit) - CefTime(const CefTime& r) : parent(r) {} // NOLINT(runtime/explicit) - explicit CefTime(time_t r) : parent() { SetTimeT(r); } - explicit CefTime(double r) : parent() { SetDoubleT(r); } - - // Converts to/from time_t. - void SetTimeT(time_t r) { - cef_time_from_timet(r, this); - } - time_t GetTimeT() const { - time_t time = 0; - cef_time_to_timet(this, &time); - return time; - } - - // Converts to/from a double which is the number of seconds since epoch - // (Jan 1, 1970). Webkit uses this format to represent time. A value of 0 - // means "not initialized". - void SetDoubleT(double r) { - cef_time_from_doublet(r, this); - } - double GetDoubleT() const { - double time = 0; - cef_time_to_doublet(this, &time); - return time; - } - - // Set this object to now. - void Now() { - cef_time_now(this); - } - - // Return the delta between this object and |other| in milliseconds. - long long Delta(const CefTime& other) { - long long delta = 0; - cef_time_delta(this, &other, &delta); - return delta; - } -}; - - -struct CefCookieTraits { - typedef cef_cookie_t struct_type; - - static inline void init(struct_type* s) {} - - static inline void clear(struct_type* s) { - cef_string_clear(&s->name); - cef_string_clear(&s->value); - cef_string_clear(&s->domain); - cef_string_clear(&s->path); - } - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - cef_string_set(src->name.str, src->name.length, &target->name, copy); - cef_string_set(src->value.str, src->value.length, &target->value, copy); - cef_string_set(src->domain.str, src->domain.length, &target->domain, copy); - cef_string_set(src->path.str, src->path.length, &target->path, copy); - target->secure = src->secure; - target->httponly = src->httponly; - target->creation = src->creation; - target->last_access = src->last_access; - target->has_expires = src->has_expires; - target->expires = src->expires; - } -}; - -/// -// Class representing a cookie. -/// -typedef CefStructBase CefCookie; - - -struct CefMenuInfoTraits { - typedef cef_menu_info_t struct_type; - - static inline void init(struct_type* s) {} - - static inline void clear(struct_type* s) { - cef_string_clear(&s->linkUrl); - cef_string_clear(&s->imageUrl); - cef_string_clear(&s->pageUrl); - cef_string_clear(&s->frameUrl); - cef_string_clear(&s->selectionText); - cef_string_clear(&s->misspelledWord); - cef_string_clear(&s->securityInfo); - } - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->typeFlags = src->typeFlags; - target->x = src->x; - target->y = src->y; - - cef_string_set(src->linkUrl.str, src->linkUrl.length, - &target->linkUrl, copy); - cef_string_set(src->imageUrl.str, src->imageUrl.length, - &target->imageUrl, copy); - cef_string_set(src->pageUrl.str, src->pageUrl.length, - &target->pageUrl, copy); - cef_string_set(src->frameUrl.str, src->frameUrl.length, - &target->frameUrl, copy); - cef_string_set(src->selectionText.str, src->selectionText.length, - &target->selectionText, copy); - cef_string_set(src->misspelledWord.str, src->misspelledWord.length, - &target->misspelledWord, copy); - cef_string_set(src->securityInfo.str, src->securityInfo.length, - &target->securityInfo, copy); - - target->editFlags = src->editFlags; - } -}; - -/// -// Class representing menu info. -/// -typedef CefStructBase CefMenuInfo; - - -struct CefProxyInfoTraits { - typedef cef_proxy_info_t struct_type; - - static inline void init(struct_type* s) {} - - static inline void clear(struct_type* s) { - cef_string_clear(&s->proxyList); - } - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->proxyType = src->proxyType; - cef_string_set(src->proxyList.str, src->proxyList.length, - &target->proxyList, copy); - } -}; - -/// -// Class representing the results of proxy resolution. -/// -class CefProxyInfo : public CefStructBase { - public: - /// - // Use a direction connection instead of a proxy. - /// - void UseDirect() { - proxyType = CEF_PROXY_TYPE_DIRECT; - } - - /// - // Use one or more named proxy servers specified in WinHTTP format. Each proxy - // server is of the form: - // - // ["://"][":"] - // - // Multiple values may be separated by semicolons or whitespace. For example, - // "foo1:80;foo2:80". - /// - void UseNamedProxy(const CefString& proxy_uri_list) { - proxyType = CEF_PROXY_TYPE_NAMED; - (CefString(&proxyList)) = proxy_uri_list; - } - - /// - // Use one or more named proxy servers specified in PAC script format. For - // example, "PROXY foobar:99; SOCKS fml:2; DIRECT". - /// - void UsePacString(const CefString& pac_string) { - proxyType = CEF_PROXY_TYPE_PAC_STRING; - (CefString(&proxyList)) = pac_string; - } - - bool IsDirect() const { return proxyType == CEF_PROXY_TYPE_DIRECT; } - bool IsNamedProxy() const { return proxyType == CEF_PROXY_TYPE_NAMED; } - bool IsPacString() const { return proxyType == CEF_PROXY_TYPE_PAC_STRING; } - - CefString ProxyList() const { return CefString(&proxyList); } -}; - - -struct CefGeopositionTraits { - typedef cef_geoposition_t struct_type; - - static inline void init(struct_type* s) {} - - static inline void clear(struct_type* s) { - cef_string_clear(&s->error_message); - } - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->latitude = src->latitude; - target->longitude = src->longitude; - target->altitude = src->altitude; - target->accuracy = src->accuracy; - target->altitude_accuracy = src->altitude_accuracy; - target->heading = src->heading; - target->speed = src->speed; - target->timestamp = src->timestamp; - target->error_code = src->error_code; - cef_string_set(src->error_message.str, src->error_message.length, - &target->error_message, copy); - } -}; - -/// -// Class representing a geoposition. -/// -typedef CefStructBase CefGeoposition; - -#endif // CEF_INCLUDE_INTERNAL_CEF_TYPES_WRAPPERS_H_ diff --git a/cef1/include/internal/cef_win.h b/cef1/include/internal/cef_win.h deleted file mode 100644 index 68d91dced..000000000 --- a/cef1/include/internal/cef_win.h +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright (c) 2008 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. - - -#ifndef CEF_INCLUDE_INTERNAL_CEF_WIN_H_ -#define CEF_INCLUDE_INTERNAL_CEF_WIN_H_ -#pragma once - -#if defined(OS_WIN) -#include -#include "include/internal/cef_types_win.h" -#include "include/internal/cef_types_wrappers.h" - -/// -// Atomic increment and decrement. -/// -#define CefAtomicIncrement(p) InterlockedIncrement(p) -#define CefAtomicDecrement(p) InterlockedDecrement(p) - -/// -// Critical section wrapper. -/// -class CefCriticalSection { - public: - CefCriticalSection() { - memset(&m_sec, 0, sizeof(CRITICAL_SECTION)); - InitializeCriticalSection(&m_sec); - } - virtual ~CefCriticalSection() { - DeleteCriticalSection(&m_sec); - } - void Lock() { - EnterCriticalSection(&m_sec); - } - void Unlock() { - LeaveCriticalSection(&m_sec); - } - - CRITICAL_SECTION m_sec; -}; - -/// -// Handle types. -/// -#define CefWindowHandle cef_window_handle_t -#define CefCursorHandle cef_cursor_handle_t - -struct CefWindowInfoTraits { - typedef cef_window_info_t struct_type; - - static inline void init(struct_type* s) {} - - static inline void clear(struct_type* s) { - cef_string_clear(&s->m_windowName); - } - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->m_dwExStyle = src->m_dwExStyle; - cef_string_set(src->m_windowName.str, src->m_windowName.length, - &target->m_windowName, copy); - target->m_dwStyle = src->m_dwStyle; - target->m_x = src->m_x; - target->m_y = src->m_y; - target->m_nWidth = src->m_nWidth; - target->m_nHeight = src->m_nHeight; - target->m_hWndParent = src->m_hWndParent; - target->m_hMenu = src->m_hMenu; - target->m_bWindowRenderingDisabled = src->m_bWindowRenderingDisabled; - target->m_bTransparentPainting = src->m_bTransparentPainting; - target->m_hWnd = src->m_hWnd; - } -}; - -/// -// Class representing window information. -/// -class CefWindowInfo : public CefStructBase { - public: - typedef CefStructBase parent; - - CefWindowInfo() : parent() {} - explicit CefWindowInfo(const cef_window_info_t& r) : parent(r) {} - explicit CefWindowInfo(const CefWindowInfo& r) : parent(r) {} - - void SetAsChild(HWND hWndParent, RECT windowRect) { - m_dwStyle = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_TABSTOP | - WS_VISIBLE; - m_hWndParent = hWndParent; - m_x = windowRect.left; - m_y = windowRect.top; - m_nWidth = windowRect.right - windowRect.left; - m_nHeight = windowRect.bottom - windowRect.top; - } - - void SetAsPopup(HWND hWndParent, const CefString& windowName) { - m_dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | - WS_VISIBLE; - m_hWndParent = hWndParent; - m_x = CW_USEDEFAULT; - m_y = CW_USEDEFAULT; - m_nWidth = CW_USEDEFAULT; - m_nHeight = CW_USEDEFAULT; - - cef_string_copy(windowName.c_str(), windowName.length(), &m_windowName); - } - - void SetAsOffScreen(HWND hWndParent) { - m_bWindowRenderingDisabled = TRUE; - m_hWndParent = hWndParent; - } - - void SetTransparentPainting(BOOL transparentPainting) { - m_bTransparentPainting = transparentPainting; - } -}; - - -struct CefPrintInfoTraits { - typedef cef_print_info_t struct_type; - - static inline void init(struct_type* s) {} - static inline void clear(struct_type* s) {} - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->m_hDC = src->m_hDC; - target->m_Rect = src->m_Rect; - target->m_Scale = src->m_Scale; - } -}; - -/// -// Class representing print context information. -/// -typedef CefStructBase CefPrintInfo; - - -struct CefKeyInfoTraits { - typedef cef_key_info_t struct_type; - - static inline void init(struct_type* s) {} - static inline void clear(struct_type* s) {} - - static inline void set(const struct_type* src, struct_type* target, - bool copy) { - target->key = src->key; - target->sysChar = src->sysChar; - target->imeChar = src->imeChar; - } -}; - -/// -// Class representing key information. -/// -typedef CefStructBase CefKeyInfo; - -#endif // OS_WIN - -#endif // CEF_INCLUDE_INTERNAL_CEF_WIN_H_ diff --git a/cef1/include/wrapper/cef_byte_read_handler.h b/cef1/include/wrapper/cef_byte_read_handler.h deleted file mode 100644 index f7ca7a15a..000000000 --- a/cef1/include/wrapper/cef_byte_read_handler.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file are only available to applications that link -// against the libcef_dll_wrapper target. -// - -#ifndef CEF_INCLUDE_WRAPPER_CEF_BYTE_READ_HANDLER_H_ -#define CEF_INCLUDE_WRAPPER_CEF_BYTE_READ_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_stream.h" - -/// -// Thread safe implementation of the CefReadHandler class for reading an -// in-memory array of bytes. -/// -class CefByteReadHandler : public CefReadHandler { - public: - /// - // Create a new object for reading an array of bytes. An optional |source| - // reference can be kept to keep the underlying data source from being - // released while the reader exists. - /// - CefByteReadHandler(const unsigned char* bytes, size_t size, - CefRefPtr source); - - /// - // Read raw binary data. - /// - virtual size_t Read(void* ptr, size_t size, size_t n); - - /// - // Seek to the specified offset position. |whence| may be any one of - // SEEK_CUR, SEEK_END or SEEK_SET. - /// - virtual int Seek(int64 offset, int whence); - - /// - // Return the current offset position. - /// - virtual int64 Tell(); - - /// - // Return non-zero if at end of file. - /// - virtual int Eof(); - - private: - const unsigned char* bytes_; - int64 size_; - int64 offset_; - CefRefPtr source_; - - IMPLEMENT_REFCOUNTING(CefByteReadHandler); - IMPLEMENT_LOCKING(CefByteReadHandler); -}; - -#endif // CEF_INCLUDE_WRAPPER_CEF_BYTE_READ_HANDLER_H_ diff --git a/cef1/include/wrapper/cef_xml_object.h b/cef1/include/wrapper/cef_xml_object.h deleted file mode 100644 index d9f706fde..000000000 --- a/cef1/include/wrapper/cef_xml_object.h +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file are only available to applications that link -// against the libcef_dll_wrapper target. -// - -#ifndef CEF_INCLUDE_WRAPPER_CEF_XML_OBJECT_H_ -#define CEF_INCLUDE_WRAPPER_CEF_XML_OBJECT_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/cef_xml_reader.h" -#include -#include - -class CefStreamReader; - -/// -// Thread safe class for representing XML data as a structured object. This -// class should not be used with large XML documents because all data will be -// resident in memory at the same time. This implementation supports a -// restricted set of XML features: -//
-// (1) Processing instructions, whitespace and comments are ignored.
-// (2) Elements and attributes must always be referenced using the fully
-//     qualified name (ie, namespace:localname).
-// (3) Empty elements () and elements with zero-length values ()
-//     are considered the same.
-// (4) Element nodes are considered part of a value if:
-//     (a) The element node follows a non-element node at the same depth
-//         (see 5), or
-//     (b) The element node does not have a namespace and the parent node does.
-// (5) Mixed node types at the same depth are combined into a single element
-//     value as follows:
-//     (a) All node values are concatenated to form a single string value.
-//     (b) Entity reference nodes are resolved to the corresponding entity
-//         value.
-//     (c) Element nodes are represented by their outer XML string.
-// 
-/// -class CefXmlObject : public CefBase { - public: - typedef std::vector > ObjectVector; - typedef std::map AttributeMap; - - /// - // Create a new object with the specified name. An object name must always be - // at least one character long. - /// - explicit CefXmlObject(const CefString& name); - virtual ~CefXmlObject(); - - /// - // Load the contents of the specified XML stream into this object. The - // existing children and attributes, if any, will first be cleared. - /// - bool Load(CefRefPtr stream, - CefXmlReader::EncodingType encodingType, - const CefString& URI, CefString* loadError); - - /// - // Set the name, children and attributes of this object to a duplicate of the - // specified object's contents. The existing children and attributes, if any, - // will first be cleared. - /// - void Set(CefRefPtr object); - - /// - // Append a duplicate of the children and attributes of the specified object - // to this object. If |overwriteAttributes| is true then any attributes in - // this object that also exist in the specified object will be overwritten - // with the new values. The name of this object is not changed. - /// - void Append(CefRefPtr object, bool overwriteAttributes); - - /// - // Return a new object with the same name, children and attributes as this - // object. The parent of the new object will be NULL. - /// - CefRefPtr Duplicate(); - - /// - // Clears this object's children and attributes. The name and parenting of - // this object are not changed. - /// - void Clear(); - - /// - // Access the object's name. An object name must always be at least one - // character long. - /// - CefString GetName(); - bool SetName(const CefString& name); - - /// - // Access the object's parent. The parent can be NULL if this object has not - // been added as the child on another object. - /// - bool HasParent(); - CefRefPtr GetParent(); - - /// - // Access the object's value. An object cannot have a value if it also has - // children. Attempting to set the value while children exist will fail. - /// - bool HasValue(); - CefString GetValue(); - bool SetValue(const CefString& value); - - /// - // Access the object's attributes. Attributes must have unique names. - /// - bool HasAttributes(); - size_t GetAttributeCount(); - bool HasAttribute(const CefString& name); - CefString GetAttributeValue(const CefString& name); - bool SetAttributeValue(const CefString& name, const CefString& value); - size_t GetAttributes(AttributeMap& attributes); - void ClearAttributes(); - - /// - // Access the object's children. Each object can only have one parent so - // attempting to add an object that already has a parent will fail. Removing a - // child will set the child's parent to NULL. Adding a child will set the - // child's parent to this object. This object's value, if any, will be cleared - // if a child is added. - /// - bool HasChildren(); - size_t GetChildCount(); - bool HasChild(CefRefPtr child); - bool AddChild(CefRefPtr child); - bool RemoveChild(CefRefPtr child); - size_t GetChildren(ObjectVector& children); - void ClearChildren(); - - /// - // Find the first child with the specified name. - /// - CefRefPtr FindChild(const CefString& name); - - /// - // Find all children with the specified name. - /// - size_t FindChildren(const CefString& name, ObjectVector& children); - - private: - void SetParent(CefXmlObject* parent); - - CefString name_; - CefXmlObject* parent_; - CefString value_; - AttributeMap attributes_; - ObjectVector children_; - - IMPLEMENT_REFCOUNTING(CefXmlObject); - IMPLEMENT_LOCKING(CefXmlObject); -}; - -#endif // CEF_INCLUDE_WRAPPER_CEF_XML_OBJECT_H_ diff --git a/cef1/include/wrapper/cef_zip_archive.h b/cef1/include/wrapper/cef_zip_archive.h deleted file mode 100644 index b58dbca01..000000000 --- a/cef1/include/wrapper/cef_zip_archive.h +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// The contents of this file are only available to applications that link -// against the libcef_dll_wrapper target. -// - -#ifndef CEF_INCLUDE_WRAPPER_CEF_ZIP_ARCHIVE_H_ -#define CEF_INCLUDE_WRAPPER_CEF_ZIP_ARCHIVE_H_ -#pragma once - -#include "include/cef_base.h" -#include - -class CefStreamReader; - -/// -// Thread-safe class for accessing zip archive file contents. This class should -// not be used with large archive files because all data will be resident in -// memory at the same time. This implementation supports a restricted set of zip -// archive features: -// (1) Password-protected files are not supported. -// (2) All file names are stored and compared in lower case. -// (3) File ordering from the original zip archive is not maintained. This -// means that files from the same folder may not be located together in the -// file content map. -/// -class CefZipArchive : public CefBase { - public: - /// - // Class representing a file in the archive. Accessing the file data from - // multiple threads is safe provided a reference to the File object is kept. - /// - class File : public CefBase { - public: - /// - // Returns the read-only data contained in the file. - /// - virtual const unsigned char* GetData() =0; - - /// - // Returns the size of the data in the file. - /// - virtual size_t GetDataSize() =0; - - /// - // Returns a CefStreamReader object for streaming the contents of the file. - /// - virtual CefRefPtr GetStreamReader() =0; - }; - typedef std::map > FileMap; - - /// - // Create a new object. - /// - CefZipArchive(); - virtual ~CefZipArchive(); - - /// - // Load the contents of the specified zip archive stream into this object. - // If |overwriteExisting| is true then any files in this object that also - // exist in the specified archive will be replaced with the new files. - // Returns the number of files successfully loaded. - /// - size_t Load(CefRefPtr stream, bool overwriteExisting); - - /// - // Clears the contents of this object. - /// - void Clear(); - - /// - // Returns the number of files in the archive. - /// - size_t GetFileCount(); - - /// - // Returns true if the specified file exists and has contents. - /// - bool HasFile(const CefString& fileName); - - /// - // Returns the specified file. - /// - CefRefPtr GetFile(const CefString& fileName); - - /// - // Removes the specified file. - /// - bool RemoveFile(const CefString& fileName); - - /// - // Returns the map of all files. - /// - size_t GetFiles(FileMap& map); - - private: - FileMap contents_; - - IMPLEMENT_REFCOUNTING(CefZipArchive); - IMPLEMENT_LOCKING(CefZipArchive); -}; - -#endif // CEF_INCLUDE_WRAPPER_CEF_ZIP_ARCHIVE_H_ diff --git a/cef1/libcef/browser_appcache_system.cc b/cef1/libcef/browser_appcache_system.cc deleted file mode 100644 index 7cbcedffe..000000000 --- a/cef1/libcef/browser_appcache_system.cc +++ /dev/null @@ -1,464 +0,0 @@ -// Copyright (c) 2011 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 "libcef/browser_appcache_system.h" -#include "libcef/browser_resource_loader_bridge.h" - -#include -#include - -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/callback.h" -#include "base/synchronization/waitable_event.h" -#include "webkit/appcache/appcache_interceptor.h" -#include "webkit/appcache/web_application_cache_host_impl.h" - -using WebKit::WebApplicationCacheHost; -using WebKit::WebApplicationCacheHostClient; -using appcache::WebApplicationCacheHostImpl; -using appcache::AppCacheBackendImpl; -using appcache::AppCacheInterceptor; - -// BrowserFrontendProxy -------------------------------------------------------- -// Proxies method calls from the backend IO thread to the frontend UI thread. - -class BrowserFrontendProxy - : public base::RefCountedThreadSafe, - public appcache::AppCacheFrontend { - public: - explicit BrowserFrontendProxy(BrowserAppCacheSystem* appcache_system) - : system_(appcache_system) { - } - - void clear_appcache_system() { system_ = NULL; } - - virtual void OnCacheSelected(int host_id, - const appcache::AppCacheInfo& info) OVERRIDE { - if (!system_) - return; - if (system_->is_io_thread()) { - system_->ui_message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserFrontendProxy::OnCacheSelected, this, host_id, - info)); - } else if (system_->is_ui_thread()) { - system_->frontend_impl_.OnCacheSelected(host_id, info); - } else { - NOTREACHED(); - } - } - - virtual void OnStatusChanged(const std::vector& host_ids, - appcache::Status status) OVERRIDE { - if (!system_) - return; - if (system_->is_io_thread()) - system_->ui_message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserFrontendProxy::OnStatusChanged, this, host_ids, - status)); - else if (system_->is_ui_thread()) - system_->frontend_impl_.OnStatusChanged(host_ids, status); - else - NOTREACHED(); - } - - virtual void OnEventRaised(const std::vector& host_ids, - appcache::EventID event_id) OVERRIDE { - if (!system_) - return; - if (system_->is_io_thread()) - system_->ui_message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserFrontendProxy::OnEventRaised, this, host_ids, - event_id)); - else if (system_->is_ui_thread()) - system_->frontend_impl_.OnEventRaised(host_ids, event_id); - else - NOTREACHED(); - } - - virtual void OnProgressEventRaised(const std::vector& host_ids, - const GURL& url, - int num_total, int num_complete) OVERRIDE { - if (!system_) - return; - if (system_->is_io_thread()) - system_->ui_message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserFrontendProxy::OnProgressEventRaised, this, - host_ids, url, num_total, num_complete)); - else if (system_->is_ui_thread()) - system_->frontend_impl_.OnProgressEventRaised( - host_ids, url, num_total, num_complete); - else - NOTREACHED(); - } - - virtual void OnErrorEventRaised(const std::vector& host_ids, - const std::string& message) OVERRIDE { - if (!system_) - return; - if (system_->is_io_thread()) - system_->ui_message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserFrontendProxy::OnErrorEventRaised, this, host_ids, - message)); - else if (system_->is_ui_thread()) - system_->frontend_impl_.OnErrorEventRaised( - host_ids, message); - else - NOTREACHED(); - } - - virtual void OnLogMessage(int host_id, - appcache::LogLevel log_level, - const std::string& message) OVERRIDE { - if (!system_) - return; - if (system_->is_io_thread()) - system_->ui_message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserFrontendProxy::OnLogMessage, this, host_id, - log_level, message)); - else if (system_->is_ui_thread()) - system_->frontend_impl_.OnLogMessage( - host_id, log_level, message); - else - NOTREACHED(); - } - - virtual void OnContentBlocked(int host_id, - const GURL& manifest_url) OVERRIDE {} - - private: - friend class base::RefCountedThreadSafe; - - virtual ~BrowserFrontendProxy() {} - - BrowserAppCacheSystem* system_; -}; - - -// BrowserBackendProxy -------------------------------------------------------- -// Proxies method calls from the frontend UI thread to the backend IO thread. - -class BrowserBackendProxy - : public base::RefCountedThreadSafe, - public appcache::AppCacheBackend { - public: - explicit BrowserBackendProxy(BrowserAppCacheSystem* appcache_system) - : system_(appcache_system), event_(true, false) { - get_status_callback_ = - base::Bind(&BrowserBackendProxy::GetStatusCallback, - base::Unretained(this)); - start_update_callback_ = - base::Bind(&BrowserBackendProxy::StartUpdateCallback, - base::Unretained(this)); - swap_cache_callback_= - base::Bind(&BrowserBackendProxy::SwapCacheCallback, - base::Unretained(this)); - } - - virtual void RegisterHost(int host_id) OVERRIDE { - if (system_->is_ui_thread()) { - system_->io_message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserBackendProxy::RegisterHost, this, host_id)); - } else if (system_->is_io_thread()) { - system_->backend_impl_->RegisterHost(host_id); - } else { - NOTREACHED(); - } - } - - virtual void UnregisterHost(int host_id) OVERRIDE { - if (system_->is_ui_thread()) { - system_->io_message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserBackendProxy::UnregisterHost, this, host_id)); - } else if (system_->is_io_thread()) { - system_->backend_impl_->UnregisterHost(host_id); - } else { - NOTREACHED(); - } - } - - virtual void SetSpawningHostId(int host_id, int spawning_host_id) OVERRIDE { - if (system_->is_ui_thread()) { - system_->io_message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserBackendProxy::SetSpawningHostId, this, host_id, - spawning_host_id)); - } else if (system_->is_io_thread()) { - system_->backend_impl_->SetSpawningHostId(host_id, spawning_host_id); - } else { - NOTREACHED(); - } - } - - virtual void SelectCache(int host_id, - const GURL& document_url, - const int64 cache_document_was_loaded_from, - const GURL& manifest_url) OVERRIDE { - if (system_->is_ui_thread()) { - system_->io_message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserBackendProxy::SelectCache, this, host_id, - document_url, cache_document_was_loaded_from, - manifest_url)); - } else if (system_->is_io_thread()) { - system_->backend_impl_->SelectCache(host_id, document_url, - cache_document_was_loaded_from, - manifest_url); - } else { - NOTREACHED(); - } - } - - virtual void GetResourceList( - int host_id, - std::vector* resource_infos) OVERRIDE { - if (system_->is_ui_thread()) { - system_->io_message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserBackendProxy::GetResourceList, this, host_id, - resource_infos)); - } else if (system_->is_io_thread()) { - system_->backend_impl_->GetResourceList(host_id, resource_infos); - } else { - NOTREACHED(); - } - } - - virtual void SelectCacheForWorker( - int host_id, - int parent_process_id, - int parent_host_id) OVERRIDE { - NOTIMPLEMENTED(); // Workers are not supported in test_shell. - } - - virtual void SelectCacheForSharedWorker( - int host_id, - int64 appcache_id) OVERRIDE { - NOTIMPLEMENTED(); // Workers are not supported in test_shell. - } - - virtual void MarkAsForeignEntry( - int host_id, - const GURL& document_url, - int64 cache_document_was_loaded_from) OVERRIDE { - if (system_->is_ui_thread()) { - system_->io_message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserBackendProxy::MarkAsForeignEntry, this, host_id, - document_url, cache_document_was_loaded_from)); - } else if (system_->is_io_thread()) { - system_->backend_impl_->MarkAsForeignEntry( - host_id, document_url, - cache_document_was_loaded_from); - } else { - NOTREACHED(); - } - } - - virtual appcache::Status GetStatus(int host_id) OVERRIDE { - if (system_->is_ui_thread()) { - status_result_ = appcache::UNCACHED; - event_.Reset(); - system_->io_message_loop()->PostTask( - FROM_HERE, - base::Bind(base::IgnoreResult(&BrowserBackendProxy::GetStatus), - this, host_id)); - event_.Wait(); - } else if (system_->is_io_thread()) { - system_->backend_impl_->GetStatusWithCallback( - host_id, get_status_callback_, NULL); - } else { - NOTREACHED(); - } - return status_result_; - } - - virtual bool StartUpdate(int host_id) OVERRIDE { - if (system_->is_ui_thread()) { - bool_result_ = false; - event_.Reset(); - system_->io_message_loop()->PostTask( - FROM_HERE, - base::Bind(base::IgnoreResult(&BrowserBackendProxy::StartUpdate), - this, host_id)); - event_.Wait(); - } else if (system_->is_io_thread()) { - system_->backend_impl_->StartUpdateWithCallback( - host_id, start_update_callback_, NULL); - } else { - NOTREACHED(); - } - return bool_result_; - } - - virtual bool SwapCache(int host_id) OVERRIDE { - if (system_->is_ui_thread()) { - bool_result_ = false; - event_.Reset(); - system_->io_message_loop()->PostTask( - FROM_HERE, - base::Bind(base::IgnoreResult(&BrowserBackendProxy::SwapCache), - this, host_id)); - event_.Wait(); - } else if (system_->is_io_thread()) { - system_->backend_impl_->SwapCacheWithCallback( - host_id, swap_cache_callback_, NULL); - } else { - NOTREACHED(); - } - return bool_result_; - } - - void GetStatusCallback(appcache::Status status, void* param) { - status_result_ = status; - event_.Signal(); - } - - void StartUpdateCallback(bool result, void* param) { - bool_result_ = result; - event_.Signal(); - } - - void SwapCacheCallback(bool result, void* param) { - bool_result_ = result; - event_.Signal(); - } - - void SignalEvent() { - event_.Signal(); - } - - private: - friend class base::RefCountedThreadSafe; - - virtual ~BrowserBackendProxy() {} - - BrowserAppCacheSystem* system_; - base::WaitableEvent event_; - bool bool_result_; - appcache::Status status_result_; - appcache::GetStatusCallback get_status_callback_; - appcache::StartUpdateCallback start_update_callback_; - appcache::SwapCacheCallback swap_cache_callback_; -}; - - -// BrowserAppCacheSystem ------------------------------------------------------- - -// This class only works for a single process browser. -static const int kSingleProcessId = 1; - -// A not so thread safe singleton, but should work for test_shell. -BrowserAppCacheSystem* BrowserAppCacheSystem::instance_ = NULL; - -BrowserAppCacheSystem::BrowserAppCacheSystem() - : io_message_loop_(NULL), ui_message_loop_(NULL), - ALLOW_THIS_IN_INITIALIZER_LIST( - backend_proxy_(new BrowserBackendProxy(this))), - ALLOW_THIS_IN_INITIALIZER_LIST( - frontend_proxy_(new BrowserFrontendProxy(this))), - backend_impl_(NULL), service_(NULL), db_thread_("AppCacheDBThread") { - DCHECK(!instance_); - instance_ = this; -} - -static void SignalEvent(base::WaitableEvent* event) { - event->Signal(); -} - -BrowserAppCacheSystem::~BrowserAppCacheSystem() { - DCHECK(!io_message_loop_ && !backend_impl_ && !service_); - frontend_proxy_->clear_appcache_system(); // in case a task is in transit - instance_ = NULL; - - if (db_thread_.IsRunning()) { - // We pump a task thru the db thread to ensure any tasks previously - // scheduled on that thread have been performed prior to return. - base::WaitableEvent event(false, false); - db_thread_.message_loop()->PostTask( - FROM_HERE, base::Bind(&SignalEvent, &event)); - event.Wait(); - } -} - -void BrowserAppCacheSystem::InitOnUIThread( - const base::FilePath& cache_directory) { - DCHECK(!ui_message_loop_); - ui_message_loop_ = base::MessageLoop::current(); - cache_directory_ = cache_directory; -} - -void BrowserAppCacheSystem::InitOnIOThread( - net::URLRequestContext* request_context) { - if (!is_initailized_on_ui_thread()) - return; - - DCHECK(!io_message_loop_); - io_message_loop_ = base::MessageLoop::current(); - - if (!db_thread_.IsRunning()) - db_thread_.Start(); - - // Recreate and initialize per each IO thread. - service_ = new appcache::AppCacheService(NULL); - backend_impl_ = new appcache::AppCacheBackendImpl(); - service_->Initialize(cache_directory_, - db_thread_.message_loop_proxy(), - BrowserResourceLoaderBridge::GetCacheThread()); - service_->set_request_context(request_context); - backend_impl_->Initialize(service_, frontend_proxy_.get(), kSingleProcessId); - - AppCacheInterceptor::EnsureRegistered(); -} - -void BrowserAppCacheSystem::CleanupIOThread() { - DCHECK(is_io_thread()); - - delete backend_impl_; - delete service_; - backend_impl_ = NULL; - service_ = NULL; - io_message_loop_ = NULL; - - // Just in case the main thread is waiting on it. - backend_proxy_->SignalEvent(); -} - -WebApplicationCacheHost* BrowserAppCacheSystem::CreateCacheHostForWebKit( - WebApplicationCacheHostClient* client) { - if (!is_initailized_on_ui_thread()) - return NULL; - - DCHECK(is_ui_thread()); - - if (!is_initialized()) - return NULL; - return new WebApplicationCacheHostImpl(client, backend_proxy_.get()); -} - -void BrowserAppCacheSystem::SetExtraRequestBits( - net::URLRequest* request, int host_id, ResourceType::Type resource_type) { - if (is_initialized()) { - DCHECK(is_io_thread()); - AppCacheInterceptor::SetExtraRequestInfo( - request, service_, kSingleProcessId, host_id, resource_type); - } -} - -void BrowserAppCacheSystem::GetExtraResponseBits( - net::URLRequest* request, int64* cache_id, GURL* manifest_url) { - if (is_initialized()) { - DCHECK(is_io_thread()); - AppCacheInterceptor::GetExtraResponseInfo( - request, cache_id, manifest_url); - } -} diff --git a/cef1/libcef/browser_appcache_system.h b/cef1/libcef/browser_appcache_system.h deleted file mode 100644 index 8d051e88b..000000000 --- a/cef1/libcef/browser_appcache_system.h +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_BROWSER_APPCACHE_SYSTEM_H_ -#define CEF_LIBCEF_BROWSER_APPCACHE_SYSTEM_H_ -#pragma once - -#include "base/files/file_path.h" -#include "base/message_loop.h" -#include "base/threading/thread.h" -#include "webkit/appcache/appcache_backend_impl.h" -#include "webkit/appcache/appcache_frontend_impl.h" -#include "webkit/appcache/appcache_service.h" -#include "webkit/glue/resource_type.h" - -namespace WebKit { -class WebApplicationCacheHost; -class WebApplicationCacheHostClient; -} -class BrowserBackendProxy; -class BrowserFrontendProxy; - -namespace net { -class URLRequest; -class URLRequestContext; -} // namespace net - -// A class that composes the constituent parts of an appcache system -// together for use in a single process with two relavant threads, -// a UI thread on which webkit runs and an IO thread on which URLRequests -// are handled. This class conspires with BrowserResourceLoaderBridge to -// retrieve resources from the appcache. -class BrowserAppCacheSystem { - public: - // Should be instanced somewhere in main(). If not instanced, the public - // static methods are all safe no-ops. - BrowserAppCacheSystem(); - virtual ~BrowserAppCacheSystem(); - - // One-time main UI thread initialization. - static void InitializeOnUIThread(const base::FilePath& cache_directory) { - if (instance_) - instance_->InitOnUIThread(cache_directory); - } - - // Called by BrowserResourceLoaderBridge's IOThread class. - // Per IO thread initialization. Only one IO thread can exist - // at a time, but after IO thread termination a new one can be - // started on which this method should be called. The instance - // is assumed to outlive the IO thread. - static void InitializeOnIOThread(net::URLRequestContext* request_context) { - if (instance_) - instance_->InitOnIOThread(request_context); - } - - static void CleanupOnIOThread() { - if (instance_) - instance_->CleanupIOThread(); - } - - // Called by TestShellWebKitInit to manufacture a 'host' for webcore. - static WebKit::WebApplicationCacheHost* CreateApplicationCacheHost( - WebKit::WebApplicationCacheHostClient* client) { - return instance_ ? instance_->CreateCacheHostForWebKit(client) : NULL; - } - - // Called by BrowserResourceLoaderBridge to hook into resource loads. - static void SetExtraRequestInfo(net::URLRequest* request, - int host_id, - ResourceType::Type resource_type) { - if (instance_) - instance_->SetExtraRequestBits(request, host_id, resource_type); - } - - // Called by BrowserResourceLoaderBridge extract extra response bits. - static void GetExtraResponseInfo(net::URLRequest* request, - int64* cache_id, - GURL* manifest_url) { - if (instance_) - instance_->GetExtraResponseBits(request, cache_id, manifest_url); - } - - private: - friend class BrowserBackendProxy; - friend class BrowserFrontendProxy; - - // Instance methods called by our static public methods - void InitOnUIThread(const base::FilePath& cache_directory); - void InitOnIOThread(net::URLRequestContext* request_context); - void CleanupIOThread(); - WebKit::WebApplicationCacheHost* CreateCacheHostForWebKit( - WebKit::WebApplicationCacheHostClient* client); - void SetExtraRequestBits(net::URLRequest* request, - int host_id, - ResourceType::Type resource_type); - void GetExtraResponseBits(net::URLRequest* request, - int64* cache_id, - GURL* manifest_url); - - // Helpers - base::MessageLoop* io_message_loop() { return io_message_loop_; } - base::MessageLoop* ui_message_loop() { return ui_message_loop_; } - bool is_io_thread() { - return base::MessageLoop::current() == io_message_loop_; - } - bool is_ui_thread() { - return base::MessageLoop::current() == ui_message_loop_; - } - bool is_initialized() { - return io_message_loop_ && is_initailized_on_ui_thread(); - } - bool is_initailized_on_ui_thread() { - return ui_message_loop_ ? true : false; - } - - base::FilePath cache_directory_; - base::MessageLoop* io_message_loop_; - base::MessageLoop* ui_message_loop_; - scoped_refptr backend_proxy_; - scoped_refptr frontend_proxy_; - appcache::AppCacheFrontendImpl frontend_impl_; - - // Created and used only on the IO thread, these do - // not survive IO thread termination. If a new IO thread - // is started new instances will be created. - appcache::AppCacheBackendImpl* backend_impl_; - appcache::AppCacheService* service_; - - // We start a thread for use as the DB thread. - base::Thread db_thread_; - - // A low-tech singleton. - static BrowserAppCacheSystem* instance_; -}; - -#endif // CEF_LIBCEF_BROWSER_APPCACHE_SYSTEM_H_ diff --git a/cef1/libcef/browser_database_system.cc b/cef1/libcef/browser_database_system.cc deleted file mode 100644 index a39613509..000000000 --- a/cef1/libcef/browser_database_system.cc +++ /dev/null @@ -1,313 +0,0 @@ -// Copyright (c) 2011 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 "libcef/browser_database_system.h" -#include "libcef/cef_context.h" - -#include "base/auto_reset.h" -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/file_util.h" -#include "base/message_loop.h" -#include "base/message_loop_proxy.h" -#include "base/synchronization/waitable_event.h" -#include "base/threading/platform_thread.h" -#include "base/utf_string_conversions.h" -#include "third_party/sqlite/sqlite3.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDatabase.h" -#include "webkit/database/database_util.h" -#include "webkit/database/vfs_backend.h" - -using webkit_database::DatabaseTracker; -using webkit_database::DatabaseUtil; -using webkit_database::OriginInfo; -using webkit_database::VfsBackend; - -BrowserDatabaseSystem* BrowserDatabaseSystem::instance_ = NULL; - -BrowserDatabaseSystem* BrowserDatabaseSystem::GetInstance() { - DCHECK(instance_); - return instance_; -} - -BrowserDatabaseSystem::BrowserDatabaseSystem() - : db_thread_("BrowserDBThread"), - quota_per_origin_(5 * 1024 * 1024), - open_connections_(new webkit_database::DatabaseConnectionsWrapper) { - DCHECK(!instance_); - instance_ = this; - db_tracker_ = - new DatabaseTracker(_Context->cache_path(), false, NULL, NULL, NULL); - db_tracker_->AddObserver(this); - db_thread_.Start(); - db_thread_proxy_ = db_thread_.message_loop_proxy(); -} - -BrowserDatabaseSystem::~BrowserDatabaseSystem() { - base::WaitableEvent done_event(false, false); - db_thread_proxy_->PostTask( - FROM_HERE, - base::Bind(&BrowserDatabaseSystem::ThreadCleanup, - base::Unretained(this), &done_event)); - done_event.Wait(); - instance_ = NULL; -} - -void BrowserDatabaseSystem::databaseOpened( - const WebKit::WebDatabase& database) { - string16 origin_identifier = database.securityOrigin().databaseIdentifier(); - string16 database_name = database.name(); - open_connections_->AddOpenConnection(origin_identifier, database_name); - db_thread_proxy_->PostTask( - FROM_HERE, - base::Bind(&BrowserDatabaseSystem::DatabaseOpened, - base::Unretained(this), - origin_identifier, - database_name, database.displayName(), - database.estimatedSize())); -} - -void BrowserDatabaseSystem::databaseModified( - const WebKit::WebDatabase& database) { - db_thread_proxy_->PostTask( - FROM_HERE, - base::Bind(&BrowserDatabaseSystem::DatabaseModified, - base::Unretained(this), - database.securityOrigin().databaseIdentifier(), - database.name())); -} - -void BrowserDatabaseSystem::databaseClosed( - const WebKit::WebDatabase& database) { - string16 origin_identifier = database.securityOrigin().databaseIdentifier(); - string16 database_name = database.name(); - db_thread_proxy_->PostTask( - FROM_HERE, - base::Bind(&BrowserDatabaseSystem::DatabaseClosed, - base::Unretained(this), origin_identifier, database_name)); -} - -base::PlatformFile BrowserDatabaseSystem::OpenFile( - const string16& vfs_file_name, int desired_flags) { - base::PlatformFile result = base::kInvalidPlatformFileValue; - base::WaitableEvent done_event(false, false); - db_thread_proxy_->PostTask( - FROM_HERE, - base::Bind(&BrowserDatabaseSystem::VfsOpenFile, - base::Unretained(this), - vfs_file_name, desired_flags, - &result, &done_event)); - done_event.Wait(); - return result; -} - -int BrowserDatabaseSystem::DeleteFile( - const string16& vfs_file_name, bool sync_dir) { - int result = SQLITE_OK; - base::WaitableEvent done_event(false, false); - db_thread_proxy_->PostTask( - FROM_HERE, - base::Bind(&BrowserDatabaseSystem::VfsDeleteFile, - base::Unretained(this), - vfs_file_name, sync_dir, - &result, &done_event)); - done_event.Wait(); - return result; -} - -uint32 BrowserDatabaseSystem::GetFileAttributes(const string16& vfs_file_name) { - uint32 result = 0; - base::WaitableEvent done_event(false, false); - db_thread_proxy_->PostTask( - FROM_HERE, - base::Bind(&BrowserDatabaseSystem::VfsGetFileAttributes, - base::Unretained(this), vfs_file_name, &result, &done_event)); - done_event.Wait(); - return result; -} - -int64 BrowserDatabaseSystem::GetFileSize(const string16& vfs_file_name) { - int64 result = 0; - base::WaitableEvent done_event(false, false); - db_thread_proxy_->PostTask( - FROM_HERE, - base::Bind(&BrowserDatabaseSystem::VfsGetFileSize, - base::Unretained(this), vfs_file_name, &result, &done_event)); - done_event.Wait(); - return result; -} - -int64 BrowserDatabaseSystem::GetSpaceAvailable( - const string16& origin_identifier) { - int64 result = 0; - base::WaitableEvent done_event(false, false); - db_thread_proxy_->PostTask( - FROM_HERE, - base::Bind(&BrowserDatabaseSystem::VfsGetSpaceAvailable, - base::Unretained(this), origin_identifier, - &result, &done_event)); - done_event.Wait(); - return result; -} - -void BrowserDatabaseSystem::ClearAllDatabases() { - open_connections_->WaitForAllDatabasesToClose(); - db_thread_proxy_->PostTask( - FROM_HERE, - base::Bind(&BrowserDatabaseSystem::ResetTracker, base::Unretained(this))); -} - -void BrowserDatabaseSystem::SetDatabaseQuota(int64 quota) { - if (!db_thread_proxy_->BelongsToCurrentThread()) { - db_thread_proxy_->PostTask( - FROM_HERE, - base::Bind(&BrowserDatabaseSystem::SetDatabaseQuota, - base::Unretained(this), quota)); - return; - } - quota_per_origin_ = quota; -} - -void BrowserDatabaseSystem::DatabaseOpened(const string16& origin_identifier, - const string16& database_name, - const string16& description, - int64 estimated_size) { - DCHECK(db_thread_proxy_->BelongsToCurrentThread()); - int64 database_size = 0; - db_tracker_->DatabaseOpened( - origin_identifier, database_name, description, - estimated_size, &database_size); - OnDatabaseSizeChanged(origin_identifier, database_name, - database_size); -} - -void BrowserDatabaseSystem::DatabaseModified(const string16& origin_identifier, - const string16& database_name) { - DCHECK(db_thread_proxy_->BelongsToCurrentThread()); - db_tracker_->DatabaseModified(origin_identifier, database_name); -} - -void BrowserDatabaseSystem::DatabaseClosed(const string16& origin_identifier, - const string16& database_name) { - DCHECK(db_thread_proxy_->BelongsToCurrentThread()); - db_tracker_->DatabaseClosed(origin_identifier, database_name); - open_connections_->RemoveOpenConnection(origin_identifier, database_name); -} - -void BrowserDatabaseSystem::OnDatabaseSizeChanged( - const string16& origin_identifier, - const string16& database_name, - int64 database_size) { - DCHECK(db_thread_proxy_->BelongsToCurrentThread()); - // We intentionally call into webkit on our background db_thread_ - // to better emulate what happens in chrome where this method is - // invoked on the background ipc thread. - WebKit::WebDatabase::updateDatabaseSize( - origin_identifier, database_name, database_size); -} - -void BrowserDatabaseSystem::OnDatabaseScheduledForDeletion( - const string16& origin_identifier, - const string16& database_name) { - DCHECK(db_thread_proxy_->BelongsToCurrentThread()); - // We intentionally call into webkit on our background db_thread_ - // to better emulate what happens in chrome where this method is - // invoked on the background ipc thread. - WebKit::WebDatabase::closeDatabaseImmediately( - origin_identifier, database_name); -} - -void BrowserDatabaseSystem::VfsOpenFile( - const string16& vfs_file_name, int desired_flags, - base::PlatformFile* file_handle, base::WaitableEvent* done_event ) { - DCHECK(db_thread_proxy_->BelongsToCurrentThread()); - base::FilePath file_name = GetFullFilePathForVfsFile(vfs_file_name); - if (file_name.empty()) { - VfsBackend::OpenTempFileInDirectory( - db_tracker_->DatabaseDirectory(), desired_flags, file_handle); - } else { - VfsBackend::OpenFile(file_name, desired_flags, file_handle); - } - done_event->Signal(); -} - -void BrowserDatabaseSystem::VfsDeleteFile( - const string16& vfs_file_name, bool sync_dir, - int* result, base::WaitableEvent* done_event) { - DCHECK(db_thread_proxy_->BelongsToCurrentThread()); - // We try to delete the file multiple times, because that's what the default - // VFS does (apparently deleting a file can sometimes fail on Windows). - // We sleep for 10ms between retries for the same reason. - const int kNumDeleteRetries = 3; - int num_retries = 0; - *result = SQLITE_OK; - base::FilePath file_name = GetFullFilePathForVfsFile(vfs_file_name); - do { - *result = VfsBackend::DeleteFile(file_name, sync_dir); - } while ((++num_retries < kNumDeleteRetries) && - (*result == SQLITE_IOERR_DELETE) && - (base::PlatformThread::Sleep( - base::TimeDelta::FromMilliseconds(10)), - 1)); - - done_event->Signal(); -} - -void BrowserDatabaseSystem::VfsGetFileAttributes( - const string16& vfs_file_name, - uint32* result, base::WaitableEvent* done_event) { - DCHECK(db_thread_proxy_->BelongsToCurrentThread()); - *result = VfsBackend::GetFileAttributes( - GetFullFilePathForVfsFile(vfs_file_name)); - done_event->Signal(); -} - -void BrowserDatabaseSystem::VfsGetFileSize( - const string16& vfs_file_name, - int64* result, base::WaitableEvent* done_event) { - DCHECK(db_thread_proxy_->BelongsToCurrentThread()); - *result = VfsBackend::GetFileSize(GetFullFilePathForVfsFile(vfs_file_name)); - done_event->Signal(); -} - -void BrowserDatabaseSystem::VfsGetSpaceAvailable( - const string16& origin_identifier, - int64* result, base::WaitableEvent* done_event) { - DCHECK(db_thread_proxy_->BelongsToCurrentThread()); - // This method isn't actually part of the "vfs" interface, but it is - // used from within webcore and handled here in the same fashion. - OriginInfo info; - if (db_tracker_->GetOriginInfo(origin_identifier, &info)) { - int64 space_available = quota_per_origin_ - info.TotalSize(); - *result = space_available < 0 ? 0 : space_available; - } else { - NOTREACHED(); - *result = 0; - } - done_event->Signal(); -} - -base::FilePath BrowserDatabaseSystem::GetFullFilePathForVfsFile( - const string16& vfs_file_name) { - DCHECK(db_thread_proxy_->BelongsToCurrentThread()); - if (vfs_file_name.empty()) // temp file, used for vacuuming - return base::FilePath(); - return DatabaseUtil::GetFullFilePathForVfsFile( - db_tracker_.get(), vfs_file_name); -} - -void BrowserDatabaseSystem::ResetTracker() { - DCHECK(db_thread_proxy_->BelongsToCurrentThread()); - db_tracker_->CloseTrackerDatabaseAndClearCaches(); - file_util::Delete(db_tracker_->DatabaseDirectory(), true); -} - -void BrowserDatabaseSystem::ThreadCleanup(base::WaitableEvent* done_event) { - ResetTracker(); - db_tracker_->RemoveObserver(this); - db_tracker_ = NULL; - done_event->Signal(); -} - diff --git a/cef1/libcef/browser_database_system.h b/cef1/libcef/browser_database_system.h deleted file mode 100644 index 832031054..000000000 --- a/cef1/libcef/browser_database_system.h +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_BROWSER_DATABASE_SYSTEM_H_ -#define CEF_LIBCEF_BROWSER_DATABASE_SYSTEM_H_ -#pragma once - -#include "base/files/file_path.h" -#include "base/hash_tables.h" -#include "base/memory/ref_counted.h" -#include "base/platform_file.h" -#include "base/string16.h" -#include "base/synchronization/lock.h" -#include "base/threading/thread.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDatabaseObserver.h" -#include "webkit/database/database_connections.h" -#include "webkit/database/database_tracker.h" - -namespace base { -class MessageLoopProxy; -class WaitableEvent; -} - -class BrowserDatabaseSystem : public webkit_database::DatabaseTracker::Observer, - public WebKit::WebDatabaseObserver { - public: - static BrowserDatabaseSystem* GetInstance(); - - BrowserDatabaseSystem(); - virtual ~BrowserDatabaseSystem(); - - // WebDatabaseObserver implementation, these are called on the script - // execution context thread on which the database is opened. This may be - // the main thread or background WebWorker threads. - virtual void databaseOpened(const WebKit::WebDatabase& database); - virtual void databaseModified(const WebKit::WebDatabase& database); - virtual void databaseClosed(const WebKit::WebDatabase& database); - - // SQLite VFS related methods, these are called on webcore's - // background database threads via the WebKitPlatformSupport impl. - base::PlatformFile OpenFile(const string16& vfs_file_name, int desired_flags); - int DeleteFile(const string16& vfs_file_name, bool sync_dir); - uint32 GetFileAttributes(const string16& vfs_file_name); - int64 GetFileSize(const string16& vfs_file_name); - int64 GetSpaceAvailable(const string16& origin_identifier); - - // For use by LayoutTestController, called on the main thread. - void ClearAllDatabases(); - void SetDatabaseQuota(int64 quota); - - private: - // Used by our WebDatabaseObserver impl, only called on the db_thread - void DatabaseOpened(const string16& origin_identifier, - const string16& database_name, - const string16& description, - int64 estimated_size); - void DatabaseModified(const string16& origin_identifier, - const string16& database_name); - void DatabaseClosed(const string16& origin_identifier, - const string16& database_name); - - // DatabaseTracker::Observer implementation - virtual void OnDatabaseSizeChanged(const string16& origin_identifier, - const string16& database_name, - int64 database_size) OVERRIDE; - virtual void OnDatabaseScheduledForDeletion( - const string16& origin_identifier, - const string16& database_name) OVERRIDE; - - // Used by our public SQLite VFS methods, only called on the db_thread. - void VfsOpenFile(const string16& vfs_file_name, int desired_flags, - base::PlatformFile* result, base::WaitableEvent* done_event); - void VfsDeleteFile(const string16& vfs_file_name, bool sync_dir, - int* result, base::WaitableEvent* done_event); - void VfsGetFileAttributes(const string16& vfs_file_name, - uint32* result, base::WaitableEvent* done_event); - void VfsGetFileSize(const string16& vfs_file_name, - int64* result, base::WaitableEvent* done_event); - void VfsGetSpaceAvailable(const string16& origin_identifier, - int64* result, base::WaitableEvent* done_event); - - base::FilePath GetFullFilePathForVfsFile(const string16& vfs_file_name); - - void ResetTracker(); - void ThreadCleanup(base::WaitableEvent* done_event); - - // All access to the db_tracker (except for its construction) and - // vfs operations are serialized on a background thread. - base::Thread db_thread_; - scoped_refptr db_thread_proxy_; - scoped_refptr db_tracker_; - int64 quota_per_origin_; - - // Data members to support waiting for all connections to be closed. - scoped_refptr open_connections_; - - static BrowserDatabaseSystem* instance_; -}; - -#endif // CEF_LIBCEF_BROWSER_DATABASE_SYSTEM_H_ diff --git a/cef1/libcef/browser_devtools_agent.cc b/cef1/libcef/browser_devtools_agent.cc deleted file mode 100644 index c723c22c0..000000000 --- a/cef1/libcef/browser_devtools_agent.cc +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright (c) 2011 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 "libcef/browser_devtools_agent.h" -#include "libcef/browser_devtools_callargs.h" -#include "libcef/browser_devtools_client.h" - -#include "base/bind.h" -#include "base/message_loop.h" -#include "grit/webkit_chromium_resources.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDevToolsAgent.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "webkit/glue/webkit_glue.h" - -using WebKit::WebCString; -using WebKit::WebDevToolsAgent; -using WebKit::WebDevToolsMessageData; -using WebKit::WebString; -using WebKit::WebView; - -namespace { - -class WebKitClientMessageLoopImpl - : public WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop { - public: - WebKitClientMessageLoopImpl() - : message_loop_(base::MessageLoop::current()) { } - virtual ~WebKitClientMessageLoopImpl() { - message_loop_ = NULL; - } - virtual void run() { - bool old_state = message_loop_->NestableTasksAllowed(); - message_loop_->SetNestableTasksAllowed(true); - message_loop_->Run(); - message_loop_->SetNestableTasksAllowed(old_state); - } - virtual void quitNow() { - message_loop_->QuitNow(); - } - private: - base::MessageLoop* message_loop_; -}; - -} // namespace - -BrowserDevToolsAgent::BrowserDevToolsAgent() - : ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), - dev_tools_client_(NULL) { - static int dev_tools_agent_counter; - routing_id_ = ++dev_tools_agent_counter; -} - -BrowserDevToolsAgent::~BrowserDevToolsAgent() { -} - -void BrowserDevToolsAgent::SetWebView(WebKit::WebView* web_view) { - web_view_ = web_view; -} - -void BrowserDevToolsAgent::sendMessageToInspectorFrontend( - const WebString& data) { - if (dev_tools_client_) - dev_tools_client_->AsyncCall(BrowserDevToolsCallArgs(data)); -} - -int BrowserDevToolsAgent::hostIdentifier() { - return routing_id_; -} - -void BrowserDevToolsAgent::runtimePropertyChanged( - const WebKit::WebString& name, - const WebKit::WebString& value) { - // TODO(cef): Implement. -} - -WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop* - BrowserDevToolsAgent::createClientMessageLoop() { - return new WebKitClientMessageLoopImpl(); -} - -void BrowserDevToolsAgent::AsyncCall(const BrowserDevToolsCallArgs &args) { - base::MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&BrowserDevToolsAgent::Call, weak_factory_.GetWeakPtr(), - args)); -} - -void BrowserDevToolsAgent::Call(const BrowserDevToolsCallArgs &args) { - WebDevToolsAgent* web_agent = GetWebAgent(); - if (web_agent) - web_agent->dispatchOnInspectorBackend(args.data_); - if (BrowserDevToolsCallArgs::calls_count() == 1 && dev_tools_client_) - dev_tools_client_->all_messages_processed(); -} - -WebDevToolsAgent* BrowserDevToolsAgent::GetWebAgent() { - if (!web_view_) - return NULL; - return web_view_->devToolsAgent(); -} - -void BrowserDevToolsAgent::attach(BrowserDevToolsClient* client) { - DCHECK(!dev_tools_client_); - dev_tools_client_ = client; - WebDevToolsAgent* web_agent = GetWebAgent(); - if (web_agent) - web_agent->attach(); -} - -void BrowserDevToolsAgent::detach() { - DCHECK(dev_tools_client_); - WebDevToolsAgent* web_agent = GetWebAgent(); - if (web_agent) - web_agent->detach(); - dev_tools_client_ = NULL; -} - -bool BrowserDevToolsAgent::evaluateInWebInspector( - long call_id, // NOLINT(runtime/int) - const std::string& script) { - WebDevToolsAgent* agent = GetWebAgent(); - if (!agent) - return false; - agent->evaluateInWebInspector(call_id, WebString::fromUTF8(script)); - return true; -} diff --git a/cef1/libcef/browser_devtools_agent.h b/cef1/libcef/browser_devtools_agent.h deleted file mode 100644 index efc6bb7e6..000000000 --- a/cef1/libcef/browser_devtools_agent.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_BROWSER_DEVTOOLS_AGENT_H_ -#define CEF_LIBCEF_BROWSER_DEVTOOLS_AGENT_H_ -#pragma once - -#include - -#include "base/memory/weak_ptr.h" - -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDevToolsAgentClient.h" - -namespace WebKit { - -class WebDevToolsAgent; -class WebView; - -} // namespace WebKit - -class BrowserDevToolsCallArgs; -class BrowserDevToolsClient; - -class BrowserDevToolsAgent : public WebKit::WebDevToolsAgentClient { - public: - BrowserDevToolsAgent(); - virtual ~BrowserDevToolsAgent(); - - void SetWebView(WebKit::WebView* web_view); - - // WebDevToolsAgentClient implementation. - virtual void sendMessageToInspectorFrontend( - const WebKit::WebString& data); - virtual int hostIdentifier(); - virtual void runtimePropertyChanged(const WebKit::WebString& name, - const WebKit::WebString& value); - - virtual WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop* - createClientMessageLoop(); - - void AsyncCall(const BrowserDevToolsCallArgs& args); - - void attach(BrowserDevToolsClient* client); - void detach(); - - bool evaluateInWebInspector(long call_id, // NOLINT(runtime/int) - const std::string& script); - - BrowserDevToolsClient* client() { return dev_tools_client_; } - - private: - void Call(const BrowserDevToolsCallArgs& args); - WebKit::WebDevToolsAgent* GetWebAgent(); - - base::WeakPtrFactory weak_factory_; - BrowserDevToolsClient* dev_tools_client_; - int routing_id_; - WebKit::WebDevToolsAgent* web_dev_tools_agent_; - WebKit::WebView* web_view_; - - DISALLOW_COPY_AND_ASSIGN(BrowserDevToolsAgent); -}; - -#endif // CEF_LIBCEF_BROWSER_DEVTOOLS_AGENT_H_ diff --git a/cef1/libcef/browser_devtools_callargs.cc b/cef1/libcef/browser_devtools_callargs.cc deleted file mode 100644 index efc8013f8..000000000 --- a/cef1/libcef/browser_devtools_callargs.cc +++ /dev/null @@ -1,27 +0,0 @@ -// 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. - -#include "libcef/browser_devtools_callargs.h" - -#include "base/logging.h" - -// static -int BrowserDevToolsCallArgs::calls_count_ = 0; - -BrowserDevToolsCallArgs::BrowserDevToolsCallArgs( - const WebKit::WebString& data) - : data_(data) { - ++calls_count_; -} - -BrowserDevToolsCallArgs::BrowserDevToolsCallArgs( - const BrowserDevToolsCallArgs& args) - : data_(args.data_) { - ++calls_count_; -} - -BrowserDevToolsCallArgs::~BrowserDevToolsCallArgs() { - --calls_count_; - DCHECK_GE(calls_count_, 0); -} diff --git a/cef1/libcef/browser_devtools_callargs.h b/cef1/libcef/browser_devtools_callargs.h deleted file mode 100644 index 4bccb5961..000000000 --- a/cef1/libcef/browser_devtools_callargs.h +++ /dev/null @@ -1,29 +0,0 @@ -// 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. - -#ifndef CEF_LIBCEF_BROWSER_DEVTOOLS_CALLARGS_H_ -#define CEF_LIBCEF_BROWSER_DEVTOOLS_CALLARGS_H_ -#pragma once - -#include "base/basictypes.h" - -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" - -class BrowserDevToolsCallArgs { - public: - explicit BrowserDevToolsCallArgs(const WebKit::WebString& data); - - BrowserDevToolsCallArgs(const BrowserDevToolsCallArgs& args); - - ~BrowserDevToolsCallArgs(); - - static int calls_count() { return calls_count_; } - - WebKit::WebString data_; - - private: - static int calls_count_; -}; - -#endif // CEF_LIBCEF_BROWSER_DEVTOOLS_CALLARGS_H_ diff --git a/cef1/libcef/browser_devtools_client.cc b/cef1/libcef/browser_devtools_client.cc deleted file mode 100644 index 59f46f55a..000000000 --- a/cef1/libcef/browser_devtools_client.cc +++ /dev/null @@ -1,87 +0,0 @@ -// 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. - -#include "libcef/browser_devtools_client.h" -#include "libcef/browser_devtools_agent.h" -#include "libcef/browser_devtools_callargs.h" -#include "libcef/browser_impl.h" -#include "libcef/cef_context.h" - -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDevToolsAgent.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDevToolsFrontend.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" - -#include "base/bind.h" -#include "base/command_line.h" -#include "base/logging.h" -#include "base/message_loop.h" - -using WebKit::WebDevToolsAgent; -using WebKit::WebDevToolsFrontend; -using WebKit::WebDevToolsMessageData; -using WebKit::WebString; -using WebKit::WebView; - -BrowserDevToolsClient::BrowserDevToolsClient(CefBrowserImpl* browser, - BrowserDevToolsAgent* agent) - : ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), - browser_(browser), - dev_tools_agent_(agent), - web_view_(browser->UIT_GetWebView()) { - web_tools_frontend_.reset(WebDevToolsFrontend::create(web_view_, this, - WebString::fromUTF8(_Context->locale()))); - dev_tools_agent_->attach(this); -} - -BrowserDevToolsClient::~BrowserDevToolsClient() { - // It is a chance that page will be destroyed at detach step of - // dev_tools_agent_ and we should clean pending requests a bit earlier. - weak_factory_.InvalidateWeakPtrs(); - if (dev_tools_agent_) - dev_tools_agent_->detach(); -} - -void BrowserDevToolsClient::sendMessageToBackend( - const WebString& data) { - if (dev_tools_agent_) - dev_tools_agent_->AsyncCall(BrowserDevToolsCallArgs(data)); -} - -void BrowserDevToolsClient::activateWindow() { - NOTIMPLEMENTED(); -} - -void BrowserDevToolsClient::closeWindow() { - NOTIMPLEMENTED(); -} - -void BrowserDevToolsClient::dockWindow() { - NOTIMPLEMENTED(); -} - -void BrowserDevToolsClient::undockWindow() { - NOTIMPLEMENTED(); -} - -void BrowserDevToolsClient::AsyncCall(const BrowserDevToolsCallArgs &args) { - base::MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&BrowserDevToolsClient::Call, weak_factory_.GetWeakPtr(), - args)); -} - -void BrowserDevToolsClient::Call(const BrowserDevToolsCallArgs &args) { - web_tools_frontend_->dispatchOnInspectorFrontend(args.data_); - if (BrowserDevToolsCallArgs::calls_count() == 1) - all_messages_processed(); -} - -void BrowserDevToolsClient::all_messages_processed() { - web_view_->mainFrame()->executeScript(WebKit::WebScriptSource( - WebString::fromUTF8("if (window.WebInspector && " - "WebInspector.queuesAreEmpty) WebInspector.queuesAreEmpty();"))); -} diff --git a/cef1/libcef/browser_devtools_client.h b/cef1/libcef/browser_devtools_client.h deleted file mode 100644 index 0e733da95..000000000 --- a/cef1/libcef/browser_devtools_client.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2009 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. - -#ifndef CEF_LIBCEF_BROWSER_DEVTOOLS_CLIENT_H_ -#define CEF_LIBCEF_BROWSER_DEVTOOLS_CLIENT_H_ -#pragma once - -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" - -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDevToolsFrontendClient.h" - -namespace WebKit { -class WebDevToolsFrontend; -class WebView; -} // namespace WebKit - -class BrowserDevToolsCallArgs; -class BrowserDevToolsAgent; -class CefBrowserImpl; - -class BrowserDevToolsClient: public WebKit::WebDevToolsFrontendClient { - public: - BrowserDevToolsClient(CefBrowserImpl* browser, - BrowserDevToolsAgent* agent); - virtual ~BrowserDevToolsClient(); - - // WebDevToolsFrontendClient implementation - virtual void sendMessageToBackend(const WebKit::WebString& data); - - virtual void activateWindow(); - virtual void closeWindow(); - virtual void dockWindow(); - virtual void undockWindow(); - - void AsyncCall(const BrowserDevToolsCallArgs& args); - - void all_messages_processed(); - - CefBrowserImpl* browser() { return browser_; } - - private: - void Call(const BrowserDevToolsCallArgs& args); - - base::WeakPtrFactory weak_factory_; - CefBrowserImpl* browser_; - BrowserDevToolsAgent* dev_tools_agent_; - WebKit::WebView* web_view_; - scoped_ptr web_tools_frontend_; - - DISALLOW_COPY_AND_ASSIGN(BrowserDevToolsClient); -}; - -#endif // CEF_LIBCEF_BROWSER_DEVTOOLS_CLIENT_H_ diff --git a/cef1/libcef/browser_devtools_scheme_handler.cc b/cef1/libcef/browser_devtools_scheme_handler.cc deleted file mode 100644 index d3d1d1909..000000000 --- a/cef1/libcef/browser_devtools_scheme_handler.cc +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/browser_devtools_scheme_handler.h" - -#include - -#include "include/cef_browser.h" -#include "include/cef_request.h" -#include "include/cef_response.h" -#include "include/cef_scheme.h" -#include "include/cef_stream.h" -#include "include/cef_url.h" -#include "libcef/browser_webkit_glue.h" -#include "libcef/cef_context.h" - -#include "base/file_util.h" -#include "base/string_util.h" -#include "grit/devtools_resources_map.h" -#include "net/base/mime_util.h" -#include "ui/base/resource/resource_bundle.h" - -const char kChromeDevToolsScheme[] = "chrome-devtools"; -const char kChromeDevToolsHost[] = "devtools"; -const char kChromeDevToolsURL[] = "chrome-devtools://devtools/"; - -namespace { - -class DevToolsSchemeHandler : public CefSchemeHandler { - public: - DevToolsSchemeHandler(const std::string& path, - CefRefPtr reader, - int size) - : path_(path), reader_(reader), size_(size) { - } - - virtual bool ProcessRequest(CefRefPtr request, - CefRefPtr callback) - OVERRIDE { - callback->HeadersAvailable(); - return true; - } - - virtual void GetResponseHeaders(CefRefPtr response, - int64& response_length, - CefString& redirectUrl) OVERRIDE { - response_length = size_; - - std::string mime_type = "text/plain"; - if (net::GetMimeTypeFromFile(base::FilePath(CefString(path_)), &mime_type)) - response->SetMimeType(mime_type); - - response->SetStatus(200); - } - - virtual bool ReadResponse(void* data_out, - int bytes_to_read, - int& bytes_read, - CefRefPtr callback) - OVERRIDE { - bytes_read = reader_->Read(data_out, 1, bytes_to_read); - return (bytes_read > 0); - } - - virtual void Cancel() OVERRIDE { - } - - private: - std::string path_; - CefRefPtr reader_; - int size_; - - IMPLEMENT_REFCOUNTING(DevToolSSchemeHandler); -}; - -class DevToolsSchemeHandlerFactory : public CefSchemeHandlerFactory { - public: - DevToolsSchemeHandlerFactory() {} - - virtual CefRefPtr Create(CefRefPtr browser, - const CefString& scheme_name, - CefRefPtr request) - OVERRIDE { - // Remove the query component of the URL, if any. - CefURLParts parts; - CefParseURL(request->GetURL(), parts); - cef_string_clear(&parts.spec); - cef_string_clear(&parts.query); - CefString urlStr; - CefCreateURL(parts, urlStr); - - std::string url = urlStr; - const char* path = &url.c_str()[strlen(kChromeDevToolsURL)]; - - int size = -1; - CefRefPtr reader = GetStreamReader(path, size); - if (!reader.get()) - return NULL; - - return new DevToolsSchemeHandler(path, reader, size); - } - - CefRefPtr GetStreamReader(const char* path, int& size) { - // Create a stream for the grit resource. - for (size_t i = 0; i < kDevtoolsResourcesSize; ++i) { - if (base::strcasecmp(kDevtoolsResources[i].name, path) == 0) { - base::StringPiece piece = - _Context->GetDataResource(kDevtoolsResources[i].value); - if (!piece.empty()) { - size = piece.size(); - return CefStreamReader::CreateForData(const_cast(piece.data()), - size); - } - } - } - - NOTREACHED() << "Missing DevTools resource: " << path; - return NULL; - } - - IMPLEMENT_REFCOUNTING(DevToolSSchemeHandlerFactory); -}; - -} // namespace - -// Register the DevTools scheme handler. -void RegisterDevToolsSchemeHandler() { - CefRegisterSchemeHandlerFactory(kChromeDevToolsScheme, kChromeDevToolsHost, - new DevToolsSchemeHandlerFactory()); -} diff --git a/cef1/libcef/browser_devtools_scheme_handler.h b/cef1/libcef/browser_devtools_scheme_handler.h deleted file mode 100644 index c459fa438..000000000 --- a/cef1/libcef/browser_devtools_scheme_handler.h +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that can -// be found in the LICENSE file. - -#ifndef CEF_LIBCEF_BROWSER_DEVTOOLS_SCHEME_HANDLER_H_ -#define CEF_LIBCEF_BROWSER_DEVTOOLS_SCHEME_HANDLER_H_ -#pragma once - -extern const char kChromeDevToolsScheme[]; -extern const char kChromeDevToolsHost[]; -extern const char kChromeDevToolsURL[]; - -// Register the DevTools scheme handler. -void RegisterDevToolsSchemeHandler(); - -#endif // CEF_LIBCEF_BROWSER_DEVTOOLS_SCHEME_HANDLER_H_ diff --git a/cef1/libcef/browser_dom_storage_system.cc b/cef1/libcef/browser_dom_storage_system.cc deleted file mode 100644 index b93980f2d..000000000 --- a/cef1/libcef/browser_dom_storage_system.cc +++ /dev/null @@ -1,308 +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 "libcef/browser_dom_storage_system.h" -#include "libcef/cef_context.h" -#include "libcef/cef_thread.h" - -#include "base/auto_reset.h" -#include "base/path_service.h" -#include "googleurl/src/gurl.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebStorageArea.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebStorageNamespace.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebStorageEventDispatcher.h" -#include "webkit/database/database_util.h" -#include "webkit/dom_storage/dom_storage_area.h" -#include "webkit/dom_storage/dom_storage_host.h" -#include "webkit/dom_storage/dom_storage_task_runner.h" - -using dom_storage::DomStorageContext; -using dom_storage::DomStorageHost; -using dom_storage::DomStorageSession; -using dom_storage::DomStorageWorkerPoolTaskRunner; -using webkit_database::DatabaseUtil; -using WebKit::WebStorageArea; -using WebKit::WebStorageNamespace; -using WebKit::WebStorageEventDispatcher; -using WebKit::WebString; -using WebKit::WebURL; - -namespace { -const int kInvalidNamespaceId = -1; -} - -class BrowserDomStorageSystem::NamespaceImpl : public WebStorageNamespace { - public: - explicit NamespaceImpl(const base::WeakPtr& parent); - NamespaceImpl(const base::WeakPtr& parent, - int session_namespace_id); - virtual ~NamespaceImpl(); - virtual WebStorageArea* createStorageArea(const WebString& origin) OVERRIDE; - virtual WebStorageNamespace* copy() OVERRIDE; - virtual bool isSameNamespace(const WebStorageNamespace&) const OVERRIDE; - - private: - DomStorageContext* Context() { - if (!parent_.get()) - return NULL; - return parent_->context_.get(); - } - - base::WeakPtr parent_; - int namespace_id_; -}; - -class BrowserDomStorageSystem::AreaImpl : public WebStorageArea { - public: - AreaImpl(const base::WeakPtr& parent, - int namespace_id, const GURL& origin); - virtual ~AreaImpl(); - virtual unsigned length() OVERRIDE; - virtual WebString key(unsigned index) OVERRIDE; - virtual WebString getItem(const WebString& key) OVERRIDE; - virtual void setItem(const WebString& key, const WebString& newValue, - const WebURL& pageUrl, Result&) OVERRIDE; - virtual void removeItem(const WebString& key, - const WebURL& pageUrl) OVERRIDE; - virtual void clear(const WebURL& pageUrl) OVERRIDE; - - private: - DomStorageHost* Host() { - if (!parent_.get()) - return NULL; - return parent_->host_.get(); - } - - base::WeakPtr parent_; - int connection_id_; -}; - -// NamespaceImpl ----------------------------- - -BrowserDomStorageSystem::NamespaceImpl::NamespaceImpl( - const base::WeakPtr& parent) - : parent_(parent), - namespace_id_(dom_storage::kLocalStorageNamespaceId) { -} - -BrowserDomStorageSystem::NamespaceImpl::NamespaceImpl( - const base::WeakPtr& parent, - int session_namespace_id) - : parent_(parent), - namespace_id_(session_namespace_id) { -} - -BrowserDomStorageSystem::NamespaceImpl::~NamespaceImpl() { - if (namespace_id_ == dom_storage::kLocalStorageNamespaceId || - namespace_id_ == kInvalidNamespaceId || !Context()) { - return; - } - Context()->DeleteSessionNamespace(namespace_id_, false); -} - -WebStorageArea* BrowserDomStorageSystem::NamespaceImpl::createStorageArea( - const WebString& origin) { - return new AreaImpl(parent_, namespace_id_, GURL(origin)); -} - -WebStorageNamespace* BrowserDomStorageSystem::NamespaceImpl::copy() { - DCHECK_NE(dom_storage::kLocalStorageNamespaceId, namespace_id_); - int new_id = kInvalidNamespaceId; - if (Context()) { - new_id = Context()->AllocateSessionId(); - Context()->CloneSessionNamespace(namespace_id_, new_id, std::string()); - } - return new NamespaceImpl(parent_, new_id); -} - -bool BrowserDomStorageSystem::NamespaceImpl::isSameNamespace( - const WebStorageNamespace& other) const { - const NamespaceImpl* other_impl = static_cast(&other); - return namespace_id_ == other_impl->namespace_id_; -} - -// AreaImpl ----------------------------- - -BrowserDomStorageSystem::AreaImpl::AreaImpl( - const base::WeakPtr& parent, - int namespace_id, const GURL& origin) - : parent_(parent), - connection_id_(0) { - if (Host()) { - connection_id_ = (parent_->next_connection_id_)++; - Host()->OpenStorageArea(connection_id_, namespace_id, origin); - } -} - -BrowserDomStorageSystem::AreaImpl::~AreaImpl() { - if (Host()) - Host()->CloseStorageArea(connection_id_); -} - -unsigned BrowserDomStorageSystem::AreaImpl::length() { - if (Host()) - return Host()->GetAreaLength(connection_id_); - return 0; -} - -WebString BrowserDomStorageSystem::AreaImpl::key(unsigned index) { - if (Host()) - return Host()->GetAreaKey(connection_id_, index); - return NullableString16(true); -} - -WebString BrowserDomStorageSystem::AreaImpl::getItem(const WebString& key) { - if (Host()) - return Host()->GetAreaItem(connection_id_, key); - return NullableString16(true); -} - -void BrowserDomStorageSystem::AreaImpl::setItem( - const WebString& key, const WebString& newValue, - const WebURL& pageUrl, Result& result) { - result = ResultBlockedByQuota; - if (!Host()) - return; - - base::AutoReset auto_reset(&parent_->area_being_processed_, this); - NullableString16 unused; - if (!Host()->SetAreaItem(connection_id_, key, newValue, pageUrl, - &unused)) - return; - - result = ResultOK; -} - -void BrowserDomStorageSystem::AreaImpl::removeItem( - const WebString& key, const WebURL& pageUrl) { - if (!Host()) - return; - - base::AutoReset auto_reset(&parent_->area_being_processed_, this); - string16 notused; - Host()->RemoveAreaItem(connection_id_, key, pageUrl, ¬used); -} - -void BrowserDomStorageSystem::AreaImpl::clear(const WebURL& pageUrl) { - if (!Host()) - return; - - base::AutoReset auto_reset(&parent_->area_being_processed_, this); - Host()->ClearArea(connection_id_, pageUrl); -} - -// BrowserDomStorageSystem ----------------------------- - -BrowserDomStorageSystem* BrowserDomStorageSystem::g_instance_; - -BrowserDomStorageSystem::BrowserDomStorageSystem() - : weak_factory_(this), - area_being_processed_(NULL), - next_connection_id_(1) { - base::FilePath local_storage_path; - base::FilePath cache_path(_Context->cache_path()); - if (!cache_path.empty()) { - local_storage_path = cache_path.Append(FILE_PATH_LITERAL("Local Storage")); - if (!file_util::PathExists(local_storage_path) && - !file_util::CreateDirectory(local_storage_path)) { - LOG(WARNING) << "Failed to create Local Storage directory"; - local_storage_path.clear(); - } - } - - base::SequencedWorkerPool* worker_pool = _Context->blocking_pool(); - - context_ = new DomStorageContext(local_storage_path, base::FilePath(), NULL, - new DomStorageWorkerPoolTaskRunner( - worker_pool, - worker_pool->GetNamedSequenceToken("dom_storage_primary"), - worker_pool->GetNamedSequenceToken("dom_storage_commit"), - CefThread::GetMessageLoopProxyForThread(CefThread::FILE))); - - host_.reset(new DomStorageHost(context_)); - - DCHECK(!g_instance_); - g_instance_ = this; - context_->AddEventObserver(this); -} - -BrowserDomStorageSystem::~BrowserDomStorageSystem() { - g_instance_ = NULL; - host_.reset(); - context_->RemoveEventObserver(this); -} - -WebStorageNamespace* BrowserDomStorageSystem::CreateLocalStorageNamespace() { - return new NamespaceImpl(weak_factory_.GetWeakPtr()); -} - -WebStorageNamespace* BrowserDomStorageSystem::CreateSessionStorageNamespace() { - int id = context_->AllocateSessionId(); - context_->CreateSessionNamespace(id, std::string()); - return new NamespaceImpl(weak_factory_.GetWeakPtr(), id); -} - -void BrowserDomStorageSystem::OnDomStorageItemSet( - const dom_storage::DomStorageArea* area, - const string16& key, - const string16& new_value, - const NullableString16& old_value, - const GURL& page_url) { - DispatchDomStorageEvent(area, page_url, - NullableString16(key, false), - NullableString16(new_value, false), - old_value); -} - -void BrowserDomStorageSystem::OnDomStorageItemRemoved( - const dom_storage::DomStorageArea* area, - const string16& key, - const string16& old_value, - const GURL& page_url) { - DispatchDomStorageEvent(area, page_url, - NullableString16(key, false), - NullableString16(true), - NullableString16(old_value, false)); -} - -void BrowserDomStorageSystem::OnDomStorageAreaCleared( - const dom_storage::DomStorageArea* area, - const GURL& page_url) { - DispatchDomStorageEvent(area, page_url, - NullableString16(true), - NullableString16(true), - NullableString16(true)); -} - -void BrowserDomStorageSystem::DispatchDomStorageEvent( - const dom_storage::DomStorageArea* area, - const GURL& page_url, - const NullableString16& key, - const NullableString16& new_value, - const NullableString16& old_value) { - DCHECK(area_being_processed_); - if (area->namespace_id() == dom_storage::kLocalStorageNamespaceId) { - WebStorageEventDispatcher::dispatchLocalStorageEvent( - key, - old_value, - new_value, - area->origin(), - page_url, - area_being_processed_, - true /* originatedInProcess */); - } else { - NamespaceImpl session_namespace_for_event_dispatch( - base::WeakPtr(), area->namespace_id()); - WebStorageEventDispatcher::dispatchSessionStorageEvent( - key, - old_value, - new_value, - area->origin(), - page_url, - session_namespace_for_event_dispatch, - area_being_processed_, - true /* originatedInProcess */); - } -} diff --git a/cef1/libcef/browser_dom_storage_system.h b/cef1/libcef/browser_dom_storage_system.h deleted file mode 100644 index 0bcdb0a60..000000000 --- a/cef1/libcef/browser_dom_storage_system.h +++ /dev/null @@ -1,80 +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. - -#ifndef CEF_LIBCEF_BROWSER_DOM_STORAGE_SYSTEM_H_ -#define CEF_LIBCEF_BROWSER_DOM_STORAGE_SYSTEM_H_ -#pragma once - -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" -#include "webkit/dom_storage/dom_storage_context.h" - -namespace dom_storage { -class DomStorageHost; -} -namespace WebKit { -class WebStorageNamespace; -} - -// Class that composes dom_storage classes together for use -// in simple single process environments like test_shell and DRT. -class BrowserDomStorageSystem - : public dom_storage::DomStorageContext::EventObserver { - public: - static BrowserDomStorageSystem& instance() { return *g_instance_; } - - BrowserDomStorageSystem(); - virtual ~BrowserDomStorageSystem(); - - // The Create<<>> calls are bound to WebKit api that the embedder - // is responsible for implementing. These factories are called strictly - // on the 'main' webkit thread. Ditto the methods on the returned - // objects. SimplDomStorageSystem manufactures implementations of the - // WebStorageNamespace and WebStorageArea interfaces that ultimately - // plumb Get, Set, Remove, and Clear javascript calls to the dom_storage - // classes. The caller (webkit/webcore) takes ownership of the returned - // instances and will delete them when done. - WebKit::WebStorageNamespace* CreateLocalStorageNamespace(); - WebKit::WebStorageNamespace* CreateSessionStorageNamespace(); - - private: - // Inner classes that implement the WebKit WebStorageNamespace and - // WebStorageArea interfaces in terms of dom_storage classes. - class NamespaceImpl; - class AreaImpl; - - // DomStorageContext::EventObserver implementation which - // calls into webkit/webcore to dispatch events. - virtual void OnDomStorageItemSet( - const dom_storage::DomStorageArea* area, - const string16& key, - const string16& new_value, - const NullableString16& old_value, - const GURL& page_url) OVERRIDE; - virtual void OnDomStorageItemRemoved( - const dom_storage::DomStorageArea* area, - const string16& key, - const string16& old_value, - const GURL& page_url) OVERRIDE; - virtual void OnDomStorageAreaCleared( - const dom_storage::DomStorageArea* area, - const GURL& page_url) OVERRIDE; - - void DispatchDomStorageEvent( - const dom_storage::DomStorageArea* area, - const GURL& page_url, - const NullableString16& key, - const NullableString16& new_value, - const NullableString16& old_value); - - base::WeakPtrFactory weak_factory_; - scoped_refptr context_; - scoped_ptr host_; - AreaImpl* area_being_processed_; - int next_connection_id_; - - static BrowserDomStorageSystem* g_instance_; -}; - -#endif // CEF_LIBCEF_BROWSER_DOM_STORAGE_SYSTEM_H_ diff --git a/cef1/libcef/browser_drag_delegate_win.cc b/cef1/libcef/browser_drag_delegate_win.cc deleted file mode 100644 index 1ebe51663..000000000 --- a/cef1/libcef/browser_drag_delegate_win.cc +++ /dev/null @@ -1,371 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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 "libcef/browser_drag_delegate_win.h" - -#include -#include - -#include "libcef/browser_impl.h" -#include "libcef/browser_webview_delegate.h" -#include "libcef/cef_thread.h" -#include "libcef/drag_download_file.h" -#include "libcef/drag_download_util.h" -#include "libcef/download_util.h" -#include "libcef/web_drag_source_win.h" -#include "libcef/web_drag_utils_win.h" -#include "libcef/web_drop_target_win.h" - -#include "base/bind.h" -#include "base/pickle.h" -#include "base/utf_string_conversions.h" -#include "net/base/file_stream.h" -#include "net/base/net_util.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/base/clipboard/clipboard_util_win.h" -#include "ui/base/clipboard/custom_data_helper.h" -#include "ui/base/dragdrop/drag_utils.h" -#include "ui/gfx/image/image_skia.h" -#include "webkit/glue/webdropdata.h" - -using WebKit::WebDragOperationsMask; -using WebKit::WebDragOperationCopy; -using WebKit::WebDragOperationLink; -using WebKit::WebDragOperationMove; -using WebKit::WebView; - -namespace { - -HHOOK msg_hook = NULL; -DWORD drag_out_thread_id = 0; -bool mouse_up_received = false; - -LRESULT CALLBACK MsgFilterProc(int code, WPARAM wparam, LPARAM lparam) { - if (code == base::MessagePumpForUI::kMessageFilterCode && - !mouse_up_received) { - MSG* msg = reinterpret_cast(lparam); - // We do not care about WM_SYSKEYDOWN and WM_SYSKEYUP because when ALT key - // is pressed down on drag-and-drop, it means to create a link. - if (msg->message == WM_MOUSEMOVE || msg->message == WM_LBUTTONUP || - msg->message == WM_KEYDOWN || msg->message == WM_KEYUP) { - // Forward the message from the UI thread to the drag-and-drop thread. - PostThreadMessage(drag_out_thread_id, - msg->message, - msg->wParam, - msg->lParam); - - // If the left button is up, we do not need to forward the message any - // more. - if (msg->message == WM_LBUTTONUP || !(GetKeyState(VK_LBUTTON) & 0x8000)) - mouse_up_received = true; - - return TRUE; - } - } - return CallNextHookEx(msg_hook, code, wparam, lparam); -} - -} // namespace - -class DragDropThread : public base::Thread { - public: - explicit DragDropThread(BrowserDragDelegate* drag_handler) - : base::Thread("Chrome_DragDropThread"), - drag_handler_(drag_handler) { - } - - virtual ~DragDropThread() { - Thread::Stop(); - } - - protected: - // base::Thread implementations: - virtual void Init() { - int ole_result = OleInitialize(NULL); - DCHECK(ole_result == S_OK); - } - - virtual void CleanUp() { - OleUninitialize(); - } - - private: - // Hold a reference count to BrowserDragDelegate to make sure that it is - // always alive in the thread lifetime. - scoped_refptr drag_handler_; - - DISALLOW_COPY_AND_ASSIGN(DragDropThread); -}; - -BrowserDragDelegate::BrowserDragDelegate(BrowserWebViewDelegate* view) - : drag_drop_thread_id_(0), - view_(view), - drag_ended_(false) { -} - -BrowserDragDelegate::~BrowserDragDelegate() { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - DCHECK(!drag_drop_thread_.get()); -} - -void BrowserDragDelegate::StartDragging(const WebDropData& drop_data, - WebDragOperationsMask ops, - const gfx::ImageSkia& image, - const gfx::Vector2d& image_offset) { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - CefBrowserImpl* browser = view_->GetBrowser(); - WebView* web_view = browser->UIT_GetWebView(); - drag_source_ = new WebDragSource(browser->UIT_GetWebViewWndHandle(), - web_view); - - const GURL& page_url = web_view->mainFrame()->document().url(); - const std::string& page_encoding = - web_view->mainFrame()->document().encoding().utf8(); - - // If it is not drag-out, do the drag-and-drop in the current UI thread. - if (drop_data.download_metadata.empty()) { - DoDragging(drop_data, ops, page_url, page_encoding, image, image_offset); - CefThread::PostTask( - CefThread::UI, FROM_HERE, - base::Bind(&BrowserDragDelegate::EndDragging, this)); - return; - } - - // Start a background thread to do the drag-and-drop. - DCHECK(!drag_drop_thread_.get()); - drag_drop_thread_.reset(new DragDropThread(this)); - base::Thread::Options options; - options.message_loop_type = base::MessageLoop::TYPE_UI; - if (drag_drop_thread_->StartWithOptions(options)) { - drag_drop_thread_->message_loop()->PostTask( - FROM_HERE, - base::Bind(&BrowserDragDelegate::StartBackgroundDragging, - this, - drop_data, - ops, - page_url, - page_encoding, - image, - image_offset)); - } - - // Install a hook procedure to monitor the messages so that we can forward - // the appropriate ones to the background thread. - drag_out_thread_id = drag_drop_thread_->thread_id(); - mouse_up_received = false; - DCHECK(!msg_hook); - msg_hook = SetWindowsHookEx(WH_MSGFILTER, - MsgFilterProc, - NULL, - GetCurrentThreadId()); - - // Attach the input state of the background thread to the UI thread so that - // SetCursor can work from the background thread. - AttachThreadInput(drag_out_thread_id, GetCurrentThreadId(), TRUE); -} - -void BrowserDragDelegate::StartBackgroundDragging( - const WebDropData& drop_data, - WebDragOperationsMask ops, - const GURL& page_url, - const std::string& page_encoding, - const gfx::ImageSkia& image, - const gfx::Vector2d& image_offset) { - drag_drop_thread_id_ = base::PlatformThread::CurrentId(); - - DoDragging(drop_data, ops, page_url, page_encoding, image, image_offset); - CefThread::PostTask( - CefThread::UI, FROM_HERE, - base::Bind(&BrowserDragDelegate::EndDragging, this)); -} - -void BrowserDragDelegate::PrepareDragForDownload( - const WebDropData& drop_data, - ui::OSExchangeData* data, - const GURL& page_url, - const std::string& page_encoding) { - // Parse the download metadata. - string16 mime_type; - base::FilePath file_name; - GURL download_url; - if (!drag_download_util::ParseDownloadMetadata(drop_data.download_metadata, - &mime_type, - &file_name, - &download_url)) - return; - - // Generate the download filename. - std::string content_disposition = - "attachment; filename=" + UTF16ToUTF8(file_name.value()); - base::FilePath generated_file_name; - download_util::GenerateFileName(download_url, - content_disposition, - std::string(), - UTF16ToUTF8(mime_type), - std::string(), - &generated_file_name); - - // Provide the data as file (CF_HDROP). A temporary download file with the - // Zone.Identifier ADS (Alternate Data Stream) attached will be created. - scoped_ptr empty_file_stream; - scoped_refptr download_file = - new DragDownloadFile(generated_file_name, - empty_file_stream.Pass(), - download_url, - page_url, - page_encoding, - view_); - ui::OSExchangeData::DownloadFileInfo file_download(base::FilePath(), - download_file.get()); - data->SetDownloadFileInfo(file_download); - - // Enable asynchronous operation. - ui::OSExchangeDataProviderWin::GetIAsyncOperation(*data)->SetAsyncMode(TRUE); -} - -void BrowserDragDelegate::PrepareDragForFileContents( - const WebDropData& drop_data, ui::OSExchangeData* data) { - static const int kMaxFilenameLength = 255; // FAT and NTFS - base::FilePath file_name(drop_data.file_description_filename); - string16 extension = file_name.Extension(); - file_name = file_name.BaseName().RemoveExtension(); - // Images without ALT text will only have a file extension so we need to - // synthesize one from the provided extension and URL. - if (file_name.value().empty()) { - // Retrieve the name from the URL. - file_name = base::FilePath( - net::GetSuggestedFilename(drop_data.url, "", "", "", "", "")); - if (file_name.value().size() + extension.size() > kMaxFilenameLength) { - file_name = base::FilePath(file_name.value().substr( - 0, kMaxFilenameLength - extension.size())); - } - } - file_name = file_name.ReplaceExtension(extension); - data->SetFileContents(file_name, drop_data.file_contents); -} - -void BrowserDragDelegate::PrepareDragForUrl(const WebDropData& drop_data, - ui::OSExchangeData* data) { - if (drop_data.url.SchemeIs("javascript")) { - // We don't want to allow javascript URLs to be dragged to the desktop. - } else { - data->SetURL(drop_data.url, drop_data.url_title); - } -} - -void BrowserDragDelegate::DoDragging(const WebDropData& drop_data, - WebDragOperationsMask ops, - const GURL& page_url, - const std::string& page_encoding, - const gfx::ImageSkia& image, - const gfx::Vector2d& image_offset) { - ui::OSExchangeData data; - - if (!drop_data.download_metadata.empty()) { - PrepareDragForDownload(drop_data, &data, page_url, page_encoding); - - // Set the observer. - ui::OSExchangeDataProviderWin::GetDataObjectImpl(data)->set_observer(this); - } - - // We set the file contents before the URL because the URL also sets file - // contents (to a .URL shortcut). We want to prefer file content data over - // a shortcut so we add it first. - if (!drop_data.file_contents.empty()) - PrepareDragForFileContents(drop_data, &data); - if (!drop_data.html.string().empty()) - data.SetHtml(drop_data.html.string(), drop_data.html_base_url); - // We set the text contents before the URL because the URL also sets text - // content. - if (!drop_data.text.string().empty()) - data.SetString(drop_data.text.string()); - if (drop_data.url.is_valid()) - PrepareDragForUrl(drop_data, &data); - if (!drop_data.custom_data.empty()) { - Pickle pickle; - ui::WriteCustomDataToPickle(drop_data.custom_data, &pickle); - data.SetPickledData(ui::ClipboardUtil::GetWebCustomDataFormat()->cfFormat, - pickle); - } - - // Set drag image. - if (!image.isNull()) { - drag_utils::SetDragImageOnDataObject( - gfx::ImageSkia(image), gfx::Size(image.width(), image.height()), - image_offset, &data); - } - - // We need to enable recursive tasks on the message loop so we can get - // updates while in the system DoDragDrop loop. - DWORD effect; - { - base::MessageLoop::ScopedNestableTaskAllower allow( - base::MessageLoop::current()); - DoDragDrop(ui::OSExchangeDataProviderWin::GetIDataObject(data), - drag_source_, - web_drag_utils_win::WebDragOpMaskToWinDragOpMask(ops), - &effect); - } - - // Normally, the drop and dragend events get dispatched in the system - // DoDragDrop message loop so it'd be too late to set the effect to send back - // to the renderer here. However, we use PostTask to delay the execution of - // WebDragSource::OnDragSourceDrop, which means that the delayed dragend - // callback to the renderer doesn't run until this has been set to the correct - // value. - drag_source_->set_effect(effect); -} - -void BrowserDragDelegate::EndDragging() { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - if (drag_ended_) - return; - drag_ended_ = true; - - if (msg_hook) { - AttachThreadInput(drag_out_thread_id, GetCurrentThreadId(), FALSE); - UnhookWindowsHookEx(msg_hook); - msg_hook = NULL; - } - - view_->EndDragging(); -} - -void BrowserDragDelegate::CancelDrag() { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - drag_source_->CancelDrag(); -} - -void BrowserDragDelegate::CloseThread() { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - drag_drop_thread_.reset(); -} - -void BrowserDragDelegate::OnWaitForData() { - DCHECK(drag_drop_thread_id_ == base::PlatformThread::CurrentId()); - - // When the left button is released and we start to wait for the data, end - // the dragging before DoDragDrop returns. This makes the page leave the drag - // mode so that it can start to process the normal input events. - CefThread::PostTask( - CefThread::UI, FROM_HERE, - base::Bind(&BrowserDragDelegate::EndDragging, this)); -} - -void BrowserDragDelegate::OnDataObjectDisposed() { - DCHECK(drag_drop_thread_id_ == base::PlatformThread::CurrentId()); - - // The drag-and-drop thread is only closed after OLE is done with - // DataObjectImpl. - CefThread::PostTask( - CefThread::UI, FROM_HERE, - base::Bind(&BrowserDragDelegate::CloseThread, this)); -} diff --git a/cef1/libcef/browser_drag_delegate_win.h b/cef1/libcef/browser_drag_delegate_win.h deleted file mode 100644 index 6166c7ecc..000000000 --- a/cef1/libcef/browser_drag_delegate_win.h +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2009 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. - -#ifndef CEF_LIBCEF_BROWSER_DRAG_DELEGATE_WIN_H_ -#define CEF_LIBCEF_BROWSER_DRAG_DELEGATE_WIN_H_ -#pragma once - -#include - -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" -#include "base/threading/platform_thread.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h" -#include "ui/base/dragdrop/os_exchange_data_provider_win.h" -#include "ui/gfx/image/image_skia.h" -#include "ui/gfx/point.h" - -class BrowserWebViewDelegate; -class DragDropThread; -class WebDragSource; -struct WebDropData; - -// Windows-specific drag-and-drop handling. -// If we are dragging a virtual file out of the browser, we use a background -// thread to do the drag-and-drop because we do not want to run nested -// message loop in the UI thread. For all other cases, the drag-and-drop happens -// in the UI thread. -class BrowserDragDelegate - : public ui::DataObjectImpl::Observer, - public base::RefCountedThreadSafe { - public: - explicit BrowserDragDelegate(BrowserWebViewDelegate* view); - virtual ~BrowserDragDelegate(); - - // Called on UI thread. - void StartDragging(const WebDropData& drop_data, - WebKit::WebDragOperationsMask ops, - const gfx::ImageSkia& image, - const gfx::Vector2d& image_offset); - void CancelDrag(); - - // DataObjectImpl::Observer implementation. - // Called on drag-and-drop thread. - virtual void OnWaitForData(); - virtual void OnDataObjectDisposed(); - - private: - // Called on either UI thread or drag-and-drop thread. - void PrepareDragForDownload(const WebDropData& drop_data, - ui::OSExchangeData* data, - const GURL& page_url, - const std::string& page_encoding); - void PrepareDragForFileContents(const WebDropData& drop_data, - ui::OSExchangeData* data); - void PrepareDragForUrl(const WebDropData& drop_data, - ui::OSExchangeData* data); - void DoDragging(const WebDropData& drop_data, - WebKit::WebDragOperationsMask ops, - const GURL& page_url, - const std::string& page_encoding, - const gfx::ImageSkia& image, - const gfx::Vector2d& image_offset); - - // Called on drag-and-drop thread. - void StartBackgroundDragging(const WebDropData& drop_data, - WebKit::WebDragOperationsMask ops, - const GURL& page_url, - const std::string& page_encoding, - const gfx::ImageSkia& image, - const gfx::Vector2d& image_offset); - // Called on UI thread. - void EndDragging(); - void CloseThread(); - - // For debug check only. Access only on drag-and-drop thread. - base::PlatformThreadId drag_drop_thread_id_; - - // All the member variables below are accessed on UI thread. - - // Keep track of the BrowserWebViewDelegate it is associated with. - BrowserWebViewDelegate* view_; - - // |drag_source_| is our callback interface passed to the system when we - // want to initiate a drag and drop operation. We use it to tell if a - // drag operation is happening. - scoped_refptr drag_source_; - - // The thread used by the drag-out download. This is because we want to avoid - // running nested message loop in main UI thread. - scoped_ptr drag_drop_thread_; - - // The flag to guard that EndDragging is not called twice. - bool drag_ended_; - - DISALLOW_COPY_AND_ASSIGN(BrowserDragDelegate); -}; - - -#endif // CEF_LIBCEF_BROWSER_DRAG_DELEGATE_WIN_H_ diff --git a/cef1/libcef/browser_file_system.cc b/cef1/libcef/browser_file_system.cc deleted file mode 100644 index ef401f93c..000000000 --- a/cef1/libcef/browser_file_system.cc +++ /dev/null @@ -1,461 +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 "libcef/browser_file_system.h" -#include "libcef/browser_file_writer.h" -#include "libcef/cef_context.h" -#include "libcef/cef_thread.h" - -#include "base/bind.h" -#include "base/files/file_path.h" -#include "base/message_loop.h" -#include "base/message_loop_proxy.h" -#include "base/time.h" -#include "base/utf_string_conversions.h" -#include "googleurl/src/gurl.h" -#include "net/base/mime_util.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebFileInfo.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebVector.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileSystemCallbacks.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileSystemEntry.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" -#include "webkit/base/file_path_string_conversions.h" -#include "webkit/blob/blob_storage_controller.h" -#include "webkit/fileapi/external_mount_points.h" -#include "webkit/fileapi/file_permission_policy.h" -#include "webkit/fileapi/file_system_mount_point_provider.h" -#include "webkit/fileapi/file_system_task_runners.h" -#include "webkit/fileapi/file_system_url.h" -#include "webkit/fileapi/file_system_util.h" -#include "webkit/fileapi/mock_file_system_options.h" - -using base::WeakPtr; - -using WebKit::WebFileInfo; -using WebKit::WebFileSystem; -using WebKit::WebFileSystemCallbacks; -using WebKit::WebFileSystemEntry; -using WebKit::WebFileWriter; -using WebKit::WebFileWriterClient; -using WebKit::WebFrame; -using WebKit::WebSecurityOrigin; -using WebKit::WebString; -using WebKit::WebURL; -using WebKit::WebVector; - -using webkit_blob::BlobData; -using webkit_blob::BlobStorageController; -using fileapi::FileSystemContext; -using fileapi::FileSystemOperation; -using fileapi::FileSystemTaskRunners; -using fileapi::FileSystemURL; - -namespace { -base::MessageLoop* g_io_thread; -webkit_blob::BlobStorageController* g_blob_storage_controller; - -void RegisterBlob(const GURL& blob_url, const base::FilePath& file_path) { - DCHECK(g_blob_storage_controller); - - base::FilePath::StringType extension = file_path.Extension(); - if (!extension.empty()) - extension = extension.substr(1); // Strip leading ".". - - // This may fail, but then we'll be just setting the empty mime type. - std::string mime_type; - net::GetWellKnownMimeTypeFromExtension(extension, &mime_type); - - BlobData::Item item; - item.SetToFilePathRange(file_path, 0, -1, base::Time()); - g_blob_storage_controller->StartBuildingBlob(blob_url); - g_blob_storage_controller->AppendBlobDataItem(blob_url, item); - g_blob_storage_controller->FinishBuildingBlob(blob_url, mime_type); -} - -} // namespace - -BrowserFileSystem::BrowserFileSystem() { -} - -void BrowserFileSystem::CreateContext() { - if (file_system_context_.get()) - return; - std::vector additional_allowed_schemes; - additional_allowed_schemes.push_back("file"); - - file_system_context_ = new FileSystemContext( - make_scoped_ptr(new FileSystemTaskRunners( - CefThread::GetMessageLoopProxyForThread(CefThread::IO), - CefThread::GetMessageLoopProxyForThread(CefThread::FILE), - CefThread::GetMessageLoopProxyForThread(CefThread::FILE))), - fileapi::ExternalMountPoints::CreateRefCounted().get(), - NULL /* special storage policy */, - NULL /* quota manager */, - _Context->cache_path(), - fileapi::FileSystemOptions( - fileapi::FileSystemOptions::PROFILE_MODE_NORMAL, - additional_allowed_schemes)); -} - -BrowserFileSystem::~BrowserFileSystem() { -} - -void BrowserFileSystem::OpenFileSystem( - WebFrame* frame, - WebKit::WebFileSystemType type, - long long, bool create, // NOLINT(runtime/int) - WebFileSystemCallbacks* callbacks) { - if (!frame || !file_system_context_.get()) { - // The FileSystem temp directory was not initialized successfully. - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - - GURL origin_url(frame->document().securityOrigin().toString()); - file_system_context_->OpenFileSystem( - origin_url, static_cast(type), create, - OpenFileSystemHandler(callbacks)); -} - -void BrowserFileSystem::DeleteFileSystem( - WebFrame* frame, - WebKit::WebFileSystemType type, - WebFileSystemCallbacks* callbacks) { - if (!frame || !file_system_context_.get()) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - - GURL origin_url(frame->document().securityOrigin().toString()); - file_system_context_->DeleteFileSystem( - origin_url, static_cast(type), - DeleteFileSystemHandler(callbacks)); -} - -void BrowserFileSystem::move( - const WebURL& src_path, - const WebURL& dest_path, WebFileSystemCallbacks* callbacks) { - FileSystemURL src_url(file_system_context()->CrackURL(src_path)); - FileSystemURL dest_url(file_system_context()->CrackURL(dest_path)); - if (!HasFilePermission(src_url, fileapi::kWriteFilePermissions) || - !HasFilePermission(dest_url, fileapi::kCreateFilePermissions)) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - GetNewOperation(src_url)->Move(src_url, dest_url, - FinishHandler(callbacks)); -} - -void BrowserFileSystem::copy( - const WebURL& src_path, const WebURL& dest_path, - WebFileSystemCallbacks* callbacks) { - FileSystemURL src_url(file_system_context()->CrackURL(src_path)); - FileSystemURL dest_url(file_system_context()->CrackURL(dest_path)); - if (!HasFilePermission(src_url, fileapi::kReadFilePermissions) || - !HasFilePermission(dest_url, fileapi::kCreateFilePermissions)) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - GetNewOperation(src_url)->Copy(src_url, dest_url, - FinishHandler(callbacks)); -} - -void BrowserFileSystem::remove( - const WebURL& path, WebFileSystemCallbacks* callbacks) { - FileSystemURL url(file_system_context()->CrackURL(path)); - if (!HasFilePermission(url, fileapi::kWriteFilePermissions)) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - GetNewOperation(url)->Remove(url, false /* recursive */, - FinishHandler(callbacks)); -} - -void BrowserFileSystem::removeRecursively( - const WebURL& path, WebFileSystemCallbacks* callbacks) { - FileSystemURL url(file_system_context()->CrackURL(path)); - if (!HasFilePermission(url, fileapi::kWriteFilePermissions)) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - GetNewOperation(url)->Remove(url, true /* recursive */, - FinishHandler(callbacks)); -} - -void BrowserFileSystem::readMetadata( - const WebURL& path, WebFileSystemCallbacks* callbacks) { - FileSystemURL url(file_system_context()->CrackURL(path)); - if (!HasFilePermission(url, fileapi::kReadFilePermissions)) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - GetNewOperation(url)->GetMetadata(url, GetMetadataHandler(callbacks)); -} - -void BrowserFileSystem::createFile( - const WebURL& path, bool exclusive, WebFileSystemCallbacks* callbacks) { - FileSystemURL url(file_system_context()->CrackURL(path)); - if (!HasFilePermission(url, fileapi::kCreateFilePermissions)) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - GetNewOperation(url)->CreateFile(url, exclusive, FinishHandler(callbacks)); -} - -void BrowserFileSystem::createDirectory( - const WebURL& path, bool exclusive, WebFileSystemCallbacks* callbacks) { - FileSystemURL url(file_system_context()->CrackURL(path)); - if (!HasFilePermission(url, fileapi::kCreateFilePermissions)) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - GetNewOperation(url)->CreateDirectory(url, exclusive, false, - FinishHandler(callbacks)); -} - -void BrowserFileSystem::fileExists( - const WebURL& path, WebFileSystemCallbacks* callbacks) { - FileSystemURL url(file_system_context()->CrackURL(path)); - if (!HasFilePermission(url, fileapi::kReadFilePermissions)) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - GetNewOperation(url)->FileExists(url, FinishHandler(callbacks)); -} - -void BrowserFileSystem::directoryExists( - const WebURL& path, WebFileSystemCallbacks* callbacks) { - FileSystemURL url(file_system_context()->CrackURL(path)); - if (!HasFilePermission(url, fileapi::kReadFilePermissions)) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - GetNewOperation(url)->DirectoryExists(url, FinishHandler(callbacks)); -} - -void BrowserFileSystem::readDirectory( - const WebURL& path, WebFileSystemCallbacks* callbacks) { - FileSystemURL url(file_system_context()->CrackURL(path)); - if (!HasFilePermission(url, fileapi::kReadFilePermissions)) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - GetNewOperation(url)->ReadDirectory(url, ReadDirectoryHandler(callbacks)); -} - -WebFileWriter* BrowserFileSystem::createFileWriter( - const WebURL& path, WebFileWriterClient* client) { - return new BrowserFileWriter(path, client, file_system_context_.get()); -} - -void BrowserFileSystem::createSnapshotFileAndReadMetadata( - const WebURL& path, - WebFileSystemCallbacks* callbacks) { - FileSystemURL url(file_system_context()->CrackURL(path)); - if (!HasFilePermission(url, fileapi::kReadFilePermissions)) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - GetNewOperation(url)->CreateSnapshotFile( - url, SnapshotFileHandler(callbacks)); -} - -// DEPRECATED -void BrowserFileSystem::createSnapshotFileAndReadMetadata( - const WebURL& blobURL, - const WebURL& path, - WebFileSystemCallbacks* callbacks) { - FileSystemURL url(file_system_context()->CrackURL(path)); - if (!HasFilePermission(url, fileapi::kReadFilePermissions)) { - callbacks->didFail(WebKit::WebFileErrorSecurity); - return; - } - GetNewOperation(url)->CreateSnapshotFile( - url, SnapshotFileHandler_Deprecated(blobURL, callbacks)); -} - -// static -void BrowserFileSystem::InitializeOnIOThread( - webkit_blob::BlobStorageController* blob_storage_controller) { - g_io_thread = base::MessageLoop::current(); - g_blob_storage_controller = blob_storage_controller; -} - -// static -void BrowserFileSystem::CleanupOnIOThread() { - g_io_thread = NULL; - g_blob_storage_controller = NULL; -} - -bool BrowserFileSystem::HasFilePermission( - const fileapi::FileSystemURL& url, int permissions) { - if (!url.is_valid()) - return false; - fileapi::FileSystemMountPointProvider* mount_point_provider = - file_system_context_->GetMountPointProvider(url.type()); - DCHECK(mount_point_provider); - // In test_shell we don't perform further detailed security checks if it's - // not specifically forbidden by ALWAYS_DENY. - return (mount_point_provider->GetPermissionPolicy(url, permissions) - != fileapi::FILE_PERMISSION_ALWAYS_DENY); -} - -FileSystemOperation* BrowserFileSystem::GetNewOperation( - const fileapi::FileSystemURL& url) { - return file_system_context_->CreateFileSystemOperation(url, NULL); -} - -FileSystemOperation::StatusCallback -BrowserFileSystem::FinishHandler(WebFileSystemCallbacks* callbacks) { - return base::Bind(&BrowserFileSystem::DidFinish, - AsWeakPtr(), base::Unretained(callbacks)); -} - -FileSystemOperation::ReadDirectoryCallback -BrowserFileSystem::ReadDirectoryHandler(WebFileSystemCallbacks* callbacks) { - return base::Bind(&BrowserFileSystem::DidReadDirectory, - AsWeakPtr(), base::Unretained(callbacks)); -} - -FileSystemOperation::GetMetadataCallback -BrowserFileSystem::GetMetadataHandler(WebFileSystemCallbacks* callbacks) { - return base::Bind(&BrowserFileSystem::DidGetMetadata, - AsWeakPtr(), base::Unretained(callbacks)); -} - -FileSystemContext::OpenFileSystemCallback -BrowserFileSystem::OpenFileSystemHandler(WebFileSystemCallbacks* callbacks) { - return base::Bind(&BrowserFileSystem::DidOpenFileSystem, - AsWeakPtr(), base::Unretained(callbacks)); -} - -FileSystemContext::DeleteFileSystemCallback -BrowserFileSystem::DeleteFileSystemHandler(WebFileSystemCallbacks* callbacks) { - return base::Bind(&BrowserFileSystem::DidDeleteFileSystem, - AsWeakPtr(), callbacks); -} - -FileSystemOperation::SnapshotFileCallback -BrowserFileSystem::SnapshotFileHandler( - WebFileSystemCallbacks* callbacks) { - return base::Bind(&BrowserFileSystem::DidCreateSnapshotFile, - AsWeakPtr(), base::Unretained(callbacks)); -} - -FileSystemOperation::SnapshotFileCallback -BrowserFileSystem::SnapshotFileHandler_Deprecated( - const GURL& blob_url, - WebFileSystemCallbacks* callbacks) { - return base::Bind(&BrowserFileSystem::DidCreateSnapshotFile_Deprecated, - AsWeakPtr(), blob_url, base::Unretained(callbacks)); -} - -void BrowserFileSystem::DidFinish(WebFileSystemCallbacks* callbacks, - base::PlatformFileError result) { - if (result == base::PLATFORM_FILE_OK) - callbacks->didSucceed(); - else - callbacks->didFail(fileapi::PlatformFileErrorToWebFileError(result)); -} - -void BrowserFileSystem::DidGetMetadata(WebFileSystemCallbacks* callbacks, - base::PlatformFileError result, - const base::PlatformFileInfo& info, - const base::FilePath& platform_path) { - if (result == base::PLATFORM_FILE_OK) { - WebFileInfo web_file_info; - web_file_info.length = info.size; - web_file_info.modificationTime = info.last_modified.ToDoubleT(); - web_file_info.type = info.is_directory ? - WebFileInfo::TypeDirectory : WebFileInfo::TypeFile; - web_file_info.platformPath = - webkit_base::FilePathToWebString(platform_path); - callbacks->didReadMetadata(web_file_info); - } else { - callbacks->didFail(fileapi::PlatformFileErrorToWebFileError(result)); - } -} - -void BrowserFileSystem::DidReadDirectory( - WebFileSystemCallbacks* callbacks, - base::PlatformFileError result, - const std::vector& entries, - bool has_more) { - if (result == base::PLATFORM_FILE_OK) { - std::vector web_entries_vector; - for (std::vector::const_iterator it = - entries.begin(); it != entries.end(); ++it) { - WebFileSystemEntry entry; - entry.name = webkit_base::FilePathStringToWebString(it->name); - entry.isDirectory = it->is_directory; - web_entries_vector.push_back(entry); - } - WebVector web_entries = web_entries_vector; - callbacks->didReadDirectory(web_entries, has_more); - } else { - callbacks->didFail(fileapi::PlatformFileErrorToWebFileError(result)); - } -} - -void BrowserFileSystem::DidOpenFileSystem( - WebFileSystemCallbacks* callbacks, - base::PlatformFileError result, - const std::string& name, const GURL& root) { - if (result == base::PLATFORM_FILE_OK) { - if (!root.is_valid()) - callbacks->didFail(WebKit::WebFileErrorSecurity); - else - callbacks->didOpenFileSystem(WebString::fromUTF8(name), root); - } else { - callbacks->didFail(fileapi::PlatformFileErrorToWebFileError(result)); - } -} - -void BrowserFileSystem::DidDeleteFileSystem( - WebFileSystemCallbacks* callbacks, - base::PlatformFileError result) { - if (result == base::PLATFORM_FILE_OK) - callbacks->didSucceed(); - else - callbacks->didFail(fileapi::PlatformFileErrorToWebFileError(result)); -} - -void BrowserFileSystem::DidCreateSnapshotFile( - WebFileSystemCallbacks* callbacks, - base::PlatformFileError result, - const base::PlatformFileInfo& info, - const base::FilePath& platform_path, - const scoped_refptr& file_ref) { - if (result == base::PLATFORM_FILE_OK) { - WebFileInfo web_file_info; - web_file_info.length = info.size; - web_file_info.modificationTime = info.last_modified.ToDoubleT(); - web_file_info.type = info.is_directory ? - WebFileInfo::TypeDirectory : WebFileInfo::TypeFile; - web_file_info.platformPath = - webkit_base::FilePathToWebString(platform_path); - callbacks->didCreateSnapshotFile(web_file_info); - } else { - callbacks->didFail(fileapi::PlatformFileErrorToWebFileError(result)); - } -} - -void BrowserFileSystem::DidCreateSnapshotFile_Deprecated( - const GURL& blob_url, - WebFileSystemCallbacks* callbacks, - base::PlatformFileError result, - const base::PlatformFileInfo& info, - const base::FilePath& platform_path, - const scoped_refptr& file_ref) { - DCHECK(g_io_thread); - if (result == base::PLATFORM_FILE_OK) { - g_io_thread->PostTask( - FROM_HERE, - base::Bind(&RegisterBlob, blob_url, platform_path)); - } - DidGetMetadata(callbacks, result, info, platform_path); -} diff --git a/cef1/libcef/browser_file_system.h b/cef1/libcef/browser_file_system.h deleted file mode 100644 index badffb64c..000000000 --- a/cef1/libcef/browser_file_system.h +++ /dev/null @@ -1,166 +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. - -#ifndef CEF_LIBCEF_BROWSER_FILE_SYSTEM_H_ -#define CEF_LIBCEF_BROWSER_FILE_SYSTEM_H_ -#pragma once - -#include - -#include "base/files/file_util_proxy.h" -#include "base/id_map.h" -#include "base/memory/weak_ptr.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebFileSystem.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebFileSystemType.h" -#include "webkit/fileapi/file_system_context.h" -#include "webkit/fileapi/file_system_operation.h" -#include "webkit/fileapi/file_system_types.h" - -namespace WebKit { -class WebFileSystemCallbacks; -class WebFrame; -class WebURL; -} - -namespace fileapi { -class FileSystemContext; -class FileSystemURL; -} - -namespace webkit_blob { -class BlobStorageController; -} - -class BrowserFileSystem - : public WebKit::WebFileSystem, - public base::SupportsWeakPtr { - public: - BrowserFileSystem(); - virtual ~BrowserFileSystem(); - - void CreateContext(); - - void OpenFileSystem(WebKit::WebFrame* frame, - WebKit::WebFileSystemType type, - long long size, // NOLINT(runtime/int) - bool create, - WebKit::WebFileSystemCallbacks* callbacks); - void DeleteFileSystem(WebKit::WebFrame* frame, - WebKit::WebFileSystemType type, - WebKit::WebFileSystemCallbacks* callbacks); - - fileapi::FileSystemContext* file_system_context() { - return file_system_context_.get(); - } - - // WebKit::WebFileSystem implementation. - virtual void move( - const WebKit::WebURL& src_path, - const WebKit::WebURL& dest_path, - WebKit::WebFileSystemCallbacks*) OVERRIDE; - virtual void copy( - const WebKit::WebURL& src_path, - const WebKit::WebURL& dest_path, - WebKit::WebFileSystemCallbacks*) OVERRIDE; - virtual void remove( - const WebKit::WebURL& path, - WebKit::WebFileSystemCallbacks*) OVERRIDE; - virtual void removeRecursively( - const WebKit::WebURL& path, - WebKit::WebFileSystemCallbacks*) OVERRIDE; - virtual void readMetadata( - const WebKit::WebURL& path, - WebKit::WebFileSystemCallbacks*) OVERRIDE; - virtual void createFile( - const WebKit::WebURL& path, - bool exclusive, - WebKit::WebFileSystemCallbacks*) OVERRIDE; - virtual void createDirectory( - const WebKit::WebURL& path, - bool exclusive, - WebKit::WebFileSystemCallbacks*) OVERRIDE; - virtual void fileExists( - const WebKit::WebURL& path, - WebKit::WebFileSystemCallbacks*) OVERRIDE; - virtual void directoryExists( - const WebKit::WebURL& path, - WebKit::WebFileSystemCallbacks*) OVERRIDE; - virtual void readDirectory( - const WebKit::WebURL& path, - WebKit::WebFileSystemCallbacks*) OVERRIDE; - virtual WebKit::WebFileWriter* createFileWriter( - const WebKit::WebURL& path, WebKit::WebFileWriterClient*) OVERRIDE; - virtual void createSnapshotFileAndReadMetadata( - const WebKit::WebURL& path, - WebKit::WebFileSystemCallbacks* callbacks); - - // DEPRECATED - virtual void createSnapshotFileAndReadMetadata( - const WebKit::WebURL& blobURL, - const WebKit::WebURL& path, - WebKit::WebFileSystemCallbacks* callbacks); - - static void InitializeOnIOThread( - webkit_blob::BlobStorageController* blob_storage_controller); - static void CleanupOnIOThread(); - - private: - // Helpers. - bool HasFilePermission(const fileapi::FileSystemURL& url, int permissions); - fileapi::FileSystemOperation* GetNewOperation( - const fileapi::FileSystemURL& url); - - // Callback Handlers - fileapi::FileSystemOperation::StatusCallback FinishHandler( - WebKit::WebFileSystemCallbacks* callbacks); - fileapi::FileSystemOperation::GetMetadataCallback GetMetadataHandler( - WebKit::WebFileSystemCallbacks* callbacks); - fileapi::FileSystemOperation::ReadDirectoryCallback - ReadDirectoryHandler(WebKit::WebFileSystemCallbacks* callbacks); - fileapi::FileSystemContext::OpenFileSystemCallback OpenFileSystemHandler( - WebKit::WebFileSystemCallbacks* callbacks); - fileapi::FileSystemContext::DeleteFileSystemCallback DeleteFileSystemHandler( - WebKit::WebFileSystemCallbacks* callbacks); - fileapi::FileSystemOperation::SnapshotFileCallback - SnapshotFileHandler(WebKit::WebFileSystemCallbacks* callbacks); - fileapi::FileSystemOperation::SnapshotFileCallback - SnapshotFileHandler_Deprecated( - const GURL& blob_url, - WebKit::WebFileSystemCallbacks* callbacks); - void DidFinish(WebKit::WebFileSystemCallbacks* callbacks, - base::PlatformFileError result); - void DidGetMetadata(WebKit::WebFileSystemCallbacks* callbacks, - base::PlatformFileError result, - const base::PlatformFileInfo& info, - const base::FilePath& platform_path); - void DidReadDirectory( - WebKit::WebFileSystemCallbacks* callbacks, - base::PlatformFileError result, - const std::vector& entries, - bool has_more); - void DidOpenFileSystem(WebKit::WebFileSystemCallbacks* callbacks, - base::PlatformFileError result, - const std::string& name, const GURL& root); - void DidDeleteFileSystem(WebKit::WebFileSystemCallbacks* callbacks, - base::PlatformFileError result); - void DidCreateSnapshotFile( - WebKit::WebFileSystemCallbacks* callbacks, - base::PlatformFileError result, - const base::PlatformFileInfo& info, - const base::FilePath& platform_path, - const scoped_refptr& file_ref); - void DidCreateSnapshotFile_Deprecated( - const GURL& blob_url, - WebKit::WebFileSystemCallbacks* callbacks, - base::PlatformFileError result, - const base::PlatformFileInfo& info, - const base::FilePath& platform_path, - const scoped_refptr& file_ref); - - scoped_refptr file_system_context_; - - DISALLOW_COPY_AND_ASSIGN(BrowserFileSystem); -}; - -#endif // CEF_LIBCEF_BROWSER_FILE_SYSTEM_H_ diff --git a/cef1/libcef/browser_file_writer.cc b/cef1/libcef/browser_file_writer.cc deleted file mode 100644 index 0d19c94d4..000000000 --- a/cef1/libcef/browser_file_writer.cc +++ /dev/null @@ -1,203 +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 "libcef/browser_file_writer.h" -#include "libcef/cef_thread.h" - -#include "base/bind.h" -#include "base/location.h" -#include "base/logging.h" -#include "base/message_loop_proxy.h" -#include "net/url_request/url_request_context.h" -#include "webkit/fileapi/file_system_context.h" -#include "webkit/fileapi/file_system_operation.h" -#include "webkit/fileapi/file_system_types.h" -#include "webkit/fileapi/file_system_url.h" -#include "webkit/glue/webkit_glue.h" - -using fileapi::FileSystemURL; -using fileapi::FileSystemContext; -using fileapi::FileSystemOperation; -using fileapi::WebFileWriterBase; -using WebKit::WebFileWriterClient; -using WebKit::WebString; -using WebKit::WebURL; - -net::URLRequestContext* BrowserFileWriter::request_context_ = NULL; - -// Helper class to proxy the write and truncate calls to the IO thread, -// and to proxy the results back to the main thead. There is a one-to-one -// relationship between BrowserFileWriters and IOThreadBackends. -class BrowserFileWriter::IOThreadProxy - : public base::RefCountedThreadSafe { - public: - IOThreadProxy(const base::WeakPtr& simple_writer, - FileSystemContext* file_system_context) - : simple_writer_(simple_writer), - operation_(NULL), - file_system_context_(file_system_context) { - io_thread_ = CefThread::GetMessageLoopProxyForThread(CefThread::IO); - main_thread_ = base::MessageLoopProxy::current(); - } - - void Truncate(const FileSystemURL& url, int64 offset) { - if (!io_thread_->BelongsToCurrentThread()) { - io_thread_->PostTask( - FROM_HERE, - base::Bind(&IOThreadProxy::Truncate, this, url, offset)); - return; - } - if (FailIfNotWritable(url)) - return; - DCHECK(!operation_); - operation_ = GetNewOperation(url); - operation_->Truncate(url, offset, - base::Bind(&IOThreadProxy::DidFinish, this)); - } - - void Write(const FileSystemURL& url, const GURL& blob_url, int64 offset) { - if (!io_thread_->BelongsToCurrentThread()) { - io_thread_->PostTask( - FROM_HERE, - base::Bind(&IOThreadProxy::Write, this, url, blob_url, offset)); - return; - } - if (FailIfNotWritable(url)) - return; - DCHECK(request_context_); - DCHECK(!operation_); - operation_ = GetNewOperation(url); - operation_->Write(request_context_, url, blob_url, offset, - base::Bind(&IOThreadProxy::DidWrite, this)); - } - - void Cancel() { - if (!io_thread_->BelongsToCurrentThread()) { - io_thread_->PostTask( - FROM_HERE, - base::Bind(&IOThreadProxy::Cancel, this)); - return; - } - if (!operation_) { - DidFailOnMainThread(base::PLATFORM_FILE_ERROR_INVALID_OPERATION); - return; - } - operation_->Cancel(base::Bind(&IOThreadProxy::DidFinish, this)); - } - - private: - friend class base::RefCountedThreadSafe; - virtual ~IOThreadProxy() {} - - FileSystemOperation* GetNewOperation( const FileSystemURL& url) { - return file_system_context_->CreateFileSystemOperation(url, NULL); - } - - // Returns true if it is not writable. - bool FailIfNotWritable(const FileSystemURL& url) { - if (url.type() == fileapi::kFileSystemTypeDragged) { - // Write is not allowed in isolate file system in BrowserFileWriter. - DidFailOnMainThread(base::PLATFORM_FILE_ERROR_SECURITY); - return true; - } - return false; - } - - void DidSucceedOnMainThread() { - if (!main_thread_->BelongsToCurrentThread()) { - main_thread_->PostTask( - FROM_HERE, - base::Bind(&IOThreadProxy::DidSucceedOnMainThread, this)); - return; - } - if (simple_writer_) - simple_writer_->DidSucceed(); - } - - void DidFailOnMainThread(base::PlatformFileError error_code) { - if (!main_thread_->BelongsToCurrentThread()) { - main_thread_->PostTask( - FROM_HERE, - base::Bind(&IOThreadProxy::DidFailOnMainThread, this, error_code)); - return; - } - if (simple_writer_) - simple_writer_->DidFail(error_code); - } - - void DidWriteOnMainThread(int64 bytes, bool complete) { - if (!main_thread_->BelongsToCurrentThread()) { - main_thread_->PostTask( - FROM_HERE, - base::Bind(&IOThreadProxy::DidWriteOnMainThread, - this, bytes, complete)); - return; - } - if (simple_writer_) - simple_writer_->DidWrite(bytes, complete); - } - - void ClearOperation() { - DCHECK(io_thread_->BelongsToCurrentThread()); - operation_ = NULL; - } - - void DidFinish(base::PlatformFileError result) { - if (result == base::PLATFORM_FILE_OK) - DidSucceedOnMainThread(); - else - DidFailOnMainThread(result); - ClearOperation(); - } - - void DidWrite(base::PlatformFileError result, int64 bytes, bool complete) { - if (result == base::PLATFORM_FILE_OK) { - DidWriteOnMainThread(bytes, complete); - if (complete) - ClearOperation(); - } else { - DidFailOnMainThread(result); - ClearOperation(); - } - } - - scoped_refptr io_thread_; - scoped_refptr main_thread_; - - // Only used on the main thread. - base::WeakPtr simple_writer_; - - // Only used on the io thread. - FileSystemOperation* operation_; - - scoped_refptr file_system_context_; -}; - - -BrowserFileWriter::BrowserFileWriter( - const GURL& path, - WebFileWriterClient* client, - FileSystemContext* file_system_context) - : WebFileWriterBase(path, client), - file_system_context_(file_system_context), - io_thread_proxy_(new IOThreadProxy(AsWeakPtr(), file_system_context)) { -} - -BrowserFileWriter::~BrowserFileWriter() { -} - -void BrowserFileWriter::DoTruncate(const GURL& path, int64 offset) { - FileSystemURL url(file_system_context_->CrackURL(path)); - io_thread_proxy_->Truncate(url, offset); -} - -void BrowserFileWriter::DoWrite( - const GURL& path, const GURL& blob_url, int64 offset) { - FileSystemURL url(file_system_context_->CrackURL(path)); - io_thread_proxy_->Write(url, blob_url, offset); -} - -void BrowserFileWriter::DoCancel() { - io_thread_proxy_->Cancel(); -} diff --git a/cef1/libcef/browser_file_writer.h b/cef1/libcef/browser_file_writer.h deleted file mode 100644 index 5ed9b0e7b..000000000 --- a/cef1/libcef/browser_file_writer.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_BROWSER_FILE_WRITER_H_ -#define CEF_LIBCEF_BROWSER_FILE_WRITER_H_ -#pragma once - -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "webkit/fileapi/webfilewriter_base.h" - -namespace net { -class URLRequestContext; -} // namespace net - -namespace fileapi { -class FileSystemContext; -} - -// An implementation of WebFileWriter for use in test_shell and DRT. -class BrowserFileWriter : public fileapi::WebFileWriterBase, - public base::SupportsWeakPtr { - public: - BrowserFileWriter( - const GURL& path, - WebKit::WebFileWriterClient* client, - fileapi::FileSystemContext* file_system_context); - virtual ~BrowserFileWriter(); - - // Called by CefProcessIOThread when the context is created and destroyed. - static void InitializeOnIOThread(net::URLRequestContext* request_context) { - request_context_ = request_context; - } - static void CleanupOnIOThread() { - request_context_ = NULL; - } - - protected: - // WebFileWriterBase overrides - virtual void DoTruncate(const GURL& path, int64 offset) OVERRIDE; - virtual void DoWrite(const GURL& path, const GURL& blob_url, - int64 offset) OVERRIDE; - virtual void DoCancel() OVERRIDE; - - private: - class IOThreadProxy; - scoped_refptr file_system_context_; - scoped_refptr io_thread_proxy_; - static net::URLRequestContext* request_context_; -}; - -#endif // CEF_LIBCEF_BROWSER_FILE_WRITER_H_ diff --git a/cef1/libcef/browser_impl.cc b/cef1/libcef/browser_impl.cc deleted file mode 100644 index 8e0add5dd..000000000 --- a/cef1/libcef/browser_impl.cc +++ /dev/null @@ -1,1716 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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 "libcef/browser_impl.h" -#include "libcef/browser_devtools_scheme_handler.h" -#include "libcef/browser_webkit_glue.h" -#include "libcef/browser_zoom_map.h" -#include "libcef/cef_context.h" -#include "libcef/dom_document_impl.h" -#include "libcef/request_impl.h" -#include "libcef/stream_impl.h" -#include "libcef/v8_impl.h" - -#include "base/bind.h" -#include "base/files/file_path.h" -#include "base/path_service.h" -#include "base/stringprintf.h" -#include "base/synchronization/waitable_event.h" -#include "base/utf_string_conversions.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebHTTPBody.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURLRequest.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPlugin.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebRange.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "webkit/glue/glue_serialize.h" -#include "webkit/plugins/npapi/webplugin_delegate.h" -#include "webkit/plugins/npapi/webplugin_impl.h" -#include "webkit/glue/webkit_glue.h" - -using WebKit::WebDocument; -using WebKit::WebFrame; -using WebKit::WebHTTPBody; -using WebKit::WebPlugin; -using WebKit::WebPluginDocument; -using WebKit::WebRange; -using WebKit::WebRect; -using WebKit::WebScriptSource; -using WebKit::WebString; -using WebKit::WebURL; -using WebKit::WebURLRequest; -using WebKit::WebView; - -namespace { - -class CreateBrowserHelper { - public: - CreateBrowserHelper(CefWindowInfo& windowInfo, - CefRefPtr client, - const CefString& url, - const CefBrowserSettings& settings) - : window_info_(windowInfo), - client_(client), - url_(url), - settings_(settings) {} - - CefWindowInfo window_info_; - CefRefPtr client_; - CefString url_; - CefBrowserSettings settings_; -}; - -void UIT_CreateBrowserWithHelper(CreateBrowserHelper* helper) { - CefBrowser::CreateBrowserSync(helper->window_info_, helper->client_, - helper->url_, helper->settings_); - delete helper; -} - -} // namespace - - -CefBrowserImpl::PaintDelegate::PaintDelegate(CefBrowserImpl* browser) - : browser_(browser) { -} - -CefBrowserImpl::PaintDelegate::~PaintDelegate() { -} - -void CefBrowserImpl::PaintDelegate::Paint( - bool popup, const std::vector& dirtyRects, const void* buffer) { - CefRefPtr client = browser_->GetClient(); - if (!client.get()) - return; - CefRefPtr handler = client->GetRenderHandler(); - if (!handler.get()) - return; - - handler->OnPaint(browser_, (popup?PET_POPUP:PET_VIEW), dirtyRects, buffer); -} - - -// static -bool CefBrowser::CreateBrowser(CefWindowInfo& windowInfo, - CefRefPtr client, - const CefString& url, - const CefBrowserSettings& settings) { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return false; - } - - // Verify that the settings structure is a valid size. - if (settings.size != sizeof(cef_browser_settings_t)) { - NOTREACHED() << "invalid CefBrowserSettings structure size"; - return false; - } - - // Create the browser on the UI thread. - CreateBrowserHelper* helper = - new CreateBrowserHelper(windowInfo, client, url, settings); - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(UIT_CreateBrowserWithHelper, helper)); - return true; -} - -// static -CefRefPtr CefBrowser::CreateBrowserSync( - CefWindowInfo& windowInfo, CefRefPtr client, - const CefString& url, const CefBrowserSettings& settings) { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return NULL; - } - - // Verify that the settings structure is a valid size. - if (settings.size != sizeof(cef_browser_settings_t)) { - NOTREACHED() << "invalid CefBrowserSettings structure size"; - return NULL; - } - - // Verify that this method is being called on the UI thread. - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return NULL; - } - - CefRefPtr browser( - new CefBrowserImpl(windowInfo, settings, NULL, client)); - if (!static_cast(browser.get())->UIT_CreateBrowser(url)) - return NULL; - - return browser; -} - - -CefBrowserImpl::CefBrowserImpl(const CefWindowInfo& windowInfo, - const CefBrowserSettings& settings, - gfx::NativeView opener, - CefRefPtr client) - : window_info_(windowInfo), - settings_(settings), - opener_(opener), - is_modal_(false), - client_(client), - webviewhost_(NULL), - popuphost_(NULL), - zoom_level_(0.0), - can_go_back_(false), - can_go_forward_(false), - has_document_(false), - is_dropping_(false), - is_in_onsetfocus_(false), -#if defined(OS_WIN) - opener_was_disabled_by_modal_loop_(false), - internal_modal_message_loop_is_active_(false), -#elif defined(OS_LINUX) - last_mouse_down_(NULL), -#endif - browser_id_(_Context->GetNextBrowserID()) { - delegate_.reset(new BrowserWebViewDelegate(this)); - popup_delegate_.reset(new BrowserWebViewDelegate(this)); - nav_controller_.reset(new BrowserNavigationController(this)); - - // Create the singleton main frame reference. - main_frame_ = new CefFrameImpl(this, 0, CefString(), CefString()); -} - -void CefBrowserImpl::CloseBrowser() { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_CloseBrowser, this)); -} - -void CefBrowserImpl::GoBack() { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleActionView, this, - MENU_ID_NAV_BACK)); -} - -void CefBrowserImpl::GoForward() { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleActionView, this, - MENU_ID_NAV_FORWARD)); -} - -void CefBrowserImpl::Reload() { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleActionView, this, - MENU_ID_NAV_RELOAD)); -} - -void CefBrowserImpl::ReloadIgnoreCache() { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleActionView, this, - MENU_ID_NAV_RELOAD_NOCACHE)); -} - -void CefBrowserImpl::StopLoad() { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleActionView, this, - MENU_ID_NAV_STOP)); -} - -void CefBrowserImpl::SetFocus(bool enable) { - if (CefThread::CurrentlyOn(CefThread::UI)) { - // If SetFocus() is called from inside the OnSetFocus() callback do not re- - // enter the callback. - if (enable && !is_in_onsetfocus_) { - WebViewHost* host = UIT_GetWebViewHost(); - if (host) { - CefRefPtr client = GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetFocusHandler(); - if (handler.get()) { - is_in_onsetfocus_ = true; - bool handled = handler->OnSetFocus(this, FOCUS_SOURCE_SYSTEM); - is_in_onsetfocus_ = false; - - if (handled) - return; - } - } - } - } - - UIT_SetFocus(UIT_GetWebViewHost(), enable); - } else { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::SetFocus, this, enable)); - } -} - -CefRefPtr CefBrowserImpl::GetMainFrame() { - return GetMainCefFrame(0, GURL()).get(); -} - -CefRefPtr CefBrowserImpl::GetFocusedFrame() { - // Verify that this method is being called on the UI thread. - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return NULL; - } - - WebView* view = UIT_GetWebView(); - return view ? UIT_GetCefFrame(view->focusedFrame()) : NULL; -} - -CefRefPtr CefBrowserImpl::GetFrame(const CefString& name) { - // Verify that this method is being called on the UI thread. - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return NULL; - } - - WebView* view = UIT_GetWebView(); - if (!view) - return NULL; - - WebFrame* frame = view->findFrameByName(string16(name)); - if (frame) - return UIT_GetCefFrame(frame); - return NULL; -} - -void CefBrowserImpl::GetFrameNames(std::vector& names) { - // Verify that this method is being called on the UI thread. - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return; - } - - WebView* view = UIT_GetWebView(); - if (!view) - return; - - WebFrame* main_frame = view->mainFrame(); - WebFrame* it = main_frame; - do { - if (it != main_frame) { - string16 str = it->uniqueName(); - names.push_back(str); - } - it = it->traverseNext(true); - } while (it != main_frame); -} - -void CefBrowserImpl::Find(int identifier, const CefString& searchText, - bool forward, bool matchCase, bool findNext) { - WebKit::WebFindOptions options; - options.forward = forward; - options.matchCase = matchCase; - options.findNext = findNext; - - // Execute the request on the UI thread. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_Find, this, identifier, searchText, - options)); -} - -void CefBrowserImpl::StopFinding(bool clearSelection) { - // Execute the request on the UI thread. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_StopFinding, this, clearSelection)); -} - -void CefBrowserImpl::SetZoomLevel(double zoomLevel) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_SetZoomLevel, this, zoomLevel)); -} - -void CefBrowserImpl::ClearHistory() { - if (CefThread::CurrentlyOn(CefThread::UI)) { - if (!nav_controller_.get()) - return; - - bool old_can_go_back = !nav_controller_->IsAtStart(); - bool old_can_go_forward = !nav_controller_->IsAtEnd(); - nav_controller_->Reset(); - - if (old_can_go_back || old_can_go_forward) { - set_nav_state(false, false); - if (client_.get()) { - CefRefPtr handler = client_->GetDisplayHandler(); - if (handler.get()) { - // Notify the handler of a navigation state change - handler->OnNavStateChange(this, false, false); - } - } - } - } else { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::ClearHistory, this)); - } -} - -void CefBrowserImpl::ShowDevTools() { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_ShowDevTools, this)); -} - -void CefBrowserImpl::CloseDevTools() { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_CloseDevTools, this)); -} - -WebKit::WebGeolocationClient* CefBrowserImpl::UIT_GetGeolocationClient() { - if (!geolocation_client_) - geolocation_client_ = new CefGeolocationClient(this); - return geolocation_client_; -} - -bool CefBrowserImpl::GetSize(PaintElementType type, int& width, int& height) { - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return false; - } - - width = height = 0; - - if (type == PET_VIEW) { - WebViewHost* host = UIT_GetWebViewHost(); - if (host) { - host->GetSize(width, height); - return true; - } - } else if (type == PET_POPUP) { - if (popuphost_) { - popuphost_->GetSize(width, height); - return true; - } - } - - return false; -} - -void CefBrowserImpl::SetSize(PaintElementType type, int width, int height) { - // Intentially post event tasks in all cases so that painting tasks can be - // handled at sane times. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_SetSize, this, type, width, height)); -} - -bool CefBrowserImpl::IsPopupVisible() { - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return false; - } - - return (popuphost_ != NULL); -} - -void CefBrowserImpl::HidePopup() { - // Intentially post event tasks in all cases so that painting tasks can be - // handled at sane times. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_ClosePopupWidget, this)); -} - -void CefBrowserImpl::Invalidate(const CefRect& dirtyRect) { - // Intentially post event tasks in all cases so that painting tasks can be - // handled at sane times. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_Invalidate, this, dirtyRect)); -} - -bool CefBrowserImpl::GetImage(PaintElementType type, int width, int height, - void* buffer) { - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return false; - } - - if (type == PET_VIEW) { - WebViewHost* host = UIT_GetWebViewHost(); - if (host) - return host->GetImage(width, height, buffer); - } else if (type == PET_POPUP) { - if (popuphost_) - return popuphost_->GetImage(width, height, buffer); - } - - return false; -} - -void CefBrowserImpl::SendKeyEvent(KeyType type, const CefKeyInfo& keyInfo, - int modifiers) { - // Intentially post event tasks in all cases so that painting tasks can be - // handled at sane times. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_SendKeyEvent, this, type, keyInfo, - modifiers)); -} - -void CefBrowserImpl::SendMouseClickEvent(int x, int y, MouseButtonType type, - bool mouseUp, int clickCount) { - // Intentially post event tasks in all cases so that painting tasks can be - // handled at sane times. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_SendMouseClickEvent, this, x, y, type, - mouseUp, clickCount)); -} - -void CefBrowserImpl::SendMouseMoveEvent(int x, int y, bool mouseLeave) { - // Intentially post event tasks in all cases so that painting tasks can be - // handled at sane times. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_SendMouseMoveEvent, this, x, y, - mouseLeave)); -} - -void CefBrowserImpl::SendMouseWheelEvent(int x, int y, int deltaX, int deltaY) { - // Intentially post event tasks in all cases so that painting tasks can be - // handled at sane times. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_SendMouseWheelEvent, this, x, y, deltaX, - deltaY)); -} - -void CefBrowserImpl::SendFocusEvent(bool setFocus) { - // Intentially post event tasks in all cases so that painting tasks can be - // handled at sane times. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_SendFocusEvent, this, setFocus)); -} - -void CefBrowserImpl::SendCaptureLostEvent() { - // Intentially post event tasks in all cases so that painting tasks can be - // handled at sane times. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_SendCaptureLostEvent, this)); -} - -void CefBrowserImpl::Undo(CefRefPtr frame) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleAction, this, MENU_ID_UNDO, frame)); -} - -void CefBrowserImpl::Redo(CefRefPtr frame) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleAction, this, MENU_ID_REDO, frame)); -} - -void CefBrowserImpl::Cut(CefRefPtr frame) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleAction, this, MENU_ID_CUT, frame)); -} - -void CefBrowserImpl::Copy(CefRefPtr frame) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleAction, this, MENU_ID_COPY, frame)); -} - -void CefBrowserImpl::Paste(CefRefPtr frame) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleAction, this, MENU_ID_PASTE, - frame)); -} - -void CefBrowserImpl::Delete(CefRefPtr frame) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleAction, this, MENU_ID_DELETE, - frame)); -} - -void CefBrowserImpl::SelectAll(CefRefPtr frame) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleAction, this, MENU_ID_SELECTALL, - frame)); -} - - -void CefBrowserImpl::Print(CefRefPtr frame) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleAction, this, MENU_ID_PRINT, - frame)); -} - -void CefBrowserImpl::ViewSource(CefRefPtr frame) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_HandleAction, this, MENU_ID_VIEWSOURCE, - frame)); -} - -CefString CefBrowserImpl::GetSource(CefRefPtr frame) { - // Verify that this method is being called on the UI thread. - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return CefString(); - } - - // Retrieve the document string directly - WebKit::WebFrame* web_frame = UIT_GetWebFrame(frame); - if (web_frame) - return string16(web_frame->contentAsMarkup()); - return CefString(); -} - -CefString CefBrowserImpl::GetText(CefRefPtr frame) { - // Verify that this method is being called on the UI thread. - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return CefString(); - } - - // Retrieve the document text directly - WebKit::WebFrame* web_frame = UIT_GetWebFrame(frame); - if (web_frame) - return webkit_glue::DumpDocumentText(web_frame); - return CefString(); -} - -void CefBrowserImpl::LoadRequest(CefRefPtr frame, - CefRefPtr request) { - DCHECK(request.get() != NULL); - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_LoadURLForRequestRef, this, frame, - request)); -} - -void CefBrowserImpl::LoadURL(CefRefPtr frame, - const CefString& url) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_LoadURL, this, frame, url)); -} - -void CefBrowserImpl::LoadString(CefRefPtr frame, - const CefString& string, - const CefString& url) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_LoadHTML, this, frame, string, url)); -} - -void CefBrowserImpl::LoadStream(CefRefPtr frame, - CefRefPtr stream, - const CefString& url) { - DCHECK(stream.get() != NULL); - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_LoadHTMLForStreamRef, this, frame, stream, - url)); -} - -void CefBrowserImpl::ExecuteJavaScript(CefRefPtr frame, - const CefString& jsCode, - const CefString& scriptUrl, - int startLine) { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_ExecuteJavaScript, this, frame, jsCode, - scriptUrl, startLine)); -} - -CefRefPtr CefBrowserImpl::GetParent(CefRefPtr frame) { - // Verify that this method is being called on the UI thread. - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return NULL; - } - - WebFrame* web_frame = UIT_GetWebFrame(frame); - if (web_frame) { - if (web_frame->parent() == NULL) { - // This is the main frame. - return NULL; - } - return UIT_GetCefFrame(web_frame->parent()); - } - return NULL; -} - -CefRefPtr CefBrowserImpl::GetCefFrame(int64 id) { - AutoLock lock_scope(this); - FrameMap::const_iterator it = frames_.find(id); - if (it != frames_.end()) - return it->second; - - return NULL; -} - -CefRefPtr CefBrowserImpl::GetOrCreateCefFrame( - int64 id, - const CefString& name, - const GURL& url) { - CefRefPtr cef_frame; - - if (name.empty()) { - // Use the single main frame reference. - cef_frame = GetMainCefFrame(id, url); - } else { - // Locate or create the appropriate named reference. - AutoLock lock_scope(this); - FrameMap::const_iterator it = frames_.find(id); - if (it != frames_.end()) { - cef_frame = it->second; - cef_frame->set_url(url.spec()); - } else { - cef_frame = new CefFrameImpl(this, id, name, url.spec()); - frames_.insert(std::make_pair(id, cef_frame.get())); - } - } - - return cef_frame; -} - -void CefBrowserImpl::RemoveCefFrame(int64 id) { - AutoLock lock_scope(this); - // Remove the appropriate reference. - FrameMap::iterator it = frames_.find(id); - if (it != frames_.end()) - frames_.erase(it); -} - -CefRefPtr CefBrowserImpl::GetMainCefFrame(int64 id, - const GURL& url) { - if (id != 0) - main_frame_->set_id(id); - - if (!url.is_empty()) - main_frame_->set_url(url.spec()); - - return main_frame_; -} - -CefRefPtr CefBrowserImpl::UIT_GetCefFrame(WebFrame* frame) { - REQUIRE_UIT(); - - CefRefPtr cef_frame; - GURL url = frame->document().url(); - - if (frame->parent() == 0) { - // Use the single main frame reference. - cef_frame = GetMainCefFrame(frame->identifier(), url); - } else { - // Locate or create the appropriate reference. - CefString name = string16(frame->uniqueName()); - DCHECK(!name.empty()); - cef_frame = GetOrCreateCefFrame(frame->identifier(), name, url); - } - - return cef_frame.get(); -} - -void CefBrowserImpl::UIT_UpdateCefFrame(WebKit::WebFrame* frame) { - REQUIRE_UIT(); - - GURL url = frame->document().url(); - - if (frame->parent() == 0) { - // Update the single main frame reference. - GetMainCefFrame(frame->identifier(), url); - } else { - // Update the appropriate reference if it currently exists. - CefRefPtr cef_frame = GetCefFrame(frame->identifier()); - if (cef_frame.get()) - cef_frame->set_url(url.spec()); - } -} - -WebFrame* CefBrowserImpl::UIT_GetMainWebFrame() { - REQUIRE_UIT(); - - WebView* view = UIT_GetWebView(); - if (view) - return view ->mainFrame(); - return NULL; -} - -WebFrame* CefBrowserImpl::UIT_GetWebFrame(CefRefPtr frame) { - REQUIRE_UIT(); - - WebView* view = UIT_GetWebView(); - if (!view) - return NULL; - - CefString name = frame->GetName(); - if (name.empty()) - return view ->mainFrame(); - return view ->findFrameByName(string16(name)); -} - -void CefBrowserImpl::UIT_DestroyBrowser() { - if (client_.get()) { - CefRefPtr handler = client_->GetLifeSpanHandler(); - if (handler.get()) { - // Notify the handler that the window is about to be closed. - handler->OnBeforeClose(this); - } - } - -#if defined(OS_WIN) - if (is_modal_) { - // Exit our own internal modal message loop now. - if (internal_modal_message_loop_is_active_) { - base::MessageLoop* message_loop = base::MessageLoop::current(); - message_loop->QuitNow(); - } - } - - UIT_GetWebViewDelegate()->RevokeDragDrop(); -#endif - - // If the current browser window is a dev tools client then disconnect from - // the agent and destroy the client before destroying the window. - UIT_DestroyDevToolsClient(); - - if (dev_tools_agent_.get()) { - BrowserDevToolsClient* client = dev_tools_agent_->client(); - if (client) { - CefBrowserImpl* browser = client->browser(); - // Destroy the client before freeing the agent. - browser->UIT_DestroyDevToolsClient(); - if (!_Context->shutting_down()) { - // Explicitly close the client browser window. - browser->UIT_CloseBrowser(); - } - } - // Free the agent. - dev_tools_agent_.reset(); - } - - if (frame_objects_.size() > 0) - frame_objects_.clear(); - - // Clean up anything associated with the WebViewHost widget. - if (webviewhost_.get()) { - if (webviewhost_->webwidget()) - webviewhost_->webwidget()->close(); - webviewhost_.reset(); - } - - delegate_.reset(NULL); - popup_delegate_.reset(NULL); - nav_controller_.reset(NULL); - - if (paint_delegate_.get()) - paint_delegate_.reset(NULL); - - // Remove the reference to the window handle. - UIT_ClearMainWndHandle(); - - main_frame_ = NULL; - -#if defined(OS_LINUX) - set_last_mouse_down(NULL); -#endif - - if (request_context_proxy_.get()) { - // Delete the proxy on the IO thread. - CefThread::DeleteSoon(CefThread::IO, FROM_HERE, - request_context_proxy_.release()); - } - - // Remove the browser from the list maintained by the context. - _Context->RemoveBrowser(this); - - // Remove the reference added in UIT_CreateBrowser(). - Release(); -} - -void CefBrowserImpl::UIT_CloseBrowser() { - REQUIRE_UIT(); - if (IsWindowRenderingDisabled()) { - UIT_DestroyBrowser(); - } else { - gfx::NativeView view = UIT_GetMainWndHandle(); - if (view) - UIT_CloseView(view); - } -} - -void CefBrowserImpl::UIT_LoadURL(CefRefPtr frame, - const CefString& url) { - UIT_LoadURLForRequest(frame, url, CefString(), WebHTTPBody(), - CefRequest::HeaderMap()); -} - -void CefBrowserImpl::UIT_LoadURLForRequestRef(CefRefPtr frame, - CefRefPtr request) { - CefString url = request->GetURL(); - CefString method = request->GetMethod(); - - CefRequestImpl* impl = static_cast(request.get()); - - WebHTTPBody upload_data; - CefRefPtr postdata = impl->GetPostData(); - if (postdata.get()) { - upload_data.initialize(); - static_cast(postdata.get())->Get(upload_data); - } - - CefRequest::HeaderMap headers; - impl->GetHeaderMap(headers); - - UIT_LoadURLForRequest(frame, url, method, upload_data, headers); -} - -void CefBrowserImpl::UIT_LoadURLForRequest( - CefRefPtr frame, - const CefString& url, - const CefString& method, - const WebKit::WebHTTPBody& upload_data, - const CefRequest::HeaderMap& headers) { - REQUIRE_UIT(); - - if (url.empty()) - return; - - std::string urlStr(url); - GURL gurl = GURL(urlStr); - - if (!gurl.is_valid() && !gurl.has_scheme()) { - // Try to add "http://" at the beginning - std::string new_url = std::string("http://") + urlStr; - gurl = GURL(new_url); - if (!gurl.is_valid()) - return; - } - - if (nav_controller_.get()) { - nav_controller_->LoadEntry( - new BrowserNavigationEntry(-1, gurl, CefString(), frame->GetName(), - method, upload_data, headers)); - } -} - -void CefBrowserImpl::UIT_LoadHTML(CefRefPtr frame, - const CefString& html, - const CefString& url) { - REQUIRE_UIT(); - - std::string urlStr(url); - GURL gurl = GURL(urlStr); - - if (!gurl.is_valid() && !gurl.has_scheme()) { - // Try to add "http://" at the beginning - std::string new_url = std::string("http://") + urlStr; - gurl = GURL(new_url); - if (!gurl.is_valid()) - return; - } - - WebFrame* web_frame = UIT_GetWebFrame(frame); - if (web_frame) - web_frame->loadHTMLString(std::string(html), gurl); -} - -void CefBrowserImpl::UIT_LoadHTMLForStreamRef(CefRefPtr frame, - CefRefPtr stream, - const CefString& url) { - REQUIRE_UIT(); - - std::string urlStr(url); - GURL gurl = GURL(urlStr); - - if (!gurl.is_valid() && !gurl.has_scheme()) { - // Try to add "http://" at the beginning - std::string new_url = std::string("http://") + urlStr; - gurl = GURL(new_url); - if (!gurl.is_valid()) - return; - } - - // read all of the stream data into a std::string. - std::stringstream ss; - char buff[BUFFER_SIZE]; - size_t read; - do { - read = stream->Read(buff, sizeof(char), BUFFER_SIZE-1); - if (read > 0) { - buff[read] = 0; - ss << buff; - } - } - while (read > 0); - - WebFrame* web_frame = UIT_GetWebFrame(frame); - if (web_frame) - web_frame->loadHTMLString(ss.str(), gurl); -} - -void CefBrowserImpl::UIT_ExecuteJavaScript(CefRefPtr frame, - const CefString& js_code, - const CefString& script_url, - int start_line) { - REQUIRE_UIT(); - - WebFrame* web_frame = UIT_GetWebFrame(frame); - if (web_frame) { - web_frame->executeScript(WebScriptSource(string16(js_code), - WebURL(GURL(std::string(script_url))), start_line)); - } -} - -void CefBrowserImpl::UIT_GoBackOrForward(int offset) { - REQUIRE_UIT(); - if (nav_controller_.get()) - nav_controller_->GoToOffset(offset); -} - -void CefBrowserImpl::UIT_Reload(bool ignoreCache) { - REQUIRE_UIT(); - if (nav_controller_.get()) - nav_controller_->Reload(ignoreCache); -} - -bool CefBrowserImpl::UIT_Navigate(const BrowserNavigationEntry& entry, - bool reload, - bool ignoreCache) { - REQUIRE_UIT(); - - WebView* view = UIT_GetWebView(); - if (!view) - return false; - - // Get the right target frame for the entry. - WebFrame* frame; - if (!entry.GetTargetFrame().empty()) - frame = view->findFrameByName(string16(entry.GetTargetFrame())); - else - frame = view->mainFrame(); - - // TODO(mpcomplete): should we clear the target frame, or should - // back/forward navigations maintain the target frame? - - // A navigation resulting from loading a javascript URL should not be - // treated as a browser initiated event. Instead, we want it to look as if - // the page initiated any load resulting from JS execution. - if (!entry.GetURL().SchemeIs("javascript")) { - delegate_->set_pending_extra_data( - new BrowserExtraData(entry.GetPageID())); - } - - // If we are reloading, then WebKit will use the state of the current page. - // Otherwise, we give it the state to navigate to. - if (reload) { - frame->reload(ignoreCache); - } else if (!entry.GetContentState().empty()) { - DCHECK_NE(entry.GetPageID(), -1); - frame->loadHistoryItem( - webkit_glue::HistoryItemFromString(entry.GetContentState())); - } else { - DCHECK_EQ(entry.GetPageID(), -1); - WebURLRequest request(entry.GetURL()); - - if (entry.GetMethod().length() > 0) - request.setHTTPMethod(string16(entry.GetMethod())); - - if (entry.GetHeaders().size() > 0) - CefRequestImpl::SetHeaderMap(entry.GetHeaders(), request); - - if (!entry.GetUploadData().isNull()) { - string16 method = request.httpMethod(); - if (method == ASCIIToUTF16("GET") || method == ASCIIToUTF16("HEAD")) - request.setHTTPMethod(ASCIIToUTF16("POST")); - - if (request.httpHeaderField(ASCIIToUTF16("Content-Type")).length() == 0) { - request.setHTTPHeaderField( - ASCIIToUTF16("Content-Type"), - ASCIIToUTF16("application/x-www-form-urlencoded")); - } - request.setHTTPBody(entry.GetUploadData()); - } - - frame->loadRequest(request); - } - - // In case LoadRequest failed before DidCreateDataSource was called. - delegate_->set_pending_extra_data(NULL); - - if (client_.get()) { - CefRefPtr handler = client_->GetFocusHandler(); - if (!handler.get() || - (handler.get() && - !handler->OnSetFocus(this, FOCUS_SOURCE_NAVIGATION))) { - // Restore focus to the main frame prior to loading new request. - // This makes sure that we don't have a focused iframe. Otherwise, that - // iframe would keep focus when the SetFocus called immediately after - // LoadRequest, thus making some tests fail (see http://b/issue?id=845337 - // for more details). - // TODO(cef): The above comment may be wrong, or the below call to - // setFocusedFrame() may be unnecessary or in the wrong place. See this - // thread for additional details: - // http://groups.google.com/group/chromium-dev/browse_thread/thread/42bcd31b59e3a168 - view->setFocusedFrame(frame); - - // Give focus to the window if it is currently visible. - if (!IsWindowRenderingDisabled() && - UIT_IsViewVisible(UIT_GetMainWndHandle())) - UIT_SetFocus(UIT_GetWebViewHost(), true); - } - } - - return true; -} - -void CefBrowserImpl::UIT_SetSize(PaintElementType type, int width, int height) { - if (type == PET_VIEW) { - WebViewHost* host = UIT_GetWebViewHost(); - if (host) - host->SetSize(width, height); - } else if (type == PET_POPUP) { - if (popuphost_) - popuphost_->SetSize(width, height); - } -} - -void CefBrowserImpl::UIT_Invalidate(const CefRect& dirtyRect) { - REQUIRE_UIT(); - WebViewHost* host = UIT_GetWebViewHost(); - if (host) { - gfx::Rect rect(dirtyRect.x, dirtyRect.y, dirtyRect.width, - dirtyRect.height); - - // Cause WebWidget::Paint() to be called when next appropriate. - host->InvalidateRect(rect); - } -} - -void CefBrowserImpl::UIT_SendKeyEvent(KeyType type, const CefKeyInfo& keyInfo, - int modifiers) { - REQUIRE_UIT(); - if (popuphost_) { - // Send the event to the popup. - popuphost_->SendKeyEvent(type, keyInfo, modifiers); - } else { - WebViewHost* host = UIT_GetWebViewHost(); - if (host) - host->SendKeyEvent(type, keyInfo, modifiers); - } -} - -void CefBrowserImpl::UIT_SendMouseClickEvent(int x, int y, MouseButtonType type, - bool mouseUp, int clickCount) { - REQUIRE_UIT(); - if (popuphost_ && popup_rect_.Contains(x, y)) { - // Send the event to the popup. - popuphost_->SendMouseClickEvent(x - popup_rect_.x(), y - popup_rect_.y(), - type, mouseUp, clickCount); - } else { - WebViewHost* host = UIT_GetWebViewHost(); - if (host) - host->SendMouseClickEvent(x, y, type, mouseUp, clickCount); - } -} - -void CefBrowserImpl::UIT_SendMouseMoveEvent(int x, int y, bool mouseLeave) { - REQUIRE_UIT(); - if (popuphost_ && popup_rect_.Contains(x, y)) { - // Send the event to the popup. - popuphost_->SendMouseMoveEvent(x - popup_rect_.x(), y - popup_rect_.y(), - mouseLeave); - } else { - WebViewHost* host = UIT_GetWebViewHost(); - if (host) - host->SendMouseMoveEvent(x, y, mouseLeave); - } -} - -void CefBrowserImpl::UIT_SendMouseWheelEvent(int x, int y, int deltaX, - int deltaY) { - REQUIRE_UIT(); - if (popuphost_ && popup_rect_.Contains(x, y)) { - // Send the event to the popup. - popuphost_->SendMouseWheelEvent(x - popup_rect_.x(), y - popup_rect_.y(), - deltaX, deltaY); - } else { - WebViewHost* host = UIT_GetWebViewHost(); - if (host) - host->SendMouseWheelEvent(x, y, deltaX, deltaY); - } -} - -void CefBrowserImpl::UIT_SendFocusEvent(bool setFocus) { - REQUIRE_UIT(); - WebViewHost* host = UIT_GetWebViewHost(); - if (host) - host->SendFocusEvent(setFocus); -} - -void CefBrowserImpl::UIT_SendCaptureLostEvent() { - REQUIRE_UIT(); - WebViewHost* host = UIT_GetWebViewHost(); - if (host) - host->SendCaptureLostEvent(); -} - -CefRefPtr CefBrowserImpl::UIT_CreatePopupWindow( - const CefString& url, const CefPopupFeatures& features) { - REQUIRE_UIT(); - - CefWindowInfo info; -#if defined(OS_WIN) - info.SetAsPopup(NULL, CefString()); -#endif - -#if (defined(OS_WIN) || defined(OS_MACOSX)) - // Default to the size from the popup features. - if (features.xSet) - info.m_x = features.x; - if (features.ySet) - info.m_y = features.y; - if (features.widthSet) - info.m_nWidth = features.width; - if (features.heightSet) - info.m_nHeight = features.height; -#endif - - CefRefPtr client = client_; - - // Start with the current browser window's settings. - CefBrowserSettings settings(settings_); - - if (client_.get()) { - CefRefPtr handler = client_->GetLifeSpanHandler(); - // Give the handler an opportunity to modify window attributes, handler, - // or cancel the window creation. - if (handler.get() && - handler->OnBeforePopup(this, features, info, url, client, settings)) { - return NULL; - } - } - - // Modal windows need to know which window is being suspended (the opener) - // so that it can be disabled while the modal window is open. - CefRefPtr browser( - new CefBrowserImpl(info, settings, UIT_GetMainWndHandle(), client)); - - // Don't pass the URL to UIT_CreateBrowser for popup windows or the URL will - // be loaded twice. - if (!browser->UIT_CreateBrowser(CefString())) - return NULL; - - return browser; -} - -WebKit::WebWidget* CefBrowserImpl::UIT_CreatePopupWidget() { - REQUIRE_UIT(); - - DCHECK(!popuphost_); - popuphost_ = WebWidgetHost::Create( - (IsWindowRenderingDisabled()?NULL:UIT_GetMainWndHandle()), - popup_delegate_.get(), paint_delegate_.get()); - popuphost_->set_popup(true); - - return popuphost_->webwidget(); -} - -void CefBrowserImpl::UIT_ClosePopupWidget() { - REQUIRE_UIT(); - - if (!popuphost_) - return; - -#if !defined(OS_MACOSX) - // Mac uses a WebPopupMenu for select lists so no closing is necessary. - if (!IsWindowRenderingDisabled()) - UIT_CloseView(UIT_GetPopupWndHandle()); -#endif - popuphost_ = NULL; - popup_rect_ = gfx::Rect(); - - if (IsWindowRenderingDisabled() && client_.get()) { - CefRefPtr handler = client_->GetRenderHandler(); - if (handler.get()) { - // Notify the handler of popup visibility change. - handler->OnPopupShow(this, false); - } - } -} - -void CefBrowserImpl::UIT_Show(WebKit::WebNavigationPolicy policy) { - REQUIRE_UIT(); - delegate_->show(policy); -} - -void CefBrowserImpl::UIT_HandleActionView(cef_menu_id_t menuId) { - return UIT_HandleAction(menuId, NULL); -} - -void CefBrowserImpl::UIT_HandleAction(cef_menu_id_t menuId, - CefRefPtr frame) { - REQUIRE_UIT(); - - WebFrame* web_frame = NULL; - if (frame) - web_frame = UIT_GetWebFrame(frame); - - switch (menuId) { - case MENU_ID_NAV_BACK: - UIT_GoBackOrForward(-1); - break; - case MENU_ID_NAV_FORWARD: - UIT_GoBackOrForward(1); - break; - case MENU_ID_NAV_RELOAD: - UIT_Reload(false); - break; - case MENU_ID_NAV_RELOAD_NOCACHE: - UIT_Reload(true); - break; - case MENU_ID_NAV_STOP: - if (UIT_GetWebView()) - UIT_GetWebView()->mainFrame()->stopLoading(); - break; - case MENU_ID_UNDO: - if (web_frame) - web_frame->executeCommand(WebString::fromUTF8("Undo")); - break; - case MENU_ID_REDO: - if (web_frame) - web_frame->executeCommand(WebString::fromUTF8("Redo")); - break; - case MENU_ID_CUT: - if (web_frame) - web_frame->executeCommand(WebString::fromUTF8("Cut")); - break; - case MENU_ID_COPY: - if (web_frame) - web_frame->executeCommand(WebString::fromUTF8("Copy")); - break; - case MENU_ID_PASTE: - if (web_frame) - web_frame->executeCommand(WebString::fromUTF8("Paste")); - break; - case MENU_ID_DELETE: - if (web_frame) - web_frame->executeCommand(WebString::fromUTF8("Delete")); - break; - case MENU_ID_SELECTALL: - if (web_frame) - web_frame->executeCommand(WebString::fromUTF8("SelectAll")); - break; - case MENU_ID_PRINT: - if (web_frame) - UIT_PrintPages(web_frame); - break; - case MENU_ID_VIEWSOURCE: - if (web_frame) - UIT_ViewDocumentString(web_frame); - break; - } -} - -void CefBrowserImpl::UIT_Find(int identifier, const CefString& search_text, - const WebKit::WebFindOptions& options) { - WebView* view = UIT_GetWebView(); - if (!view) - return; - - WebFrame* main_frame = view->mainFrame(); - string16 searchText(search_text); - - if (main_frame->document().isPluginDocument()) { - WebPlugin* plugin = main_frame->document().to().plugin(); - if (plugin) { - if (options.findNext) { - // Just navigate back/forward. - plugin->selectFindResult(options.forward); - } else { - if (plugin->startFind(searchText, options.matchCase, identifier)) { - } else { - // No find results. - UIT_NotifyFindStatus(identifier, 0, gfx::Rect(), 0, true); - } - } - return; - } - } - - WebFrame* frame_after_main = main_frame->traverseNext(true); - WebFrame* focused_frame = view->focusedFrame(); - WebFrame* search_frame = focused_frame; // start searching focused frame. - - bool multi_frame = (frame_after_main != main_frame); - - // If we have multiple frames, we don't want to wrap the search within the - // frame, so we check here if we only have main_frame in the chain. - bool wrap_within_frame = !multi_frame; - - WebRect selection_rect; - bool result = false; - - // If something is selected when we start searching it means we cannot just - // increment the current match ordinal; we need to re-generate it. - WebRange current_selection = focused_frame->selectionRange(); - - do { - result = search_frame->find(identifier, searchText, options, - wrap_within_frame, &selection_rect); - - if (!result) { - // don't leave text selected as you move to the next frame. - search_frame->executeCommand(WebString::fromUTF8("Unselect")); - - // Find the next frame, but skip the invisible ones. - do { - // What is the next frame to search? (we might be going backwards). Note - // that we specify wrap=true so that search_frame never becomes NULL. - search_frame = options.forward ? - search_frame->traverseNext(true) : - search_frame->traversePrevious(true); - } while (!search_frame->hasVisibleContent() && - search_frame != focused_frame); - - // Make sure selection doesn't affect the search operation in new frame. - search_frame->executeCommand(WebString::fromUTF8("Unselect")); - - // If we have multiple frames and we have wrapped back around to the - // focused frame, we need to search it once more allowing wrap within - // the frame, otherwise it will report 'no match' if the focused frame has - // reported matches, but no frames after the focused_frame contain a - // match for the search word(s). - if (multi_frame && search_frame == focused_frame) { - result = search_frame->find( - identifier, searchText, - options, true, // Force wrapping. - &selection_rect); - } - } - - view->setFocusedFrame(search_frame); - } while (!result && search_frame != focused_frame); - - if (options.findNext && current_selection.isNull()) { - // Force the main_frame to report the actual count. - main_frame->increaseMatchCount(0, identifier); - } else { - // If nothing is found, set result to "0 of 0", otherwise, set it to - // "-1 of 1" to indicate that we found at least one item, but we don't know - // yet what is active. - int ordinal = result ? -1 : 0; // -1 here means, we might know more later. - int match_count = result ? 1 : 0; // 1 here means possibly more coming. - - // If we find no matches then this will be our last status update. - // Otherwise the scoping effort will send more results. - bool final_status_update = !result; - - // Send the search result. - UIT_NotifyFindStatus(identifier, match_count, selection_rect, ordinal, - final_status_update); - - // Scoping effort begins, starting with the mainframe. - search_frame = main_frame; - - main_frame->resetMatchCount(); - - do { - // Cancel all old scoping requests before starting a new one. - search_frame->cancelPendingScopingEffort(); - - // We don't start another scoping effort unless at least one match has - // been found. - if (result) { - // Start new scoping request. If the scoping function determines that it - // needs to scope, it will defer until later. - search_frame->scopeStringMatches(identifier, searchText, options, - true); // reset the tickmarks - } - - // Iterate to the next frame. The frame will not necessarily scope, for - // example if it is not visible. - search_frame = search_frame->traverseNext(true); - } while (search_frame != main_frame); - } -} - -void CefBrowserImpl::UIT_StopFinding(bool clear_selection) { - WebView* view = UIT_GetWebView(); - if (!view) - return; - - WebDocument doc = view->mainFrame()->document(); - if (doc.isPluginDocument()) { - WebPlugin* plugin = - view->mainFrame()->document().to().plugin(); - if (plugin) - plugin->stopFind(); - return; - } - - if (clear_selection) - view->focusedFrame()->executeCommand(WebString::fromUTF8("Unselect")); - - WebFrame* frame = view->mainFrame(); - while (frame) { - frame->stopFinding(clear_selection); - frame = frame->traverseNext(false); - } -} - -void CefBrowserImpl::UIT_NotifyFindStatus(int identifier, int count, - const WebKit::WebRect& selection_rect, - int active_match_ordinal, - bool final_update) { - if (client_.get()) { - CefRefPtr handler = client_->GetFindHandler(); - if (handler.get()) { - CefRect rect(selection_rect.x, selection_rect.y, selection_rect.width, - selection_rect.height); - handler->OnFindResult(this, identifier, count, rect, active_match_ordinal, - final_update); - } - } -} - -void CefBrowserImpl::UIT_SetZoomLevel(double zoomLevel) { - REQUIRE_UIT(); - WebKit::WebFrame* web_frame = UIT_GetMainWebFrame(); - if (web_frame) { - GURL url = web_frame->document().url(); - web_frame->view()->setZoomLevel(false, zoomLevel); - bool didHandleZoom = false; - if (client_.get()) { - CefRefPtr handler = client_->GetZoomHandler(); - if (handler.get()) - didHandleZoom = handler->OnSetZoomLevel(this, url.spec(), zoomLevel); - } - if (!didHandleZoom) - ZoomMap::GetInstance()->set(url, zoomLevel); - set_zoom_level(zoomLevel); - } -} - -void CefBrowserImpl::UIT_ShowDevTools() { - REQUIRE_UIT(); - - if (!dev_tools_agent_.get()) - return; - - BrowserDevToolsClient* client = dev_tools_agent_->client(); - if (!client) { - // Create the inspector window. - CefString url(base::StringPrintf( - "%sdevtools.html?docked=false&toolbarColor=rgba(223,223,223,1)&" - "textColor=rgba(18,50,114,1)", - kChromeDevToolsURL)); - - CefPopupFeatures features; - CefRefPtr browser = UIT_CreatePopupWindow(url, features); - if (browser.get()) { - browser->UIT_CreateDevToolsClient(dev_tools_agent_.get()); - browser->UIT_LoadURL(browser->GetMainFrame(), url); - browser->UIT_Show(WebKit::WebNavigationPolicyNewWindow); - } - } else { - // Give focus to the existing inspector window. - client->browser()->UIT_Show(WebKit::WebNavigationPolicyNewWindow); - } -} - -void CefBrowserImpl::UIT_CloseDevTools() { - REQUIRE_UIT(); - - if (!dev_tools_agent_.get()) - return; - - BrowserDevToolsClient* client = dev_tools_agent_->client(); - if (client) - client->browser()->UIT_CloseBrowser(); -} - -void CefBrowserImpl::UIT_VisitDOM(CefRefPtr frame, - CefRefPtr visitor) { - REQUIRE_UIT(); - - WebKit::WebFrame* web_frame = UIT_GetWebFrame(frame); - if (!web_frame) - return; - - // Create a CefDOMDocumentImpl object that is valid only for the scope of this - // method. - CefRefPtr documentImpl; - const WebKit::WebDocument& document = web_frame->document(); - if (!document.isNull()) - documentImpl = new CefDOMDocumentImpl(this, web_frame); - - visitor->Visit(documentImpl.get()); - - if (documentImpl.get()) - documentImpl->Detach(); -} - -void CefBrowserImpl::UIT_AddFrameObject(WebKit::WebFrame* frame, - CefTrackNode* tracked_object) { - REQUIRE_UIT(); - - CefRefPtr manager; - - if (!frame_objects_.empty()) { - FrameObjectMap::const_iterator it = frame_objects_.find(frame); - if (it != frame_objects_.end()) - manager = it->second; - } - - if (!manager.get()) { - manager = new CefTrackManager(); - frame_objects_.insert(std::make_pair(frame, manager)); - } - - manager->Add(tracked_object); -} - -void CefBrowserImpl::UIT_BeforeFrameClosed(WebKit::WebFrame* frame) { - REQUIRE_UIT(); - - if (!frame_objects_.empty()) { - // Remove any tracked objects associated with the frame. - FrameObjectMap::iterator it = frame_objects_.find(frame); - if (it != frame_objects_.end()) - frame_objects_.erase(it); - } -} - -void CefBrowserImpl::set_zoom_level(double zoomLevel) { - AutoLock lock_scope(this); - zoom_level_ = zoomLevel; -} - -double CefBrowserImpl::zoom_level() { - AutoLock lock_scope(this); - return zoom_level_; -} - -void CefBrowserImpl::set_nav_state(bool can_go_back, bool can_go_forward) { - AutoLock lock_scope(this); - can_go_back_ = can_go_back; - can_go_forward_ = can_go_forward; -} - -bool CefBrowserImpl::can_go_back() { - AutoLock lock_scope(this); - return can_go_back_; -} - -bool CefBrowserImpl::can_go_forward() { - AutoLock lock_scope(this); - return can_go_forward_; -} - -void CefBrowserImpl::set_has_document(bool has_document) { - AutoLock lock_scope(this); - has_document_ = has_document; -} - -bool CefBrowserImpl::has_document() { - AutoLock lock_scope(this); - return has_document_; -} - -void CefBrowserImpl::set_pending_url(const GURL& url) { - AutoLock lock_scope(this); - pending_url_ = url; -} - -GURL CefBrowserImpl::pending_url() { - AutoLock lock_scope(this); - return pending_url_; -} - -net::URLRequestContext* CefBrowserImpl::request_context_proxy() { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - if (!request_context_proxy_.get()) { - request_context_proxy_.reset( - new BrowserRequestContextProxy(_Context->request_context(), this)); - } - return request_context_proxy_.get(); -} - -void CefBrowserImpl::UIT_CreateDevToolsClient(BrowserDevToolsAgent *agent) { - dev_tools_client_.reset(new BrowserDevToolsClient(this, agent)); - _Context->UIT_DevToolsClientCreated(); -} - -void CefBrowserImpl::UIT_DestroyDevToolsClient() { - if (dev_tools_client_.get()) { - // Free the client. This will cause the client to clear pending messages - // and detach from the agent. - dev_tools_client_.reset(); - _Context->UIT_DevToolsClientDestroyed(); - } -} - - -// CefFrameImpl - -CefFrameImpl::CefFrameImpl(CefBrowserImpl* browser, - int64 id, - const CefString& name, - const CefString& url) - : browser_(browser), - name_(name), - id_(id), - url_(url) { -} - -CefFrameImpl::~CefFrameImpl() { - if (!IsMain()) - browser_->RemoveCefFrame(id_); -} - -bool CefFrameImpl::IsFocused() { - // Verify that this method is being called on the UI thread. - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return false; - } - - return (browser_->UIT_GetWebView() && - (browser_->UIT_GetWebFrame(this) == - browser_->UIT_GetWebView()->focusedFrame())); -} - -int64 CefFrameImpl::GetIdentifier() { - base::AutoLock lock_scope(lock_); - return id_; -} - -CefString CefFrameImpl::GetURL() { - base::AutoLock lock_scope(lock_); - return url_; -} - -void CefFrameImpl::VisitDOM(CefRefPtr visitor) { - if (!visitor.get()) { - NOTREACHED() << "invalid parameter"; - return; - } - CefRefPtr framePtr(this); - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefBrowserImpl::UIT_VisitDOM, browser_.get(), framePtr, - visitor)); -} - -CefRefPtr CefFrameImpl::GetV8Context() { - // Verify that this method is being called on the UI thread. - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return NULL; - } - - WebKit::WebFrame* frame = browser_->UIT_GetWebFrame(this); - if (frame) { - v8::HandleScope handle_scope; - return new CefV8ContextImpl(webkit_glue::GetV8Context(frame)); - } else { - return NULL; - } -} - -void CefFrameImpl::set_id(int64 id) { - base::AutoLock lock_scope(lock_); - id_ = id; -} - -void CefFrameImpl::set_url(const CefString& url) { - base::AutoLock lock_scope(lock_); - url_ = url; -} diff --git a/cef1/libcef/browser_impl.h b/cef1/libcef/browser_impl.h deleted file mode 100644 index fe64555ae..000000000 --- a/cef1/libcef/browser_impl.h +++ /dev/null @@ -1,508 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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. - -#ifndef CEF_LIBCEF_BROWSER_IMPL_H_ -#define CEF_LIBCEF_BROWSER_IMPL_H_ -#pragma once - -#include -#include -#include - -#include "include/cef_browser.h" -#include "include/cef_client.h" -#include "include/cef_frame.h" - -#include "libcef/webview_host.h" -#include "libcef/browser_devtools_agent.h" -#include "libcef/browser_devtools_client.h" -#include "libcef/browser_webview_delegate.h" -#include "libcef/browser_navigation_controller.h" -#include "libcef/browser_request_context_proxy.h" -#include "libcef/cef_thread.h" -#include "libcef/geolocation_client.h" -#include "libcef/tracker.h" -#if defined(OS_WIN) -#include "libcef/printing/win_printing_context.h" -#endif - -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFindOptions.h" - -namespace base { -class WaitableEvent; -} -namespace WebKit { -class WebView; -} - -class CefFrameImpl; - -#define BUFFER_SIZE 32768 - - -// Implementation of CefBrowser. -class CefBrowserImpl : public CefBrowser { - public: - class PaintDelegate : public WebWidgetHost::PaintDelegate { - public: - explicit PaintDelegate(CefBrowserImpl* browser); - virtual ~PaintDelegate(); - - virtual void Paint(bool popup, const std::vector& dirtyRects, - const void* buffer) OVERRIDE; - - protected: - CefBrowserImpl* browser_; - }; - - CefBrowserImpl(const CefWindowInfo& windowInfo, - const CefBrowserSettings& settings, - gfx::NativeView opener, - CefRefPtr client); - virtual ~CefBrowserImpl() {} - -#if defined(OS_WIN) - static LPCTSTR GetWndClass(); - static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, - LPARAM lParam); -#endif - - // CefBrowser methods - virtual void CloseBrowser() OVERRIDE; - virtual bool CanGoBack() OVERRIDE { return can_go_back(); } - virtual void GoBack() OVERRIDE; - virtual bool CanGoForward() OVERRIDE { return can_go_forward(); } - virtual void GoForward() OVERRIDE; - virtual void Reload() OVERRIDE; - virtual void ReloadIgnoreCache() OVERRIDE; - virtual void StopLoad() OVERRIDE; - virtual void SetFocus(bool enable) OVERRIDE; - virtual void ParentWindowWillClose() OVERRIDE; - virtual CefWindowHandle GetWindowHandle() OVERRIDE; - virtual CefWindowHandle GetOpenerWindowHandle() OVERRIDE - { return opener_window(); } - virtual int GetIdentifier() OVERRIDE { return browser_id(); } - virtual bool IsPopup() OVERRIDE { return is_popup(); } - virtual bool HasDocument() OVERRIDE { return has_document(); } - virtual CefRefPtr GetClient() OVERRIDE { return client_; } - virtual CefRefPtr GetMainFrame() OVERRIDE; - virtual CefRefPtr GetFocusedFrame() OVERRIDE; - virtual CefRefPtr GetFrame(const CefString& name) OVERRIDE; - virtual void GetFrameNames(std::vector& names) OVERRIDE; - virtual void Find(int identifier, const CefString& searchText, - bool forward, bool matchCase, bool findNext) OVERRIDE; - virtual void StopFinding(bool clearSelection) OVERRIDE; - virtual double GetZoomLevel() OVERRIDE { return zoom_level(); } - virtual void SetZoomLevel(double zoomLevel) OVERRIDE; - virtual void ClearHistory() OVERRIDE; - virtual void ShowDevTools() OVERRIDE; - virtual void CloseDevTools() OVERRIDE; - virtual bool IsWindowRenderingDisabled() OVERRIDE; - virtual bool GetSize(PaintElementType type, int& width, int& height) OVERRIDE; - virtual void SetSize(PaintElementType type, int width, int height) OVERRIDE; - virtual bool IsPopupVisible() OVERRIDE; - virtual void HidePopup() OVERRIDE; - virtual void Invalidate(const CefRect& dirtyRect) OVERRIDE; - virtual bool GetImage(PaintElementType type, int width, int height, - void* buffer) OVERRIDE; - virtual void SendKeyEvent(KeyType type, const CefKeyInfo& keyInfo, - int modifiers) OVERRIDE; - virtual void SendMouseClickEvent(int x, int y, MouseButtonType type, - bool mouseUp, int clickCount) OVERRIDE; - virtual void SendMouseMoveEvent(int x, int y, bool mouseLeave) OVERRIDE; - virtual void SendMouseWheelEvent(int x, int y, int deltaX, int deltaY) - OVERRIDE; - virtual void SendFocusEvent(bool setFocus) OVERRIDE; - virtual void SendCaptureLostEvent() OVERRIDE; - - // Frame-related methods - void Undo(CefRefPtr frame); - void Redo(CefRefPtr frame); - void Cut(CefRefPtr frame); - void Copy(CefRefPtr frame); - void Paste(CefRefPtr frame); - void Delete(CefRefPtr frame); - void SelectAll(CefRefPtr frame); - void Print(CefRefPtr frame); - void ViewSource(CefRefPtr frame); - CefString GetSource(CefRefPtr frame); - CefString GetText(CefRefPtr frame); - void LoadRequest(CefRefPtr frame, - CefRefPtr request); - void LoadURL(CefRefPtr frame, - const CefString& url); - void LoadString(CefRefPtr frame, - const CefString& string, - const CefString& url); - void LoadStream(CefRefPtr frame, - CefRefPtr stream, - const CefString& url); - void ExecuteJavaScript(CefRefPtr frame, - const CefString& jsCode, - const CefString& scriptUrl, - int startLine); - CefRefPtr GetParent(CefRefPtr frame); - - // CefFrames are light-weight objects managed by the browser and loosely - // coupled to a WebFrame object by id. If a CefFrame object does not already - // exist for the specified id one will be created. There is no guarantee that - // the same CefFrame object will be returned across different calls to this - // function. - CefRefPtr GetCefFrame(int64 id); - CefRefPtr GetOrCreateCefFrame(int64 id, const CefString& name, - const GURL& url); - void RemoveCefFrame(int64 id); - CefRefPtr GetMainCefFrame(int64 id, const GURL& url); - - //////////////////////////////////////////////////////////// - // ALL UIT_* METHODS MUST ONLY BE CALLED ON THE UI THREAD // - //////////////////////////////////////////////////////////// - - CefRefPtr UIT_GetCefFrame(WebKit::WebFrame* frame); - void UIT_UpdateCefFrame(WebKit::WebFrame* frame); - - // Return the main WebFrame object. - WebKit::WebFrame* UIT_GetMainWebFrame(); - - // Return the WebFrame object associated with the specified CefFrame. This - // may return NULL if no WebFrame with the CefFrame's name exists. - WebKit::WebFrame* UIT_GetWebFrame(CefRefPtr frame); - - WebKit::WebView* UIT_GetWebView() const { - REQUIRE_UIT(); - return webviewhost_.get() ? webviewhost_->webview() : NULL; - } - WebViewHost* UIT_GetWebViewHost() const { - REQUIRE_UIT(); - return webviewhost_.get(); - } - BrowserWebViewDelegate* UIT_GetWebViewDelegate() const { - REQUIRE_UIT(); - return delegate_.get(); - } - gfx::NativeView UIT_GetWebViewWndHandle() { - REQUIRE_UIT(); - DCHECK(!IsWindowRenderingDisabled()); - return webviewhost_->view_handle(); - } - WebKit::WebWidget* UIT_GetPopup() const { - REQUIRE_UIT(); - return popuphost_ ? popuphost_->webwidget() : NULL; - } - WebWidgetHost* UIT_GetPopupHost() const { - REQUIRE_UIT(); - return popuphost_; - } - BrowserWebViewDelegate* UIT_GetPopupDelegate() const { - REQUIRE_UIT(); - return popup_delegate_.get(); - } - gfx::NativeView UIT_GetPopupWndHandle() { - REQUIRE_UIT(); - DCHECK(!IsWindowRenderingDisabled()); - return popuphost_->view_handle(); - } - gfx::NativeView UIT_GetMainWndHandle(); - void UIT_ClearMainWndHandle(); - - BrowserNavigationController* UIT_GetNavigationController() { - REQUIRE_UIT(); - return nav_controller_.get(); - } - - // Return true to allow user editing such as entering text in form elements - bool UIT_AllowEditing() { return true; } - - bool UIT_IsModal() { - REQUIRE_UIT(); - return is_modal_; - } - void UIT_SetIsModal(bool val) { - REQUIRE_UIT(); - is_modal_ = val; - } - - CefString UIT_GetTitle() { - REQUIRE_UIT(); - return title_; - } - void UIT_SetTitle(const CefString& title) { - REQUIRE_UIT(); - title_ = title; - } - - // Create the native browser window and populate browser members. - bool UIT_CreateBrowser(const CefString& url); - - // Destroy the browser members. This method should only be called after the - // native browser window is not longer processing messages. - void UIT_DestroyBrowser(); - - // Sends a message via the OS to close the native browser window. - // UIT_DestroyBrowser will be called after the native window has closed. - void UIT_CloseBrowser(); - - void UIT_LoadURL(CefRefPtr frame, - const CefString& url); - void UIT_LoadURLForRequest(CefRefPtr frame, - const CefString& url, - const CefString& method, - const WebKit::WebHTTPBody& upload_data, - const CefRequest::HeaderMap& headers); - void UIT_LoadURLForRequestRef(CefRefPtr frame, - CefRefPtr request); - void UIT_LoadHTML(CefRefPtr frame, - const CefString& html, - const CefString& url); - void UIT_LoadHTMLForStreamRef(CefRefPtr frame, - CefRefPtr stream, - const CefString& url); - void UIT_ExecuteJavaScript(CefRefPtr frame, - const CefString& js_code, - const CefString& script_url, - int start_line); - void UIT_GoBackOrForward(int offset); - void UIT_Reload(bool ignoreCache); - bool UIT_Navigate(const BrowserNavigationEntry& entry, - bool reload, - bool ignoreCahce); - void UIT_SetFocus(WebWidgetHost* host, bool enable); - void UIT_SetSize(PaintElementType type, int width, int height); - void UIT_Invalidate(const CefRect& dirtyRect); - void UIT_SendKeyEvent(KeyType type, const CefKeyInfo& keyInfo, int modifiers); - void UIT_SendMouseClickEvent(int x, int y, MouseButtonType type, - bool mouseUp, int clickCount); - void UIT_SendMouseMoveEvent(int x, int y, bool mouseLeave); - void UIT_SendMouseWheelEvent(int x, int y, int deltaX, int deltaY); - void UIT_SendFocusEvent(bool setFocus); - void UIT_SendCaptureLostEvent(); - - CefRefPtr UIT_CreatePopupWindow(const CefString& url, - const CefPopupFeatures& features); - WebKit::WebWidget* UIT_CreatePopupWidget(); - void UIT_ClosePopupWidget(); - - void UIT_Show(WebKit::WebNavigationPolicy policy); - - // Handles most simple browser actions - void UIT_HandleActionView(cef_menu_id_t menuId); - void UIT_HandleAction(cef_menu_id_t menuId, CefRefPtr frame); - - // Save the document HTML to a temporary file and open in the default viewing - // application - bool UIT_ViewDocumentString(WebKit::WebFrame *frame); - - bool UIT_CanGoBack() { return !nav_controller_->IsAtStart(); } - bool UIT_CanGoForward() { return !nav_controller_->IsAtEnd(); } - - // Printing support - void UIT_PrintPages(WebKit::WebFrame* frame); - void UIT_PrintPage(int page_number, int total_pages, - const gfx::Size& canvas_size, WebKit::WebFrame* frame); - int UIT_GetPagesCount(WebKit::WebFrame* frame); - - void UIT_Find(int identifier, const CefString& search_text, - const WebKit::WebFindOptions& options); - void UIT_StopFinding(bool clear_selection); - void UIT_NotifyFindStatus(int identifier, int count, - const WebKit::WebRect& selection_rect, - int active_match_ordinal, bool final_update); - void UIT_SetZoomLevel(double zoomLevel); - void UIT_ShowDevTools(); - void UIT_CloseDevTools(); - WebKit::WebGeolocationClient* UIT_GetGeolocationClient(); - - void UIT_VisitDOM(CefRefPtr frame, - CefRefPtr visitor); - - // Frame objects will be deleted immediately before the frame is closed. - void UIT_AddFrameObject(WebKit::WebFrame* frame, - CefTrackNode* tracked_object); - void UIT_BeforeFrameClosed(WebKit::WebFrame* frame); - - // These variables are read-only. - const CefBrowserSettings& settings() const { return settings_; } - gfx::NativeView opener_window() { return opener_; } - int browser_id() const { return browser_id_; } - bool is_popup() { return (opener_ != NULL); } - - // These variables may be read/written from multiple threads. - void set_zoom_level(double zoomLevel); - double zoom_level(); - void set_nav_state(bool can_go_back, bool can_go_forward); - bool can_go_back(); - bool can_go_forward(); - void set_has_document(bool has_document); - bool has_document(); - - // URL currently being loaded in the main frame. - void set_pending_url(const GURL& url); - GURL pending_url(); - - void set_is_dropping(bool is_dropping) { is_dropping_ = is_dropping; } - bool is_dropping() { return is_dropping_; } - -#if defined(OS_WIN) - void set_opener_was_disabled_by_modal_loop(bool disabled) { - opener_was_disabled_by_modal_loop_ = disabled; - } - void set_internal_modal_message_loop_is_active(bool active) { - internal_modal_message_loop_is_active_ = active; - } -#elif defined(OS_LINUX) - void set_last_mouse_down(GdkEventButton* event); - GdkEventButton* last_mouse_down() { return last_mouse_down_; } -#endif - - void set_popup_rect(const gfx::Rect& rect) { popup_rect_ = rect; } - - net::URLRequestContext* request_context_proxy(); - - static bool ImplementsThreadSafeReferenceCounting() { return true; } - - protected: - static void UIT_CloseView(gfx::NativeView view); - static bool UIT_IsViewVisible(gfx::NativeView view); - - void UIT_CreateDevToolsClient(BrowserDevToolsAgent* agent); - void UIT_DestroyDevToolsClient(); - - CefWindowInfo window_info_; - CefBrowserSettings settings_; - // Handle of the browser window that opened this window. - gfx::NativeView opener_; - bool is_modal_; - CefRefPtr client_; - scoped_ptr webviewhost_; - WebWidgetHost* popuphost_; - gfx::Rect popup_rect_; - scoped_ptr delegate_; - scoped_ptr popup_delegate_; - scoped_ptr nav_controller_; - scoped_ptr paint_delegate_; - - scoped_ptr dev_tools_agent_; - scoped_ptr dev_tools_client_; - - scoped_ptr request_context_proxy_; - - // The geolocation client attached to this view, lazily initialized. - scoped_refptr geolocation_client_; - - CefString title_; - - double zoom_level_; - bool can_go_back_; - bool can_go_forward_; - bool has_document_; - GURL pending_url_; - - // True if a drop action is occuring. - bool is_dropping_; - - // True if currently in the OnSetFocus callback. Only accessed on the UI - // thread. - bool is_in_onsetfocus_; - -#if defined(OS_WIN) - // Context object used to manage printing. - printing::PrintingContext print_context_; - - // Used to re-enable the opener when a modal window gets closed. - bool opener_was_disabled_by_modal_loop_; - bool internal_modal_message_loop_is_active_; -#endif - -#if defined(OS_LINUX) - GdkEventButton* last_mouse_down_; -#endif - - // Map of frame id to reference. - typedef std::map FrameMap; - FrameMap frames_; - - // Singleton main frame reference. - CefRefPtr main_frame_; - - typedef std::map > - FrameObjectMap; - FrameObjectMap frame_objects_; - - // Globally unique identifier for this browser. - int browser_id_; - - IMPLEMENT_REFCOUNTING(CefBrowserImpl); - IMPLEMENT_LOCKING(CefBrowserImpl); -}; - - -// Implementation of CefFrame. -class CefFrameImpl : public CefFrame { - public: - CefFrameImpl(CefBrowserImpl* browser, - int64 frame_id, - const CefString& name, - const CefString& url); - virtual ~CefFrameImpl(); - - // CefFrame methods - virtual void Undo() OVERRIDE { browser_->Undo(this); } - virtual void Redo() OVERRIDE { browser_->Redo(this); } - virtual void Cut() OVERRIDE { browser_->Cut(this); } - virtual void Copy() OVERRIDE { browser_->Copy(this); } - virtual void Paste() OVERRIDE { browser_->Paste(this); } - virtual void Delete() OVERRIDE { browser_->Delete(this); } - virtual void SelectAll() OVERRIDE { browser_->SelectAll(this); } - virtual void Print() OVERRIDE { browser_->Print(this); } - virtual void ViewSource() OVERRIDE { browser_->ViewSource(this); } - virtual CefString GetSource() OVERRIDE { return browser_->GetSource(this); } - virtual CefString GetText() OVERRIDE { return browser_->GetText(this); } - virtual void LoadRequest(CefRefPtr request) OVERRIDE { - return browser_->LoadRequest(this, request); - } - virtual void LoadURL(const CefString& url) OVERRIDE { - return browser_->LoadURL(this, url); - } - virtual void LoadString(const CefString& string, - const CefString& url) OVERRIDE { - return browser_->LoadString(this, string, url); - } - virtual void LoadStream(CefRefPtr stream, - const CefString& url) OVERRIDE { - return browser_->LoadStream(this, stream, url); - } - virtual void ExecuteJavaScript(const CefString& jsCode, - const CefString& scriptUrl, - int startLine) OVERRIDE { - return browser_->ExecuteJavaScript(this, jsCode, scriptUrl, startLine); - } - virtual bool IsMain() OVERRIDE { return name_.empty(); } - virtual bool IsFocused() OVERRIDE; - virtual CefString GetName() OVERRIDE { return name_; } - virtual int64 GetIdentifier() OVERRIDE; - virtual CefRefPtr GetParent() OVERRIDE { - return browser_->GetParent(this); - } - virtual CefString GetURL() OVERRIDE; - virtual CefRefPtr GetBrowser() OVERRIDE { return browser_.get(); } - virtual void VisitDOM(CefRefPtr visitor) OVERRIDE; - virtual CefRefPtr GetV8Context() OVERRIDE; - - void set_id(int64 id); - void set_url(const CefString& url); - - private: - CefRefPtr browser_; - CefString name_; - - // The below values must be protected by the lock. - base::Lock lock_; - int64 id_; - CefString url_; - - IMPLEMENT_REFCOUNTING(CefFrameImpl); -}; - -#endif // CEF_LIBCEF_BROWSER_IMPL_H_ diff --git a/cef1/libcef/browser_impl_gtk.cc b/cef1/libcef/browser_impl_gtk.cc deleted file mode 100644 index 1496e7100..000000000 --- a/cef1/libcef/browser_impl_gtk.cc +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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 - -#include "libcef/cef_context.h" -#include "libcef/browser_impl.h" -#include "libcef/browser_settings.h" - -#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "webkit/glue/webpreferences.h" - -using WebKit::WebRect; -using WebKit::WebSize; - -namespace { - -void window_destroyed(GtkWidget* widget, CefBrowserImpl* browser) { - browser->UIT_DestroyBrowser(); -} - -gboolean button_press_event( - GtkWidget* widget, - GdkEventButton* event, - CefBrowserImpl* browser) { - browser->set_last_mouse_down(event); - return FALSE; -} - -gboolean focus_out_event( - GtkWidget* widget, - GdkEventFocus* focus, - CefBrowserImpl* browser) { - browser->set_last_mouse_down(NULL); - return FALSE; -} - -} // namespace - -void CefBrowserImpl::ParentWindowWillClose() { - // TODO(port): Implement this method if necessary. -} - -CefWindowHandle CefBrowserImpl::GetWindowHandle() { - AutoLock lock_scope(this); - return window_info_.m_Widget; -} - -bool CefBrowserImpl::IsWindowRenderingDisabled() { - // TODO(port): Add support for off-screen rendering. - return false; -} - -gfx::NativeView CefBrowserImpl::UIT_GetMainWndHandle() { - REQUIRE_UIT(); - return window_info_.m_Widget; -} - -void CefBrowserImpl::UIT_ClearMainWndHandle() { - REQUIRE_UIT(); - window_info_.m_Widget = NULL; -} - -bool CefBrowserImpl::UIT_CreateBrowser(const CefString& url) { - REQUIRE_UIT(); - Lock(); - - // Add a reference that will be released in UIT_DestroyBrowser(). - AddRef(); - - // Add the new browser to the list maintained by the context - _Context->AddBrowser(this); - - if (!settings_.developer_tools_disabled) - dev_tools_agent_.reset(new BrowserDevToolsAgent()); - - GtkWidget* window; - GtkWidget* parentView = window_info_.m_ParentWidget; - - if (parentView == NULL) { - // Create a new window. - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); - - parentView = gtk_vbox_new(FALSE, 0); - - gtk_container_add(GTK_CONTAINER(window), parentView); - gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); - gtk_widget_show_all(GTK_WIDGET(window)); - - window_info_.m_ParentWidget = parentView; - } - - webkit_glue::WebPreferences prefs; - BrowserToWebSettings(settings_, prefs); - - // Create the webview host object - webviewhost_.reset( - WebViewHost::Create(window_info_.m_ParentWidget, gfx::Rect(), - delegate_.get(), NULL, dev_tools_agent_.get(), - prefs)); - - if (!settings_.developer_tools_disabled) - dev_tools_agent_->SetWebView(webviewhost_->webview()); - - webviewhost_->SetFrameRate(settings_.animation_frame_rate); - - window_info_.m_Widget = webviewhost_->view_handle(); - g_signal_connect(G_OBJECT(window_info_.m_Widget), "destroy", - G_CALLBACK(window_destroyed), this); - - if (!settings_.drag_drop_disabled) { - g_signal_connect(G_OBJECT(window_info_.m_Widget), "button-press-event", - G_CALLBACK(button_press_event), this); - g_signal_connect(G_OBJECT(window_info_.m_Widget), "focus-out-event", - G_CALLBACK(focus_out_event), this); - - delegate_->RegisterDragDrop(); - } - - Unlock(); - - if (client_.get()) { - CefRefPtr handler = client_->GetLifeSpanHandler(); - if (handler.get()) { - // Notify the handler that we're done creating the new window - handler->OnAfterCreated(this); - } - } - - if (url.size() > 0) - UIT_LoadURL(GetMainFrame(), url); - - return true; -} - -void CefBrowserImpl::UIT_SetFocus(WebWidgetHost* host, bool enable) { - REQUIRE_UIT(); - if (!host) - return; - - if (enable) - gtk_widget_grab_focus(host->view_handle()); -} - -bool CefBrowserImpl::UIT_ViewDocumentString(WebKit::WebFrame *frame) { - REQUIRE_UIT(); - - char buff[] = "/tmp/CEFSourceXXXXXX"; - int fd = mkstemp(buff); - - if (fd == -1) - return false; - - FILE* srcOutput; - srcOutput = fdopen(fd, "w+"); - - if (!srcOutput) - return false; - - std::string markup = frame->contentAsMarkup().utf8(); - if (fputs(markup.c_str(), srcOutput) < 0) { - fclose(srcOutput); - return false; - } - - fclose(srcOutput); - std::string newName(buff); - newName.append(".txt"); - if (rename(buff, newName.c_str()) != 0) - return false; - - std::string openCommand("xdg-open "); - openCommand += newName; - - if (system(openCommand.c_str()) != 0) - return false; - - return true; -} - -void CefBrowserImpl::UIT_PrintPage(int page_number, int total_pages, - const gfx::Size& canvas_size, - WebKit::WebFrame* frame) { - REQUIRE_UIT(); - - // TODO(port): Add implementation. - NOTIMPLEMENTED(); -} - -void CefBrowserImpl::UIT_PrintPages(WebKit::WebFrame* frame) { - REQUIRE_UIT(); - - // TODO(port): Add implementation. - NOTIMPLEMENTED(); -} - -int CefBrowserImpl::UIT_GetPagesCount(WebKit::WebFrame* frame) { - REQUIRE_UIT(); - - // TODO(port): Add implementation. - NOTIMPLEMENTED(); - return 0; -} - -// static -void CefBrowserImpl::UIT_CloseView(gfx::NativeView view) { - GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(view)); - gtk_signal_emit_by_name(GTK_OBJECT(window), "delete_event"); -} - -// static -bool CefBrowserImpl::UIT_IsViewVisible(gfx::NativeView view) { - if (!view) - return false; - - if (view->window) - return gdk_window_is_visible(view->window)?true:false; - else - return false; -} - -void CefBrowserImpl::set_last_mouse_down(GdkEventButton* event) { - GdkEventButton* temp = NULL; - if (event) { - temp = reinterpret_cast( - gdk_event_copy(reinterpret_cast(event))); - } - - if (last_mouse_down_) - gdk_event_free(reinterpret_cast(last_mouse_down_)); - - last_mouse_down_ = temp; -} diff --git a/cef1/libcef/browser_impl_mac.mm b/cef1/libcef/browser_impl_mac.mm deleted file mode 100644 index bb5589fad..000000000 --- a/cef1/libcef/browser_impl_mac.mm +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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 - -#include "libcef/cef_context.h" -#include "libcef/browser_impl.h" -#include "libcef/browser_settings.h" -#include "libcef/browser_webview_mac.h" - -#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "webkit/glue/webpreferences.h" - -using WebKit::WebRect; -using WebKit::WebSize; - -void CefBrowserImpl::ParentWindowWillClose() { - // TODO(port): Implement this method if necessary. -} - -CefWindowHandle CefBrowserImpl::GetWindowHandle() { - AutoLock lock_scope(this); - return window_info_.m_View; -} - -bool CefBrowserImpl::IsWindowRenderingDisabled() { - return (window_info_.m_bWindowRenderingDisabled ? true : false); -} - -gfx::NativeView CefBrowserImpl::UIT_GetMainWndHandle() { - REQUIRE_UIT(); - return window_info_.m_bWindowRenderingDisabled ? - window_info_.m_ParentView : window_info_.m_View; -} - -void CefBrowserImpl::UIT_ClearMainWndHandle() { - REQUIRE_UIT(); - if (!window_info_.m_bWindowRenderingDisabled) - window_info_.m_View = NULL; -} - -bool CefBrowserImpl::UIT_CreateBrowser(const CefString& url) { - REQUIRE_UIT(); - Lock(); - - // Add a reference that will be released in UIT_DestroyBrowser(). - AddRef(); - - // Add the new browser to the list maintained by the context - _Context->AddBrowser(this); - - if (!settings_.developer_tools_disabled) - dev_tools_agent_.reset(new BrowserDevToolsAgent()); - - NSWindow* newWnd = nil; - - NSView* parentView = window_info_.m_ParentView; - gfx::Rect contentRect(window_info_.m_x, window_info_.m_y, - window_info_.m_nWidth, window_info_.m_nHeight); - if (!window_info_.m_bWindowRenderingDisabled) { - if (parentView == nil) { - // Create a new window. - NSRect screen_rect = [[NSScreen mainScreen] visibleFrame]; - NSRect window_rect = {{window_info_.m_x, - screen_rect.size.height - window_info_.m_y}, - {window_info_.m_nWidth, window_info_.m_nHeight}}; - if (window_rect.size.width == 0) - window_rect.size.width = 750; - if (window_rect.size.height == 0) - window_rect.size.height = 750; - contentRect.SetRect(0, 0, window_rect.size.width, - window_rect.size.height); - - newWnd = [[NSWindow alloc] - initWithContentRect:window_rect - styleMask:(NSTitledWindowMask | - NSClosableWindowMask | - NSMiniaturizableWindowMask | - NSResizableWindowMask | - NSUnifiedTitleAndToolbarWindowMask ) - backing:NSBackingStoreBuffered - defer:NO]; - parentView = [newWnd contentView]; - window_info_.m_ParentView = parentView; - } - } else { - // Create a new paint delegate. - paint_delegate_.reset(new PaintDelegate(this)); - } - - webkit_glue::WebPreferences prefs; - BrowserToWebSettings(settings_, prefs); - - // Create the webview host object - webviewhost_.reset( - WebViewHost::Create(parentView, contentRect, delegate_.get(), - paint_delegate_.get(), dev_tools_agent_.get(), - prefs)); - - if (window_info_.m_bTransparentPainting) - webviewhost_->webview()->setIsTransparent(true); - - if (!settings_.developer_tools_disabled) - dev_tools_agent_->SetWebView(webviewhost_->webview()); - - webviewhost_->SetFrameRate(settings_.animation_frame_rate); - - BrowserWebView* browserView = (BrowserWebView*)webviewhost_->view_handle(); - browserView.browser = this; - window_info_.m_View = browserView; - - if (!window_info_.m_bWindowRenderingDisabled) { - if (!settings_.drag_drop_disabled) - [browserView registerDragDrop]; - } - - Unlock(); - - if (newWnd != nil && !window_info_.m_bHidden) { - // Show the window. - [newWnd makeKeyAndOrderFront: nil]; - } - - if (client_.get()) { - CefRefPtr handler = client_->GetLifeSpanHandler(); - if(handler.get()) { - // Notify the handler that we're done creating the new window - handler->OnAfterCreated(this); - } - } - - if(url.size() > 0) - UIT_LoadURL(GetMainFrame(), url); - - return true; -} - -void CefBrowserImpl::UIT_SetFocus(WebWidgetHost* host, bool enable) { - REQUIRE_UIT(); - if (!host) - return; - - BrowserWebView* browserView = (BrowserWebView*)host->view_handle(); - if (!browserView) - return; - - if (enable) { - // Guard against calling OnSetFocus twice. - browserView.in_setfocus = true; - [[browserView window] makeFirstResponder:browserView]; - browserView.in_setfocus = false; - } -} - -bool CefBrowserImpl::UIT_ViewDocumentString(WebKit::WebFrame* frame) { - REQUIRE_UIT(); - - char sztmp[L_tmpnam+4]; - if (tmpnam(sztmp)) { - strcat(sztmp, ".txt"); - - FILE* fp = fopen(sztmp, "wb"); - if (fp) { - std::string markup = frame->contentAsMarkup().utf8(); - fwrite(markup.c_str(), 1, markup.size(), fp); - fclose(fp); - - char szopen[L_tmpnam + 14]; - snprintf(szopen, sizeof(szopen), "open -t \"%s\"", sztmp); - return (system(szopen) >= 0); - } - } - return false; -} - -void CefBrowserImpl::UIT_PrintPage(int page_number, int total_pages, - const gfx::Size& canvas_size, - WebKit::WebFrame* frame) { - REQUIRE_UIT(); - - // TODO(port): Add implementation. - NOTIMPLEMENTED(); -} - -void CefBrowserImpl::UIT_PrintPages(WebKit::WebFrame* frame) { - REQUIRE_UIT(); - - // TODO(port): Add implementation. - NOTIMPLEMENTED(); -} - -int CefBrowserImpl::UIT_GetPagesCount(WebKit::WebFrame* frame) { - REQUIRE_UIT(); - - // TODO(port): Add implementation. - NOTIMPLEMENTED(); - return 0; -} - -// static -void CefBrowserImpl::UIT_CloseView(gfx::NativeView view) { - [[view window] performSelector:@selector(performClose:) - withObject:nil - afterDelay:0]; -} - -// static -bool CefBrowserImpl::UIT_IsViewVisible(gfx::NativeView view) { - return [[view window] isVisible]; -} diff --git a/cef1/libcef/browser_impl_win.cc b/cef1/libcef/browser_impl_win.cc deleted file mode 100644 index c3558817a..000000000 --- a/cef1/libcef/browser_impl_win.cc +++ /dev/null @@ -1,594 +0,0 @@ -// Copyright (c) 2008-2009 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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 "libcef/browser_impl.h" - -#include -#include -#include -#include -#include - -#include "libcef/cef_context.h" -#include "libcef/browser_settings.h" - -#include "base/win/windows_version.h" -#include "printing/units.h" -#include "skia/ext/vector_canvas.h" -#include "skia/ext/vector_platform_device_emf_win.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPrintParams.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/base/win/hwnd_util.h" -#include "webkit/glue/webpreferences.h" - -#pragma comment(lib, "dwmapi.lib") - -using WebKit::WebRect; -using WebKit::WebSize; - -namespace { - -bool IsAeroGlassEnabled() { - if (base::win::GetVersion() < base::win::VERSION_VISTA) - return false; - - BOOL enabled = FALSE; - return SUCCEEDED(DwmIsCompositionEnabled(&enabled)) && enabled; -} - -void SetAeroGlass(HWND hWnd) { - if (!IsAeroGlassEnabled()) - return; - - // Make the whole window transparent. - MARGINS mgMarInset = { -1, -1, -1, -1 }; - DwmExtendFrameIntoClientArea(hWnd, &mgMarInset); -} - -} // namespace - -LPCTSTR CefBrowserImpl::GetWndClass() { - return L"CefBrowserWindow"; -} - -LRESULT CALLBACK CefBrowserImpl::WndProc(HWND hwnd, UINT message, - WPARAM wParam, LPARAM lParam) { - CefBrowserImpl* browser = - static_cast(ui::GetWindowUserData(hwnd)); - - switch (message) { - case WM_CLOSE: - if (browser) { - bool handled(false); - - if (browser->client_.get()) { - CefRefPtr handler = - browser->client_->GetLifeSpanHandler(); - if (handler.get()) { - // Give the client a chance to handle this one. - handled = handler->DoClose(browser); - } - } - - if (handled) - return 0; - - // We are our own parent in this case. - browser->ParentWindowWillClose(); - } - break; - - case WM_DESTROY: - if (browser) { - // Clear the user data pointer. - ui::SetWindowUserData(hwnd, NULL); - - BrowserWebViewDelegate* delegate = browser->UIT_GetWebViewDelegate(); - if (delegate && delegate->drag_delegate()) { - // Don't destroy the browser while a drag operation is pending. Instead, - // destroy the browser once the drag operation completes. - delegate->set_destroy_on_drag_end(true); - } else { - // Destroy the browser. - browser->UIT_DestroyBrowser(); - } - } - return 0; - - case WM_SIZE: - if (browser && browser->UIT_GetWebView()) { - // resize the web view window to the full size of the browser window - RECT rc; - GetClientRect(hwnd, &rc); - MoveWindow(browser->UIT_GetWebViewWndHandle(), 0, 0, rc.right, rc.bottom, - TRUE); - } - return 0; - - case WM_SETFOCUS: - if (browser) - browser->SetFocus(true); - return 0; - - case WM_ERASEBKGND: - return 0; - - case WM_DWMCOMPOSITIONCHANGED: - // Message sent to top-level windows when composition has been enabled or - // disabled. - if (browser->window_info_.m_bTransparentPainting) - SetAeroGlass(hwnd); - break; - } - - return DefWindowProc(hwnd, message, wParam, lParam); -} - -void CefBrowserImpl::ParentWindowWillClose() { - // We must re-enable the opener (owner of the modal window) before we close - // the popup to avoid focus/activation/z-order issues. - if (opener_ && opener_was_disabled_by_modal_loop_) { - HWND owner = ::GetAncestor(opener_, GA_ROOT); - ::EnableWindow(owner, TRUE); - } -} - -CefWindowHandle CefBrowserImpl::GetWindowHandle() { - AutoLock lock_scope(this); - return window_info_.m_hWnd; -} - -bool CefBrowserImpl::IsWindowRenderingDisabled() { - return (window_info_.m_bWindowRenderingDisabled ? true : false); -} - -gfx::NativeWindow CefBrowserImpl::UIT_GetMainWndHandle() { - REQUIRE_UIT(); - return window_info_.m_bWindowRenderingDisabled ? - window_info_.m_hWndParent : window_info_.m_hWnd; -} - -void CefBrowserImpl::UIT_ClearMainWndHandle() { - REQUIRE_UIT(); - if (!window_info_.m_bWindowRenderingDisabled) - window_info_.m_hWnd = NULL; -} - -bool CefBrowserImpl::UIT_CreateBrowser(const CefString& url) { - REQUIRE_UIT(); - Lock(); - - if (!window_info_.m_bWindowRenderingDisabled) { - std::wstring windowName(CefString(&window_info_.m_windowName)); - - // Create the new browser window - window_info_.m_hWnd = CreateWindowEx(window_info_.m_dwExStyle, - GetWndClass(), windowName.c_str(), window_info_.m_dwStyle, - window_info_.m_x, window_info_.m_y, window_info_.m_nWidth, - window_info_.m_nHeight, window_info_.m_hWndParent, window_info_.m_hMenu, - ::GetModuleHandle(NULL), NULL); - - // It's possible for CreateWindowEx to fail if the parent window was - // destroyed between the call to CreateBrowser and the above one. - DCHECK(window_info_.m_hWnd != NULL); - if (!window_info_.m_hWnd) { - Unlock(); - return false; - } - - if (window_info_.m_bTransparentPainting && - !(window_info_.m_dwStyle & WS_CHILD)) { - // Transparent top-level windows will be given "sheet of glass" effect. - SetAeroGlass(window_info_.m_hWnd); - } - - // Set window user data to this object for future reference from the window - // procedure - ui::SetWindowUserData(window_info_.m_hWnd, this); - } else { - // Create a new paint delegate. - paint_delegate_.reset(new PaintDelegate(this)); - } - - dev_tools_agent_.reset(new BrowserDevToolsAgent()); - - // Add a reference that will be released in UIT_DestroyBrowser(). - AddRef(); - - // Add the new browser to the list maintained by the context - _Context->AddBrowser(this); - - webkit_glue::WebPreferences prefs; - BrowserToWebSettings(settings_, prefs); - - // Create the webview host object - webviewhost_.reset( - WebViewHost::Create(window_info_.m_hWnd, gfx::Rect(), delegate_.get(), - paint_delegate_.get(), dev_tools_agent_.get(), - prefs)); - - if (window_info_.m_bTransparentPainting) - webviewhost_->webview()->setIsTransparent(true); - - dev_tools_agent_->SetWebView(webviewhost_->webview()); - - webviewhost_->SetFrameRate(settings_.animation_frame_rate); - - Unlock(); - - if (!window_info_.m_bWindowRenderingDisabled) { - if (!settings_.drag_drop_disabled) - delegate_->RegisterDragDrop(); - - // Size the web view window to the browser window - RECT cr; - GetClientRect(window_info_.m_hWnd, &cr); - - // Respect the WS_VISIBLE window style when setting the window's position - UINT flags = SWP_NOZORDER; - if (window_info_.m_dwStyle & WS_VISIBLE) - flags |= SWP_SHOWWINDOW; - else - flags |= SWP_NOACTIVATE; - - SetWindowPos(UIT_GetWebViewWndHandle(), NULL, cr.left, cr.top, cr.right, - cr.bottom, flags); - } - - if (client_.get()) { - CefRefPtr handler = client_->GetLifeSpanHandler(); - if (handler.get()) { - // Notify the handler that we're done creating the new window - handler->OnAfterCreated(this); - } - } - - if (url.length() > 0) - UIT_LoadURL(GetMainFrame(), url); - - return true; -} - -void CefBrowserImpl::UIT_SetFocus(WebWidgetHost* host, bool enable) { - REQUIRE_UIT(); - if (!host) - return; - - if (enable) - ::SetFocus(host->view_handle()); - else if (::GetFocus() == host->view_handle()) - ::SetFocus(NULL); -} - -static void WriteTextToFile(const std::string& data, - const std::wstring& file_path) { - FILE* fp; - errno_t err = _wfopen_s(&fp, file_path.c_str(), L"wt"); - if (err) - return; - fwrite(data.c_str(), 1, data.size(), fp); - fclose(fp); -} - -bool CefBrowserImpl::UIT_ViewDocumentString(WebKit::WebFrame *frame) { - REQUIRE_UIT(); - - DWORD dwRetVal; - DWORD dwBufSize = 512; - TCHAR lpPathBuffer[512]; - UINT uRetVal; - TCHAR szTempName[512]; - - dwRetVal = GetTempPath(dwBufSize, // length of the buffer - lpPathBuffer); // buffer for path - if (dwRetVal > dwBufSize || (dwRetVal == 0)) - return false; - - // Create a temporary file. - uRetVal = GetTempFileName(lpPathBuffer, // directory for tmp files - TEXT("src"), // temp file name prefix - 0, // create unique name - szTempName); // buffer for name - if (uRetVal == 0) - return false; - - size_t len = wcslen(szTempName); - wcscpy(szTempName + len - 3, L"txt"); - std::string markup = frame->contentAsMarkup().utf8(); - WriteTextToFile(markup, szTempName); - - int errorCode = reinterpret_cast(ShellExecute(UIT_GetMainWndHandle(), - L"open", szTempName, NULL, NULL, SW_SHOWNORMAL)); - if (errorCode <= 32) - return false; - - return true; -} - -void CefBrowserImpl::UIT_PrintPage(int page_number, int total_pages, - const gfx::Size& canvas_size, - WebKit::WebFrame* frame) { - REQUIRE_UIT(); - - printing::PrintParams params; - const printing::PrintSettings &settings = print_context_.settings(); - settings.RenderParams(¶ms); - - const int src_size_x = canvas_size.width(); - const int src_size_y = canvas_size.height(); - - const int dest_size_x = - settings.page_setup_pixels().printable_area().width(); - const int dest_size_y = - settings.page_setup_pixels().printable_area().height(); - - print_context_.NewPage(); - - HDC hDC = print_context_.context(); - BOOL res; - - // Save the state to make sure the context this function call does not modify - // the device context. - int saved_state = SaveDC(hDC); - DCHECK_NE(saved_state, 0); - - SkDevice* device = skia::VectorPlatformDeviceEmf::CreateDevice(dest_size_x, - dest_size_y, - true, hDC); - DCHECK(device); - skia::VectorCanvas canvas(device); - - // The hDC 0 coord is the left most printeable area and not physical area of - // the paper so subtract that out of our canvas translate. - const int left_margin_offset = - settings.page_setup_pixels().effective_margins().left - - settings.page_setup_pixels().printable_area().x(); - const int top_margin_offset = - settings.page_setup_pixels().effective_margins().top - - settings.page_setup_pixels().printable_area().y(); - - // Adjust for the margin offset. - canvas.translate(static_cast(left_margin_offset), - static_cast(top_margin_offset)); - - // Apply the print scaling factor. - const float print_scale_x = - static_cast(settings.page_setup_pixels().content_area().width()) - / src_size_x; - const float print_scale_y = - static_cast(settings.page_setup_pixels().content_area().height()) - / src_size_y; - canvas.scale(print_scale_x, print_scale_y); - - // Apply the WebKit scaling factor. - const float webkit_scale = frame->getPrintPageShrink(page_number); - if (webkit_scale <= 0) { - NOTREACHED() << "Printing page " << page_number << " failed."; - } - canvas.scale(webkit_scale, webkit_scale); - - frame->printPage(page_number, &canvas); - - res = RestoreDC(hDC, saved_state); - DCHECK_NE(res, 0); - - CefRefPtr handler; - if (client_.get()) - handler = client_->GetPrintHandler(); - - if (handler.get()) { - saved_state = SaveDC(hDC); - DCHECK_NE(saved_state, 0); - - // Gather print header state information - RECT rect; - rect.left = left_margin_offset; - rect.top = settings.page_setup_pixels().effective_margins().header - - settings.page_setup_pixels().printable_area().y(); - rect.right = left_margin_offset + - settings.page_setup_pixels().content_area().width(); - rect.bottom = settings.page_setup_pixels().printable_area().height() - - (settings.page_setup_pixels().effective_margins().footer - - (settings.page_setup_pixels().physical_size().height() - - settings.page_setup_pixels().printable_area().bottom())); - - const double scale = static_cast(settings.dpi()) / - static_cast(settings.desired_dpi); - - CefPrintInfo printInfo; - - printInfo.m_hDC = hDC; - printInfo.m_Rect = rect; - printInfo.m_Scale = scale; - - CefString url(frame->document().url().spec()); - CefString title = title_; - - CefString topLeft, topCenter, topRight; - CefString bottomLeft, bottomCenter, bottomRight; - - // Allow the handler to format print header and/or footer. - bool handled = handler->GetPrintHeaderFooter(this, UIT_GetCefFrame(frame), - printInfo, url, title, page_number+1, total_pages, topLeft, topCenter, - topRight, bottomLeft, bottomCenter, bottomRight); - - if (!handled) { - // Draw handler-defined headers and/or footers. - LOGFONT lf; - memset(&lf, 0, sizeof(lf)); - lf.lfHeight = static_cast(ceil(10. * scale)); - lf.lfPitchAndFamily = FF_SWISS; - HFONT hFont = CreateFontIndirect(&lf); - - HFONT hOldFont = (HFONT)SelectObject(hDC, hFont); - COLORREF hOldColor = SetTextColor(hDC, RGB(0, 0, 0)); - int hOldBkMode = SetBkMode(hDC, TRANSPARENT); - - // TODO(cef): Keep the header strings inside a reasonable bounding box - // so that they don't overlap each other. - if (topLeft.length() > 0) { - std::wstring topLeftStr(topLeft); - DrawText(hDC, topLeftStr.c_str(), topLeftStr.length(), &rect, - DT_LEFT | DT_TOP | DT_SINGLELINE | DT_END_ELLIPSIS - | DT_EXPANDTABS | DT_NOPREFIX); - } - if (topCenter.length() > 0) { - std::wstring topCenterStr(topCenter); - DrawText(hDC, topCenterStr.c_str(), topCenterStr.length(), &rect, - DT_CENTER | DT_TOP | DT_SINGLELINE | DT_END_ELLIPSIS - | DT_EXPANDTABS | DT_NOPREFIX); - } - if (topRight.length() > 0) { - std::wstring topRightStr(topRight); - DrawText(hDC, topRightStr.c_str(), topRightStr.length(), &rect, - DT_RIGHT | DT_TOP | DT_SINGLELINE | DT_END_ELLIPSIS - | DT_EXPANDTABS | DT_NOPREFIX); - } - if (bottomLeft.length() > 0) { - std::wstring bottomLeftStr(bottomLeft); - DrawText(hDC, bottomLeftStr.c_str(), bottomLeftStr.length(), &rect, - DT_LEFT | DT_BOTTOM | DT_SINGLELINE | DT_END_ELLIPSIS - | DT_EXPANDTABS | DT_NOPREFIX); - } - if (bottomCenter.length() > 0) { - std::wstring bottomCenterStr(bottomCenter); - DrawText(hDC, bottomCenterStr.c_str(), bottomCenterStr.length(), &rect, - DT_CENTER | DT_BOTTOM | DT_SINGLELINE | DT_END_ELLIPSIS - | DT_EXPANDTABS | DT_NOPREFIX); - } - if (bottomRight.length() > 0) { - std::wstring bottomRightStr(bottomRight); - DrawText(hDC, bottomRightStr.c_str(), bottomRightStr.length(), &rect, - DT_RIGHT | DT_BOTTOM | DT_SINGLELINE | DT_END_ELLIPSIS - | DT_EXPANDTABS | DT_NOPREFIX); - } - - SetTextColor(hDC, hOldColor); - SelectObject(hDC, hOldFont); - DeleteObject(hFont); - SetBkMode(hDC, hOldBkMode); - } - - res = RestoreDC(hDC, saved_state); - DCHECK_NE(res, 0); - } - - print_context_.PageDone(); -} - -void CefBrowserImpl::UIT_PrintPages(WebKit::WebFrame* frame) { - REQUIRE_UIT(); - - print_context_.Init(); - { - // Make a copy of settings. - printing::PrintSettings settings = print_context_.settings(); - CefPrintOptions print_options; - settings.UpdatePrintOptions(print_options); - - CefRefPtr handler; - if (client_.get()) - handler = client_->GetPrintHandler(); - - // Ask the handler if they want to update the print options. - if (handler.get() && handler->GetPrintOptions(this, print_options)) { - settings.UpdateFromPrintOptions(print_options); - print_context_.InitWithSettings(settings); - } - } - - if (print_context_.AskUserForSettings( - UIT_GetMainWndHandle(), UIT_GetPagesCount(frame), false) - != printing::PrintingContext::OK) - return; - - printing::PrintParams params; - const printing::PrintSettings &settings = print_context_.settings(); - - settings.RenderParams(¶ms); - - int page_count = 0; - gfx::Size canvas_size; - - canvas_size.set_width( - printing::ConvertUnit( - settings.page_setup_pixels().content_area().width(), - static_cast(params.dpi), - params.desired_dpi)); - canvas_size.set_height( - printing::ConvertUnit( - settings.page_setup_pixels().content_area().height(), - static_cast(params.dpi), - params.desired_dpi)); - WebKit::WebPrintParams printParams( - WebSize(canvas_size.width(), canvas_size.height())); - page_count = frame->printBegin(printParams); - - if (page_count) { - base::MessageLoop::ScopedNestableTaskAllower allow( - base::MessageLoop::current()); - - if (print_context_.NewDocument(title_) == printing::PrintingContext::OK) { - if (settings.ranges.size() > 0) { - for (unsigned x = 0; x < settings.ranges.size(); ++x) { - const printing::PageRange& range = settings.ranges[x]; - for (int i = range.from; i <= range.to; ++i) - UIT_PrintPage(i, page_count, canvas_size, frame); - } - } else { - for (int i = 0; i < page_count; ++i) - UIT_PrintPage(i, page_count, canvas_size, frame); - } - print_context_.DocumentDone(); - } - } - - frame->printEnd(); -} - -int CefBrowserImpl::UIT_GetPagesCount(WebKit::WebFrame* frame) { - REQUIRE_UIT(); - - printing::PrintParams params; - const printing::PrintSettings &settings = print_context_.settings(); - - settings.RenderParams(¶ms); - - // The dbi will be 0 if no default printer is configured. - if (params.dpi == 0) - return 0; - - int page_count = 0; - gfx::Size canvas_size; - - canvas_size.set_width( - printing::ConvertUnit( - settings.page_setup_pixels().content_area().width(), - static_cast(params.dpi), - params.desired_dpi)); - canvas_size.set_height( - printing::ConvertUnit( - settings.page_setup_pixels().content_area().height(), - static_cast(params.dpi), - params.desired_dpi)); - page_count = frame->printBegin(WebSize(canvas_size)); - frame->printEnd(); - - return page_count; -} - -// static -void CefBrowserImpl::UIT_CloseView(gfx::NativeView view) { - PostMessage(view, WM_CLOSE, 0, 0); -} - -// static -bool CefBrowserImpl::UIT_IsViewVisible(gfx::NativeView view) { - return IsWindowVisible(view) ? true : false; -} diff --git a/cef1/libcef/browser_navigation_controller.cc b/cef1/libcef/browser_navigation_controller.cc deleted file mode 100644 index 308db5215..000000000 --- a/cef1/libcef/browser_navigation_controller.cc +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright (c) 2008 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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 "libcef/browser_navigation_controller.h" -#include "libcef/browser_impl.h" - -#include "base/logging.h" -#include "net/base/upload_data.h" - -// ---------------------------------------------------------------------------- -// BrowserNavigationEntry - -BrowserNavigationEntry::BrowserNavigationEntry() - : page_id_(-1) { -} - -BrowserNavigationEntry::BrowserNavigationEntry(int page_id, - const GURL& url, - const CefString& title, - const CefString& target_frame, - const CefString& method, - const WebKit::WebHTTPBody& upload, - const CefRequest::HeaderMap& headers) - : page_id_(page_id), - url_(url), - title_(title), - method_(method), - headers_(headers), - target_frame_(target_frame) { - if (!upload.isNull()) - upload_ = upload; -} - -BrowserNavigationEntry::~BrowserNavigationEntry() { -} - -void BrowserNavigationEntry::SetContentState(const std::string& state) { - state_ = state; -} - -// ---------------------------------------------------------------------------- -// BrowserNavigationController - -BrowserNavigationController::BrowserNavigationController( - CefBrowserImpl* browser) - : pending_entry_(NULL), - last_committed_entry_index_(-1), - pending_entry_index_(-1), - browser_(browser), - max_page_id_(-1) { -} - -BrowserNavigationController::~BrowserNavigationController() { - DiscardPendingEntry(); -} - -void BrowserNavigationController::Reset() { - entries_.clear(); - DiscardPendingEntry(); - - last_committed_entry_index_ = -1; - UpdateMaxPageID(); -} - -void BrowserNavigationController::Reload(bool ignoreCache) { - // Base the navigation on where we are now... - int current_index = GetCurrentEntryIndex(); - - // If we are no where, then we can't reload. TODO(darin): We should add a - // CanReload method. - if (current_index == -1) - return; - - DiscardPendingEntry(); - - pending_entry_index_ = current_index; - NavigateToPendingEntry(true, ignoreCache); -} - -void BrowserNavigationController::GoToOffset(int offset) { - int index = last_committed_entry_index_ + offset; - if (index < 0 || index >= GetEntryCount()) - return; - - GoToIndex(index); -} - -void BrowserNavigationController::GoToIndex(int index) { - DCHECK_GE(index, 0); - DCHECK_LT(index, static_cast(entries_.size())); - - DiscardPendingEntry(); - - pending_entry_index_ = index; - NavigateToPendingEntry(false, false); -} - -void BrowserNavigationController::LoadEntry(BrowserNavigationEntry* entry) { - // When navigating to a new page, we don't know for sure if we will actually - // end up leaving the current page. The new page load could for example - // result in a download or a 'no content' response (e.g., a mailto: URL). - DiscardPendingEntry(); - pending_entry_ = entry; - NavigateToPendingEntry(false, false); -} - - -BrowserNavigationEntry* BrowserNavigationController::GetLastCommittedEntry() - const { - if (last_committed_entry_index_ == -1) - return NULL; - return const_cast( - entries_[last_committed_entry_index_]); -} - -BrowserNavigationEntry* BrowserNavigationController::GetActiveEntry() const { - BrowserNavigationEntry* entry = pending_entry_; - if (!entry) - entry = GetLastCommittedEntry(); - return entry; -} - -int BrowserNavigationController::GetCurrentEntryIndex() const { - if (pending_entry_index_ != -1) - return pending_entry_index_; - return last_committed_entry_index_; -} - - -BrowserNavigationEntry* BrowserNavigationController::GetEntryAtIndex( - int index) const { - if (index < 0 || index >= GetEntryCount()) - return NULL; - - return const_cast(entries_[index]); -} - -BrowserNavigationEntry* BrowserNavigationController::GetEntryWithPageID( - int32 page_id) const { - int index = GetEntryIndexWithPageID(page_id); - return (index != -1) ? - const_cast(entries_[index]) : NULL; -} - -void BrowserNavigationController::DidNavigateToEntry( - BrowserNavigationEntry* entry) { - // If the entry is that of a page with PageID larger than any this Tab has - // seen before, then consider it a new navigation. - if (entry->GetPageID() > GetMaxPageID()) { - InsertEntry(entry); - return; - } - - // Otherwise, we just need to update an existing entry with matching PageID. - // If the existing entry corresponds to the entry which is pending, then we - // must update the current entry index accordingly. When navigating to the - // same URL, a new PageID is not created. - - int existing_entry_index = GetEntryIndexWithPageID(entry->GetPageID()); - BrowserNavigationEntry* existing_entry = (existing_entry_index != -1) ? - entries_[existing_entry_index] : NULL; - if (!existing_entry) { - // No existing entry, then simply ignore this navigation! - DLOG(WARNING) << "ignoring navigation for page: " << entry->GetPageID(); - } else if (existing_entry == pending_entry_) { - // The given entry might provide a new URL... e.g., navigating back to a - // page in session history could have resulted in a new client redirect. - existing_entry->SetURL(entry->GetURL()); - existing_entry->SetContentState(entry->GetContentState()); - last_committed_entry_index_ = pending_entry_index_; - pending_entry_index_ = -1; - pending_entry_ = NULL; - } else if (pending_entry_ && pending_entry_->GetPageID() == -1 && - pending_entry_->GetURL() == existing_entry->GetURL()) { - // Not a new navigation - DiscardPendingEntry(); - } else { - // The given entry might provide a new URL... e.g., navigating to a page - // might result in a client redirect, which should override the URL of the - // existing entry. - existing_entry->SetURL(entry->GetURL()); - existing_entry->SetContentState(entry->GetContentState()); - - // The navigation could have been issued by the renderer, so be sure that - // we update our current index. - last_committed_entry_index_ = existing_entry_index; - } - - delete entry; - UpdateMaxPageID(); -} - -void BrowserNavigationController::DiscardPendingEntry() { - if (pending_entry_index_ == -1 && pending_entry_) - delete pending_entry_; - pending_entry_ = NULL; - pending_entry_index_ = -1; -} - -void BrowserNavigationController::InsertEntry(BrowserNavigationEntry* entry) { - DiscardPendingEntry(); - - const CefBrowserSettings& settings = browser_->settings(); - if (settings.history_disabled) { - // History is disabled. Remove any existing entries. - if (entries_.size() > 0) - entries_.clear(); - } else { - // Prune any entry which are in front of the current entry. - int current_size = static_cast(entries_.size()); - if (current_size > 0) { - while (last_committed_entry_index_ < (current_size - 1)) { - entries_.erase(entries_.end() - 1); - current_size--; - } - } - } - - entries_.push_back(entry); - last_committed_entry_index_ = static_cast(entries_.size()) - 1; - UpdateMaxPageID(); -} - -int BrowserNavigationController::GetEntryIndexWithPageID(int32 page_id) const { - for (int i = static_cast(entries_.size())-1; i >= 0; --i) { - if (entries_[i]->GetPageID() == page_id) - return i; - } - return -1; -} - -void BrowserNavigationController::NavigateToPendingEntry(bool reload, - bool ignoreCache) { - // For session history navigations only the pending_entry_index_ is set. - if (!pending_entry_) { - DCHECK_NE(pending_entry_index_, -1); - pending_entry_ = entries_[pending_entry_index_]; - } - - if (browser_->UIT_Navigate(*pending_entry_, reload, ignoreCache)) { - // Note: this is redundant if navigation completed synchronously because - // DidNavigateToEntry call this as well. - UpdateMaxPageID(); - } else { - DiscardPendingEntry(); - } -} - -void BrowserNavigationController::UpdateMaxPageID() { - BrowserNavigationEntry* entry = GetActiveEntry(); - if (entry) - max_page_id_ = std::max(max_page_id_, entry->GetPageID()); -} diff --git a/cef1/libcef/browser_navigation_controller.h b/cef1/libcef/browser_navigation_controller.h deleted file mode 100644 index 85849fc59..000000000 --- a/cef1/libcef/browser_navigation_controller.h +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright (c) 2008-2009 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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. - -#ifndef CEF_LIBCEF_BROWSER_NAVIGATION_CONTROLLER_H_ -#define CEF_LIBCEF_BROWSER_NAVIGATION_CONTROLLER_H_ -#pragma once - -#include -#include - -#include "base/basictypes.h" -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_vector.h" -#include "googleurl/src/gurl.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebHTTPBody.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h" - -#include "include/cef_request.h" - -class GURL; -class CefBrowserImpl; - -// Associated with browser-initated navigations to hold tracking data. -class BrowserExtraData : public WebKit::WebDataSource::ExtraData { - public: - explicit BrowserExtraData(int32 pending_page_id) - : pending_page_id(pending_page_id), - request_committed(false) { - } - - // Contains the page_id for this navigation or -1 if there is none yet. - int32 pending_page_id; - - // True if we have already processed the "DidCommitLoad" event for this - // request. Used by session history. - bool request_committed; -}; - -// Stores one back/forward navigation state for the test shell. -class BrowserNavigationEntry { - public: - BrowserNavigationEntry(); - BrowserNavigationEntry(int page_id, - const GURL& url, - const CefString& title, - const CefString& target_frame, - const CefString& method, - const WebKit::WebHTTPBody& upload, - const CefRequest::HeaderMap& headers); - ~BrowserNavigationEntry(); - - // Set / Get the URI - void SetURL(const GURL& url) { url_ = url; } - const GURL& GetURL() const { return url_; } - - // Set / Get the title - void SetTitle(const CefString& a_title) { title_ = a_title; } - const CefString& GetTitle() const { return title_; } - - // Set / Get opaque state. - // WARNING: This state is saved to the database and used to restore previous - // states. If you use write a custom TabContents and provide your own - // state make sure you have the ability to modify the format in the future - // while being able to deal with older versions. - void SetContentState(const std::string& state); - const std::string& GetContentState() const { return state_; } - - // Get the page id corresponding to the tab's state. - void SetPageID(int page_id) { page_id_ = page_id; } - int32 GetPageID() const { return page_id_; } - - const CefString& GetTargetFrame() const { return target_frame_; } - - const CefString& GetMethod() const { return method_; } - const WebKit::WebHTTPBody& GetUploadData() const { return upload_; } - const CefRequest::HeaderMap& GetHeaders() const { return headers_; } - - private: - // Describes the current page that the tab represents. This is not relevant - // for all tab contents types. - int32 page_id_; - - GURL url_; - CefString title_; - std::string state_; - CefString method_; - WebKit::WebHTTPBody upload_; - CefRequest::HeaderMap headers_; - - CefString target_frame_; - - DISALLOW_COPY_AND_ASSIGN(BrowserNavigationEntry); -}; - -// Browser's NavigationController. The goal is to be as close to the Chrome -// version as possible. -class BrowserNavigationController { - public: - explicit BrowserNavigationController(CefBrowserImpl* browser); - ~BrowserNavigationController(); - - void Reset(); - - // Causes the controller to reload the current (or pending) entry. - void Reload(bool ignoreCache); - - // Causes the controller to go to the specified offset from current. Does - // nothing if out of bounds. - void GoToOffset(int offset); - - // Causes the controller to go to the specified index. - void GoToIndex(int index); - - // Causes the controller to load the specified entry. The controller - // assumes ownership of the entry. - // NOTE: Do not pass an entry that the controller already owns! - void LoadEntry(BrowserNavigationEntry* entry); - - // Returns the last committed entry, which may be null if there are no - // committed entries. - BrowserNavigationEntry* GetLastCommittedEntry() const; - - // Returns the number of entries in the NavigationControllerBase, excluding - // the pending entry if there is one. - int GetEntryCount() const { - return static_cast(entries_.size()); - } - - // Returns the active entry, which is the pending entry if a navigation is in - // progress or the last committed entry otherwise. NOTE: This can be NULL!! - // - // If you are trying to get the current state of the NavigationControllerBase, - // this is the method you will typically want to call. - BrowserNavigationEntry* GetActiveEntry() const; - - // Returns the index from which we would go back/forward or reload. This is - // the last_committed_entry_index_ if pending_entry_index_ is -1. Otherwise, - // it is the pending_entry_index_. - int GetCurrentEntryIndex() const; - - // Returns the entry at the specified index. Returns NULL if out of - // bounds. - BrowserNavigationEntry* GetEntryAtIndex(int index) const; - - // Return the entry with the corresponding type and page_id, or NULL if - // not found. - BrowserNavigationEntry* GetEntryWithPageID(int32 page_id) const; - - // Returns the index of the last committed entry. - int GetLastCommittedEntryIndex() const { - return last_committed_entry_index_; - } - - // Returns true if there are no entries before the last committed entry. - bool IsAtStart() const { - return (GetLastCommittedEntryIndex() == 0); - } - - // Returns true if there are no entries after the last committed entry. - bool IsAtEnd() const { - return (GetLastCommittedEntryIndex() == GetEntryCount()-1); - } - - // Used to inform us of a navigation being committed for a tab. We will take - // ownership of the entry. Any entry located forward to the current entry will - // be deleted. The new entry becomes the current entry. - void DidNavigateToEntry(BrowserNavigationEntry* entry); - - // Used to inform us to discard its pending entry. - void DiscardPendingEntry(); - - private: - // Inserts an entry after the current position, removing all entries after it. - // The new entry will become the active one. - void InsertEntry(BrowserNavigationEntry* entry); - - int GetMaxPageID() const { return max_page_id_; } - void NavigateToPendingEntry(bool reload, bool ignoreCache); - - // Return the index of the entry with the corresponding type and page_id, - // or -1 if not found. - int GetEntryIndexWithPageID(int32 page_id) const; - - // Updates the max page ID with that of the given entry, if is larger. - void UpdateMaxPageID(); - - // List of NavigationEntry for this tab - typedef ScopedVector NavigationEntryList; - NavigationEntryList entries_; - - // An entry we haven't gotten a response for yet. This will be discarded - // when we navigate again. It's used only so we know what the currently - // displayed tab is. - BrowserNavigationEntry* pending_entry_; - - // currently visible entry - int last_committed_entry_index_; - - // index of pending entry if it is in entries_, or -1 if pending_entry_ is a - // new entry (created by LoadURL). - int pending_entry_index_; - - CefBrowserImpl* browser_; - int max_page_id_; - - DISALLOW_EVIL_CONSTRUCTORS(BrowserNavigationController); -}; - -#endif // CEF_LIBCEF_BROWSER_NAVIGATION_CONTROLLER_H_ diff --git a/cef1/libcef/browser_network_delegate.cc b/cef1/libcef/browser_network_delegate.cc deleted file mode 100644 index 3bd3ba31f..000000000 --- a/cef1/libcef/browser_network_delegate.cc +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. -// Portions 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 "libcef/browser_network_delegate.h" - -#include "net/base/net_errors.h" -#include "net/base/static_cookie_policy.h" -#include "net/url_request/url_request.h" - -BrowserNetworkDelegate::BrowserNetworkDelegate() - : accept_all_cookies_(true) { -} - -BrowserNetworkDelegate::~BrowserNetworkDelegate() { -} - -int BrowserNetworkDelegate::OnBeforeURLRequest( - net::URLRequest* request, - const net::CompletionCallback& callback, - GURL* new_url) { - return net::OK; -} - -int BrowserNetworkDelegate::OnBeforeSendHeaders( - net::URLRequest* request, - const net::CompletionCallback& callback, - net::HttpRequestHeaders* headers) { - return net::OK; -} - -void BrowserNetworkDelegate::OnSendHeaders( - net::URLRequest* request, - const net::HttpRequestHeaders& headers) { -} - -int BrowserNetworkDelegate::OnHeadersReceived( - net::URLRequest* request, - const net::CompletionCallback& callback, - const net::HttpResponseHeaders* original_response_headers, - scoped_refptr*override_response_headers) { - return net::OK; -} - -void BrowserNetworkDelegate::OnBeforeRedirect(net::URLRequest* request, - const GURL& new_location) { -} - -void BrowserNetworkDelegate::OnResponseStarted(net::URLRequest* request) { -} - -void BrowserNetworkDelegate::OnRawBytesRead(const net::URLRequest& request, - int bytes_read) { -} -void BrowserNetworkDelegate::OnCompleted(net::URLRequest* request, - bool started) { -} - -void BrowserNetworkDelegate::OnURLRequestDestroyed(net::URLRequest* request) { -} - -void BrowserNetworkDelegate::OnPACScriptError(int line_number, - const string16& error) { -} - -net::NetworkDelegate::AuthRequiredResponse - BrowserNetworkDelegate::OnAuthRequired( - net::URLRequest* request, - const net::AuthChallengeInfo& auth_info, - const AuthCallback& callback, - net::AuthCredentials* credentials) { - return AUTH_REQUIRED_RESPONSE_NO_ACTION; -} - -bool BrowserNetworkDelegate::OnCanGetCookies( - const net::URLRequest& request, - const net::CookieList& cookie_list) { - net::StaticCookiePolicy::Type policy_type = accept_all_cookies_ ? - net::StaticCookiePolicy::ALLOW_ALL_COOKIES : - net::StaticCookiePolicy::BLOCK_SETTING_THIRD_PARTY_COOKIES; - - net::StaticCookiePolicy policy(policy_type); - int rv = policy.CanGetCookies( - request.url(), request.first_party_for_cookies()); - return rv == net::OK; -} - -bool BrowserNetworkDelegate::OnCanSetCookie( - const net::URLRequest& request, - const std::string& cookie_line, - net::CookieOptions* options) { - net::StaticCookiePolicy::Type policy_type = accept_all_cookies_ ? - net::StaticCookiePolicy::ALLOW_ALL_COOKIES : - net::StaticCookiePolicy::BLOCK_SETTING_THIRD_PARTY_COOKIES; - - net::StaticCookiePolicy policy(policy_type); - int rv = policy.CanSetCookie( - request.url(), request.first_party_for_cookies()); - return rv == net::OK; -} - -bool BrowserNetworkDelegate::OnCanAccessFile( - const net::URLRequest& request, - const base::FilePath& path) const { - return true; -} - -bool BrowserNetworkDelegate::OnCanThrottleRequest( - const net::URLRequest& request) const { - return false; -} - -int BrowserNetworkDelegate::OnBeforeSocketStreamConnect( - net::SocketStream* stream, - const net::CompletionCallback& callback) { - return net::OK; -} - -void BrowserNetworkDelegate::OnRequestWaitStateChange( - const net::URLRequest& request, - RequestWaitState state) { -} diff --git a/cef1/libcef/browser_network_delegate.h b/cef1/libcef/browser_network_delegate.h deleted file mode 100644 index c497be50a..000000000 --- a/cef1/libcef/browser_network_delegate.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. -// Portions 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. - -#ifndef CEF_LIBCEF_BROWSER_NETWORK_DELEGATE_H -#define CEF_LIBCEF_BROWSER_NETWORK_DELEGATE_H -#pragma once - -#include "net/base/network_delegate.h" - -class BrowserNetworkDelegate : public net::NetworkDelegate { - public: - BrowserNetworkDelegate(); - virtual ~BrowserNetworkDelegate(); - - private: - // net::NetworkDelegate implementation. - virtual int OnBeforeURLRequest(net::URLRequest* request, - const net::CompletionCallback& callback, - GURL* new_url) OVERRIDE; - virtual int OnBeforeSendHeaders(net::URLRequest* request, - const net::CompletionCallback& callback, - net::HttpRequestHeaders* headers) OVERRIDE; - virtual void OnSendHeaders(net::URLRequest* request, - const net::HttpRequestHeaders& headers) OVERRIDE; - virtual int OnHeadersReceived( - net::URLRequest* request, - const net::CompletionCallback& callback, - const net::HttpResponseHeaders* original_response_headers, - scoped_refptr* - override_response_headers) OVERRIDE; - virtual void OnBeforeRedirect(net::URLRequest* request, - const GURL& new_location) OVERRIDE; - virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE; - virtual void OnRawBytesRead(const net::URLRequest& request, - int bytes_read) OVERRIDE; - virtual void OnCompleted(net::URLRequest* request, bool started) OVERRIDE; - virtual void OnURLRequestDestroyed(net::URLRequest* request) OVERRIDE; - virtual void OnPACScriptError(int line_number, - const string16& error) OVERRIDE; - virtual AuthRequiredResponse OnAuthRequired( - net::URLRequest* request, - const net::AuthChallengeInfo& auth_info, - const AuthCallback& callback, - net::AuthCredentials* credentials) OVERRIDE; - virtual bool OnCanGetCookies(const net::URLRequest& request, - const net::CookieList& cookie_list) OVERRIDE; - virtual bool OnCanSetCookie(const net::URLRequest& request, - const std::string& cookie_line, - net::CookieOptions* options) OVERRIDE; - virtual bool OnCanAccessFile(const net::URLRequest& request, - const base::FilePath& path) const OVERRIDE; - virtual bool OnCanThrottleRequest( - const net::URLRequest& request) const OVERRIDE; - virtual int OnBeforeSocketStreamConnect( - net::SocketStream* stream, - const net::CompletionCallback& callback) OVERRIDE; - virtual void OnRequestWaitStateChange(const net::URLRequest& request, - RequestWaitState state) OVERRIDE; - - bool accept_all_cookies_; -}; - -#endif // CEF_LIBCEF_BROWSER_NETWORK_DELEGATE_H diff --git a/cef1/libcef/browser_request_context.cc b/cef1/libcef/browser_request_context.cc deleted file mode 100644 index c6b1431c0..000000000 --- a/cef1/libcef/browser_request_context.cc +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright (c) 2008 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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 "libcef/browser_request_context.h" - -#if defined(OS_WIN) -#include -#endif - -#include "libcef/browser_file_system.h" -#include "libcef/browser_resource_loader_bridge.h" -#include "libcef/cef_context.h" -#include "libcef/cef_thread.h" - -#include "base/compiler_specific.h" -#include "base/files/file_path.h" -#include "base/file_util.h" -#include "base/thread_task_runner_handle.h" -#include "base/threading/worker_pool.h" -#include "build/build_config.h" -#include "content/browser/net/sqlite_persistent_cookie_store.h" -#include "net/cert/cert_verifier.h" -#include "net/cookies/cookie_monster.h" -#include "net/dns/host_resolver.h" -#include "net/ftp/ftp_network_layer.h" -#include "net/http/http_auth_handler_factory.h" -#include "net/http/http_server_properties_impl.h" -#include "net/proxy/proxy_config_service.h" -#include "net/proxy/proxy_config_service_fixed.h" -#include "net/proxy/proxy_resolver.h" -#include "net/proxy/proxy_service.h" -#include "net/ssl/default_server_bound_cert_store.h" -#include "net/ssl/server_bound_cert_service.h" -#include "net/ssl/ssl_config_service_defaults.h" -#include "net/url_request/http_user_agent_settings.h" -#include "net/url_request/url_request_job_factory_impl.h" -#include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" -#include "webkit/blob/blob_storage_controller.h" -#include "webkit/blob/blob_url_request_job_factory.h" -#include "webkit/fileapi/file_system_context.h" -#include "webkit/fileapi/file_system_url_request_job_factory.h" -#include "webkit/user_agent/user_agent.h" - -#if defined(OS_WIN) -#pragma comment(lib, "winhttp.lib") -#endif - -namespace { - -#if defined(OS_WIN) - -// ProxyConfigService implementation that does nothing. -class ProxyConfigServiceNull : public net::ProxyConfigService { - public: - ProxyConfigServiceNull() {} - virtual void AddObserver(Observer* observer) OVERRIDE {} - virtual void RemoveObserver(Observer* observer) OVERRIDE {} - virtual ProxyConfigService::ConfigAvailability - GetLatestProxyConfig(net::ProxyConfig* config) OVERRIDE - { return ProxyConfigService::CONFIG_VALID; } - virtual void OnLazyPoll() OVERRIDE {} -}; - -#endif // defined(OS_WIN) - -// ProxyResolver implementation that forewards resolution to a CefProxyHandler. -class CefProxyResolver : public net::ProxyResolver { - public: - explicit CefProxyResolver(CefRefPtr handler) - : ProxyResolver(false), - handler_(handler) {} - virtual ~CefProxyResolver() {} - - virtual int GetProxyForURL(const GURL& url, - net::ProxyInfo* results, - const net::CompletionCallback& callback, - RequestHandle* request, - const net::BoundNetLog& net_log) OVERRIDE { - CefProxyInfo proxy_info; - handler_->GetProxyForUrl(url.spec(), proxy_info); - if (proxy_info.IsDirect()) - results->UseDirect(); - else if (proxy_info.IsNamedProxy()) - results->UseNamedProxy(proxy_info.ProxyList()); - else if (proxy_info.IsPacString()) - results->UsePacString(proxy_info.ProxyList()); - - return net::OK; - } - - virtual int SetPacScript( - const scoped_refptr& pac_script, - const net::CompletionCallback& callback) OVERRIDE { - return net::OK; - } - - virtual void CancelRequest(RequestHandle request) OVERRIDE {} - virtual net::LoadState GetLoadState(RequestHandle request) const OVERRIDE { - return net::LOAD_STATE_IDLE; - } - virtual void CancelSetPacScript() OVERRIDE {} - - protected: - CefRefPtr handler_; -}; - -net::ProxyConfigService* CreateProxyConfigService() { -#if defined(OS_POSIX) && !defined(OS_MACOSX) - // Use no proxy to avoid ProxyConfigServiceLinux. - // Enabling use of the ProxyConfigServiceLinux requires: - // -Calling from a thread with a TYPE_UI MessageLoop, - // -If at all possible, passing in a pointer to the IO thread's MessageLoop, - // -Keep in mind that proxy auto configuration is also non-functional on linux - // in this context because of v8 threading issues. - // TODO(port): rename "linux" to some nonspecific unix. - return new net::ProxyConfigServiceFixed(net::ProxyConfig()); -#else - // Use the system proxy settings. - return net::ProxyService::CreateSystemProxyConfigService( - base::ThreadTaskRunnerHandle::Get(), NULL); -#endif -} - -class CefHttpUserAgentSettings : public net::HttpUserAgentSettings { - public: - CefHttpUserAgentSettings() {} - virtual ~CefHttpUserAgentSettings() {} - - // hard-code A-L and A-C for test shells - virtual std::string GetAcceptLanguage() const OVERRIDE { - return "en-us,en"; - } - - virtual std::string GetUserAgent(const GURL& url) const OVERRIDE { - return webkit_glue::GetUserAgent(url); - } - - private: - DISALLOW_COPY_AND_ASSIGN(CefHttpUserAgentSettings); -}; - -} // namespace - - -BrowserRequestContext::BrowserRequestContext() - : ALLOW_THIS_IN_INITIALIZER_LIST(storage_(this)) { - Init(base::FilePath(), net::HttpCache::NORMAL, false); -} - -BrowserRequestContext::BrowserRequestContext( - const base::FilePath& cache_path, - net::HttpCache::Mode cache_mode, - bool no_proxy) - : ALLOW_THIS_IN_INITIALIZER_LIST(storage_(this)) { - Init(cache_path, cache_mode, no_proxy); -} - -void BrowserRequestContext::Init( - const base::FilePath& cache_path, - net::HttpCache::Mode cache_mode, - bool no_proxy) { - SetCookieStoragePath(cache_path); - - storage_.set_server_bound_cert_service(new net::ServerBoundCertService( - new net::DefaultServerBoundCertStore(NULL), - base::WorkerPool::GetTaskRunner(true))); - - storage_.set_http_user_agent_settings(new CefHttpUserAgentSettings); - - CefRefPtr app = _Context->application(); - if (app.get()) { - CefRefPtr handler = app->GetProxyHandler(); - if (handler) { - // The client will provide proxy resolution. - storage_.set_proxy_service( - new net::ProxyService(CreateProxyConfigService(), - new CefProxyResolver(handler), NULL)); - } - } - -#if defined(OS_WIN) - if (!proxy_service()) { - const CefSettings& settings = _Context->settings(); - if (!settings.auto_detect_proxy_settings_enabled) { - // Using the system proxy resolver on Windows when "Automatically detect - // settings" (auto-detection) is checked under LAN Settings can hurt - // resource loading performance because the call to WinHttpGetProxyForUrl - // in proxy_resolver_winhttp.cc will block the IO thread. This is - // especially true for Windows 7 where auto-detection is checked by - // default. To avoid slow resource loading on Windows we only use the - // system proxy resolver if auto-detection is unchecked. - WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ie_config = {0}; - if (WinHttpGetIEProxyConfigForCurrentUser(&ie_config)) { - if (ie_config.fAutoDetect == TRUE) { - storage_.set_proxy_service( - net::ProxyService::CreateWithoutProxyResolver( - new ProxyConfigServiceNull(), NULL)); - } - - if (ie_config.lpszAutoConfigUrl) - GlobalFree(ie_config.lpszAutoConfigUrl); - if (ie_config.lpszProxy) - GlobalFree(ie_config.lpszProxy); - if (ie_config.lpszProxyBypass) - GlobalFree(ie_config.lpszProxyBypass); - } - } - } -#endif // defined(OS_WIN) - - if (!proxy_service()) { - storage_.set_proxy_service( - net::ProxyService::CreateUsingSystemProxyResolver( - CreateProxyConfigService(), 0, NULL)); - } - - storage_.set_host_resolver(net::HostResolver::CreateDefaultResolver(NULL)); - storage_.set_cert_verifier(net::CertVerifier::CreateDefault()); - storage_.set_ssl_config_service(new net::SSLConfigServiceDefaults); - - // Add support for single sign-on. - url_security_manager_.reset(net::URLSecurityManager::Create(NULL, NULL)); - - std::vector supported_schemes; - supported_schemes.push_back("basic"); - supported_schemes.push_back("digest"); - supported_schemes.push_back("ntlm"); - supported_schemes.push_back("negotiate"); - - storage_.set_http_auth_handler_factory( - net::HttpAuthHandlerRegistryFactory::Create(supported_schemes, - url_security_manager_.get(), - host_resolver(), - std::string(), - false, - false)); - storage_.set_http_server_properties(new net::HttpServerPropertiesImpl); - - net::HttpCache::DefaultBackend* backend = new net::HttpCache::DefaultBackend( - cache_path.empty() ? net::MEMORY_CACHE : net::DISK_CACHE, - cache_path, 0, BrowserResourceLoaderBridge::GetCacheThread()); - - net::HttpNetworkSession::Params network_session_params; - network_session_params.host_resolver = host_resolver(); - network_session_params.cert_verifier = cert_verifier(); - network_session_params.server_bound_cert_service = - server_bound_cert_service(); - network_session_params.proxy_service = proxy_service(); - network_session_params.ssl_config_service = ssl_config_service(); - network_session_params.http_auth_handler_factory = - http_auth_handler_factory(); - network_session_params.http_server_properties = http_server_properties(); - network_session_params.host_resolver = host_resolver(); - - net::HttpCache* cache = new net::HttpCache(network_session_params, backend); - cache->set_mode(cache_mode); - storage_.set_http_transaction_factory(cache); - - storage_.set_ftp_transaction_factory( - new net::FtpNetworkLayer(host_resolver())); - - net::URLRequestJobFactoryImpl* job_factory = - new net::URLRequestJobFactoryImpl(); - job_factory_impl_ = job_factory; - - BrowserFileSystem* file_system = _Context->file_system(); - // Create the context if it doesn't already exist. - file_system->CreateContext(); - if (file_system->file_system_context()) { - job_factory->SetProtocolHandler( - "filesystem", - fileapi::CreateFileSystemProtocolHandler( - file_system->file_system_context())); - - blob_storage_controller_.reset(new webkit_blob::BlobStorageController()); - job_factory->SetProtocolHandler( - "blob", - new webkit_blob::BlobProtocolHandler( - blob_storage_controller_.get(), - file_system->file_system_context(), - CefThread::GetMessageLoopProxyForThread(CefThread::FILE))); - } - - storage_.set_job_factory(job_factory); - - url_request_interceptor_.reset( - BrowserResourceLoaderBridge::CreateRequestInterceptor()); -} - -BrowserRequestContext::~BrowserRequestContext() { -} - -void BrowserRequestContext::SetCookieStoragePath(const base::FilePath& path) { - REQUIRE_IOT(); - - if (cookie_store() && ((cookie_store_path_.empty() && path.empty()) || - cookie_store_path_ == path)) { - // The path has not changed so don't do anything. - return; - } - - base::FilePath new_path = path; - - scoped_refptr persistent_store; - if (!new_path.empty()) { - if (!file_util::PathExists(new_path) && - !file_util::CreateDirectory(new_path)) { - NOTREACHED() << "Failed to create cookie storage directory"; - new_path.clear(); - } else { - base::FilePath cookie_path = - new_path.Append(FILE_PATH_LITERAL("Cookies")); - persistent_store = - new content::SQLitePersistentCookieStore( - cookie_path, - CefThread::GetMessageLoopProxyForThread(CefThread::IO), - CefThread::GetMessageLoopProxyForThread(CefThread::FILE), - false, - NULL); - } - } - - // Set the new cookie store that will be used for all new requests. The old - // cookie store, if any, will be automatically flushed and closed when no - // longer referenced. - storage_.set_cookie_store( - new net::CookieMonster(persistent_store.get(), NULL)); - cookie_store_path_ = new_path; -} diff --git a/cef1/libcef/browser_request_context.h b/cef1/libcef/browser_request_context.h deleted file mode 100644 index 23aa6d4dc..000000000 --- a/cef1/libcef/browser_request_context.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2008 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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. - -#ifndef CEF_LIBCEF_BROWSER_REQUEST_CONTEXT_H_ -#define CEF_LIBCEF_BROWSER_REQUEST_CONTEXT_H_ -#pragma once - -#include - -#include "net/http/http_cache.h" -#include "net/http/url_security_manager.h" -#include "net/url_request/url_request.h" -#include "net/url_request/url_request_context.h" -#include "net/url_request/url_request_context_storage.h" - -namespace base { -class FilePath; -} - -namespace net { -class URLRequestJobFactoryImpl; -} - -namespace webkit_blob { -class BlobStorageController; -} - -// A basic URLRequestContext that only provides an in-memory cookie store. -class BrowserRequestContext : public net::URLRequestContext { - public: - // Use an in-memory cache - BrowserRequestContext(); - virtual ~BrowserRequestContext(); - - // Use an on-disk cache at the specified location. Optionally, use the cache - // in playback or record mode. - BrowserRequestContext(const base::FilePath& cache_path, - net::HttpCache::Mode cache_mode, - bool no_proxy); - - // Set the path used for cookie storage. If |path| is empty memory only - // storage will be used. If the old cookie data is being stored on disk it - // will be flushed and closed. - void SetCookieStoragePath(const base::FilePath& path); - - webkit_blob::BlobStorageController* blob_storage_controller() const { - return blob_storage_controller_.get(); - } - net::URLRequestJobFactoryImpl* job_factory_impl() const { - return job_factory_impl_; - }; - - private: - void Init(const base::FilePath& cache_path, net::HttpCache::Mode cache_mode, - bool no_proxy); - - net::URLRequestContextStorage storage_; - scoped_ptr blob_storage_controller_; - scoped_ptr url_security_manager_; - scoped_ptr url_request_interceptor_; - base::FilePath cookie_store_path_; - net::URLRequestJobFactoryImpl* job_factory_impl_; -}; - -#endif // CEF_LIBCEF_BROWSER_REQUEST_CONTEXT_H_ - diff --git a/cef1/libcef/browser_request_context_proxy.cc b/cef1/libcef/browser_request_context_proxy.cc deleted file mode 100644 index 36d509dbc..000000000 --- a/cef1/libcef/browser_request_context_proxy.cc +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 "libcef/browser_request_context_proxy.h" -#include "libcef/browser_impl.h" -#include "libcef/browser_request_context.h" -#include "libcef/cookie_store_proxy.h" - -BrowserRequestContextProxy::BrowserRequestContextProxy( - BrowserRequestContext* context, - CefBrowserImpl* browser) - : context_(context), - browser_(browser) { - DCHECK(context_); - DCHECK(browser_); - - // Cookie store that proxies to the browser implementation. - set_cookie_store(new CefCookieStoreProxy(browser_)); - - // All other values refer to the global request context. - set_net_log(context->net_log()); - set_host_resolver(context->host_resolver()); - set_cert_verifier(context->cert_verifier()); - set_server_bound_cert_service(context->server_bound_cert_service()); - set_fraudulent_certificate_reporter( - context->fraudulent_certificate_reporter()); - set_proxy_service(context->proxy_service()); - set_ssl_config_service(context->ssl_config_service()); - set_http_auth_handler_factory(context->http_auth_handler_factory()); - set_http_transaction_factory(context->http_transaction_factory()); - set_ftp_transaction_factory(context->ftp_transaction_factory()); - set_network_delegate(context->network_delegate()); - set_http_server_properties(context->http_server_properties()); - set_transport_security_state(context->transport_security_state()); - set_http_user_agent_settings(const_cast( - context->http_user_agent_settings())); - set_job_factory(context->job_factory()); -} diff --git a/cef1/libcef/browser_request_context_proxy.h b/cef1/libcef/browser_request_context_proxy.h deleted file mode 100644 index 81f4f8a68..000000000 --- a/cef1/libcef/browser_request_context_proxy.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that can -// be found in the LICENSE file. - -#ifndef CEF_LIBCEF_BROWSER_REQUEST_CONTEXT_PROXY_H_ -#define CEF_LIBCEF_BROWSER_REQUEST_CONTEXT_PROXY_H_ -#pragma once - -#include -#include "include/cef_base.h" -#include "net/url_request/url_request_context.h" - -class BrowserRequestContext; -class CefBrowserImpl; - -// A URLRequestContext implementation that proxies cookie requests to the -// client. -class BrowserRequestContextProxy : public net::URLRequestContext { - public: - BrowserRequestContextProxy(BrowserRequestContext* context, - CefBrowserImpl* browser); - - private: - BrowserRequestContext* context_; - CefRefPtr browser_; -}; - -#endif // CEF_LIBCEF_BROWSER_REQUEST_CONTEXT_PROXY_H_ diff --git a/cef1/libcef/browser_resource_loader_bridge.cc b/cef1/libcef/browser_resource_loader_bridge.cc deleted file mode 100644 index 1f5327cd5..000000000 --- a/cef1/libcef/browser_resource_loader_bridge.cc +++ /dev/null @@ -1,1176 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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. -// -// This file contains an implementation of the ResourceLoaderBridge class. -// The class is implemented using net::URLRequest, meaning it is a "simple" -// version that directly issues requests. The more complicated one used in the -// browser uses IPC. -// -// Because net::URLRequest only provides an asynchronous resource loading API, -// this file makes use of net::URLRequest from a background IO thread. Requests -// for cookies and synchronously loaded resources result in the main thread of -// the application blocking until the IO thread completes the operation. (See -// GetCookies and SyncLoad) -// -// Main thread IO thread -// ----------- --------- -// ResourceLoaderBridge <---o---------> RequestProxy (normal case) -// \ -> net::URLRequest -// o-------> SyncRequestProxy (synchronous case) -// -> net::URLRequest -// -// NOTE: The implementation in this file may be used to have WebKit fetch -// resources in-process. For example, it is handy for building a single- -// process WebKit embedding (e.g., test_shell) that can use net::URLRequest to -// perform URL loads. See renderer/resource_dispatcher.h for details on an -// alternate implementation that defers fetching to another process. - -#include "libcef/browser_resource_loader_bridge.h" -#include "libcef/browser_appcache_system.h" -#include "libcef/browser_request_context.h" -#include "libcef/browser_socket_stream_bridge.h" -#include "libcef/browser_webkit_glue.h" -#include "libcef/browser_impl.h" -#include "libcef/cef_context.h" -#include "libcef/cef_process.h" -#include "libcef/cef_process_io_thread.h" -#include "libcef/external_protocol_handler.h" -#include "libcef/request_impl.h" -#include "libcef/response_impl.h" -#include "libcef/http_header_utils.h" - -#include "base/bind.h" -#include "base/files/file_path.h" -#include "base/file_util.h" -#include "base/memory/ref_counted.h" -#include "base/message_loop.h" -#include "base/message_loop_proxy.h" -#include "base/time.h" -#include "base/timer.h" -#include "base/threading/thread.h" -#include "base/utf_string_conversions.h" -#include "net/base/auth.h" -#include "net/base/file_stream.h" -#include "net/base/io_buffer.h" -#include "net/base/load_flags.h" -#include "net/base/net_errors.h" -#include "net/base/net_util.h" -#include "net/base/static_cookie_policy.h" -#include "net/base/upload_data.h" -#include "net/http/http_cache.h" -#include "net/http/http_request_headers.h" -#include "net/http/http_response_headers.h" -#include "net/proxy/proxy_service.h" -#include "net/url_request/url_request.h" -#include "net/url_request/url_request_job_manager.h" -#include "net/url_request/url_request_redirect_job.h" -#include "webkit/appcache/appcache_interfaces.h" -#include "webkit/blob/blob_storage_controller.h" -#include "webkit/blob/shareable_file_reference.h" -#include "webkit/fileapi/file_system_context.h" -#include "webkit/fileapi/file_system_dir_url_request_job.h" -#include "webkit/fileapi/file_system_url_request_job.h" -#include "webkit/glue/resource_loader_bridge.h" -#include "webkit/glue/resource_request_body.h" -#include "webkit/glue/webkit_glue.h" - -#if defined(OS_MACOSX) || defined(OS_WIN) -#include "crypto/nss_util.h" -#endif - -using net::HttpResponseHeaders; -using net::StaticCookiePolicy; -using net::URLRequestStatus; -using webkit_blob::ShareableFileReference; -using webkit_glue::ResourceLoaderBridge; -using webkit_glue::ResourceRequestBody; -using webkit_glue::ResourceResponseInfo; - - -namespace { - -static const char kCefUserData[] = "cef_userdata"; - -struct RequestParams { - std::string method; - GURL url; - GURL first_party_for_cookies; - GURL referrer; - WebKit::WebReferrerPolicy referrer_policy; - std::string headers; - int load_flags; - ResourceType::Type request_type; - int appcache_host_id; - bool download_to_file; - scoped_refptr request_body; - net::RequestPriority priority; -}; - -// The interval for calls to RequestProxy::MaybeUpdateUploadProgress -static const int kUpdateUploadProgressIntervalMsec = 100; - -class ExtraRequestInfo : public net::URLRequest::Data { - public: - ExtraRequestInfo(CefBrowserImpl* browser, ResourceType::Type resource_type) - : browser_(browser), - resource_type_(resource_type), - allow_download_(resource_type == ResourceType::MAIN_FRAME || - resource_type == ResourceType::SUB_FRAME) { - } - - // The browser pointer is guaranteed to be valid for the lifespan of the - // request. The pointer will be NULL in cases where the request was - // initiated via the CefWebURLRequest API instead of by a browser window. - CefBrowserImpl* browser() const { return browser_; } - - // Identifies the type of resource, such as subframe, media, etc. - ResourceType::Type resource_type() const { return resource_type_; } - bool allow_download() const { return allow_download_; } - - private: - CefBrowserImpl* browser_; - ResourceType::Type resource_type_; - bool allow_download_; -}; - -// Used to intercept redirect requests. -class RequestInterceptor : public net::URLRequest::Interceptor { - public: - RequestInterceptor() { - REQUIRE_IOT(); - net::URLRequestJobManager::GetInstance()->RegisterRequestInterceptor(this); - } - ~RequestInterceptor() { - REQUIRE_IOT(); - net::URLRequestJobManager::GetInstance()-> - UnregisterRequestInterceptor(this); - } - - virtual net::URLRequestJob* MaybeIntercept( - net::URLRequest* request, - net::NetworkDelegate* network_delegate) - OVERRIDE { - return NULL; - } - - virtual net::URLRequestJob* MaybeInterceptRedirect( - net::URLRequest* request, - net::NetworkDelegate* network_delegate, - const GURL& location) OVERRIDE { - REQUIRE_IOT(); - - ExtraRequestInfo* info = - static_cast(request->GetUserData(kCefUserData)); - if (!info) - return NULL; - - CefRefPtr browser = info->browser(); - if (!browser.get()) - return NULL; - CefRefPtr client = browser->GetClient(); - CefRefPtr handler; - if (client.get()) - handler = client->GetRequestHandler(); - if (!handler.get()) - return NULL; - - CefString newUrlStr = location.spec(); - handler->OnResourceRedirect(browser, request->url().spec(), newUrlStr); - if (newUrlStr != location.spec()) { - GURL new_url = GURL(std::string(newUrlStr)); - if (!new_url.is_empty() && new_url.is_valid()) { - return new net::URLRequestRedirectJob( - request, - network_delegate, - new_url, - net::URLRequestRedirectJob::REDIRECT_302_FOUND); - } - } - - return NULL; - } - - DISALLOW_COPY_AND_ASSIGN(RequestInterceptor); -}; - -// The RequestProxy does most of its work on the IO thread. The Start and -// Cancel methods are proxied over to the IO thread, where an net::URLRequest -// object is instantiated. -class RequestProxy : public net::URLRequest::Delegate, - public base::RefCountedThreadSafe { - public: - // Takes ownership of the params. - explicit RequestProxy(CefRefPtr browser) - : download_to_file_(false), - buf_(new net::IOBuffer(kDataSize)), - browser_(browser), - owner_loop_(NULL), - peer_(NULL), - last_upload_position_(0), - defers_loading_(false), - defers_loading_want_read_(false) { - } - - void DropPeer() { - DCHECK(base::MessageLoop::current() == owner_loop_); - peer_ = NULL; - } - - void Start(ResourceLoaderBridge::Peer* peer, RequestParams* params) { - peer_ = peer; - owner_loop_ = base::MessageLoop::current(); - - InitializeParams(params); - - // proxy over to the io thread - CefThread::PostTask(CefThread::IO, FROM_HERE, base::Bind( - &RequestProxy::AsyncStart, this, params)); - } - - void Cancel() { - DCHECK(base::MessageLoop::current() == owner_loop_); - - if (download_handler_.get()) { - // WebKit will try to cancel the download but we won't allow it. - return; - } - - // proxy over to the io thread - CefThread::PostTask(CefThread::IO, FROM_HERE, base::Bind( - &RequestProxy::AsyncCancel, this)); - } - - void SetDefersLoading(bool defer) { - DCHECK(base::MessageLoop::current() == owner_loop_); - - CefThread::PostTask(CefThread::IO, FROM_HERE, base::Bind( - &RequestProxy::AsyncSetDefersLoading, this, defer)); - } - - protected: - friend class base::RefCountedThreadSafe; - - virtual ~RequestProxy() { - // If we have a request, then we'd better be on the io thread! - DCHECK(!request_.get() || CefThread::CurrentlyOn(CefThread::IO)); - } - - virtual void InitializeParams(RequestParams* params) { - params->priority = net::MEDIUM; - } - - // -------------------------------------------------------------------------- - // The following methods are called on the owner's thread in response to - // various net::URLRequest callbacks. The event hooks, defined below, trigger - // these methods asynchronously. - - void NotifyReceivedRedirect(const GURL& new_url, - const ResourceResponseInfo& info) { - DCHECK(base::MessageLoop::current() == owner_loop_); - - bool has_new_first_party_for_cookies = false; - GURL new_first_party_for_cookies; - if (peer_ && peer_->OnReceivedRedirect(new_url, info, - &has_new_first_party_for_cookies, - &new_first_party_for_cookies)) { - CefThread::PostTask(CefThread::IO, FROM_HERE, base::Bind( - &RequestProxy::AsyncFollowDeferredRedirect, this, - has_new_first_party_for_cookies, new_first_party_for_cookies)); - } else { - Cancel(); - } - } - - void NotifyReceivedResponse(const ResourceResponseInfo& info, - const GURL& url, bool allow_download) { - DCHECK(base::MessageLoop::current() == owner_loop_); - - if (browser_.get() && info.headers.get()) { - CefRefPtr client = browser_->GetClient(); - CefRefPtr handler; - if (client.get()) - handler = client->GetRequestHandler(); - - if (handler.get()) { - CefRefPtr response = new CefResponseImpl(); - // Transfer response headers - if (info.headers) { - CefResponse::HeaderMap headerMap; - void* header_index = NULL; - std::string name, value; - while (info.headers->EnumerateHeaderLines(&header_index, &name, - &value)) { - if (!name.empty() && !value.empty()) - headerMap.insert(std::make_pair(name, value)); - } - response->SetHeaderMap(headerMap); - response->SetStatusText(info.headers->GetStatusText()); - response->SetStatus(info.headers->response_code()); - } - response->SetMimeType(info.mime_type); - handler->OnResourceResponse(browser_.get(), url.spec(), response, - content_filter_); - - std::string content_disposition; - info.headers->GetNormalizedHeader("Content-Disposition", - &content_disposition); - - if (allow_download && - webkit_glue::ShouldDownload(content_disposition, info.mime_type)) { - string16 filename = net::GetSuggestedFilename(url, - content_disposition, info.charset, "", info.mime_type, - "download"); - CefRefPtr dl_handler; - if (handler->GetDownloadHandler(browser_.get(), info.mime_type, - filename, info.content_length, - dl_handler)) { - download_handler_ = dl_handler; - } - } - } - } - - if (peer_) - peer_->OnReceivedResponse(info); - } - - void NotifyReceivedData(int bytes_read) { - DCHECK(base::MessageLoop::current() == owner_loop_); - - if (!peer_) - return; - - // Make a local copy of buf_, since AsyncReadData reuses it. - scoped_array buf_copy(new char[bytes_read]); - memcpy(buf_copy.get(), buf_->data(), bytes_read); - - // Continue reading more data into buf_ - // Note: Doing this before notifying our peer ensures our load events get - // dispatched in a manner consistent with DumpRenderTree (and also avoids a - // race condition). If the order of the next 2 functions were reversed, the - // peer could generate new requests in response to the received data, which - // when run on the io thread, could race against this function in doing - // another InvokeLater. See bug 769249. - CefThread::PostTask(CefThread::IO, FROM_HERE, base::Bind( - &RequestProxy::AsyncReadData, this)); - - CefRefPtr resourceStream; - - if (content_filter_.get()) - content_filter_->ProcessData(buf_copy.get(), bytes_read, resourceStream); - - if (resourceStream.get()) { - // The filter made some changes to the data in the buffer. - resourceStream->Seek(0, SEEK_END); - bytes_read = resourceStream->Tell(); - resourceStream->Seek(0, SEEK_SET); - - buf_copy.reset(new char[bytes_read]); - resourceStream->Read(buf_copy.get(), 1, bytes_read); - } - - if (download_handler_.get() && - !download_handler_->ReceivedData(buf_copy.get(), bytes_read)) { - // Cancel loading by proxying over to the io thread. - CefThread::PostTask(CefThread::IO, FROM_HERE, base::Bind( - &RequestProxy::AsyncCancel, this)); - } - - peer_->OnReceivedData(buf_copy.get(), bytes_read, -1); - } - - void NotifyDownloadedData(int bytes_read) { - DCHECK(base::MessageLoop::current() == owner_loop_); - - if (!peer_) - return; - - // Continue reading more data, see the comment in NotifyReceivedData. - CefThread::PostTask(CefThread::IO, FROM_HERE, base::Bind( - &RequestProxy::AsyncReadData, this)); - - peer_->OnDownloadedData(bytes_read); - } - - void NotifyCompletedRequest(int error_code, - const std::string& security_info, - const base::TimeTicks& complete_time) { - DCHECK(base::MessageLoop::current() == owner_loop_); - - // Drain the content filter of all remaining data - if (content_filter_.get()) { - CefRefPtr remainder; - content_filter_->Drain(remainder); - - if (remainder.get()) { - remainder->Seek(0, SEEK_END); - int size = static_cast(remainder->Tell()); - if (size > 0) { - remainder->Seek(0, SEEK_SET); - scoped_array buf(new char[size]); - remainder->Read(buf.get(), 1, size); - - if (download_handler_.get() && - !download_handler_->ReceivedData(buf.get(), size)) { - // Cancel loading by proxying over to the io thread. - CefThread::PostTask(CefThread::IO, FROM_HERE, base::Bind( - &RequestProxy::AsyncCancel, this)); - } - - if (peer_) - peer_->OnReceivedData(buf.get(), size, -1); - } - } - content_filter_ = NULL; - } - - if (download_handler_.get()) { - download_handler_->Complete(); - download_handler_ = NULL; - } - - if (peer_) { - peer_->OnCompletedRequest(error_code, false, security_info, complete_time); - DropPeer(); // ensure no further notifications - } - } - - void NotifyUploadProgress(uint64 position, uint64 size) { - DCHECK(base::MessageLoop::current() == owner_loop_); - - if (peer_) - peer_->OnUploadProgress(position, size); - } - - // -------------------------------------------------------------------------- - // The following methods are called on the io thread. They correspond to - // actions performed on the owner's thread. - - void AsyncStart(RequestParams* params) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - bool handled = false; - - scoped_ptr upload_data_stream; - if (params->request_body) { - upload_data_stream.reset( - params->request_body->ResolveElementsAndCreateUploadDataStream( - _Context->request_context()->blob_storage_controller(), - _Context->file_system()->file_system_context(), - base::MessageLoopProxy::current())); - } - - if (browser_.get()) { - CefRefPtr client = browser_->GetClient(); - CefRefPtr handler; - if (client.get()) - handler = client->GetRequestHandler(); - - if (handler.get()) { - // Build the request object for passing to the handler - CefRefPtr request(new CefRequestImpl()); - CefRequestImpl* requestimpl = - static_cast(request.get()); - - std::string originalUrl(params->url.spec()); - requestimpl->SetURL(originalUrl); - requestimpl->SetMethod(params->method); - - // Transfer request headers - CefRequest::HeaderMap headerMap; - HttpHeaderUtils::ParseHeaders(params->headers, headerMap); - headerMap.insert(std::make_pair("Referer", params->referrer.spec())); - requestimpl->SetHeaderMap(headerMap); - - // Transfer post data, if any - if (upload_data_stream) { - CefRefPtr postdata(new CefPostDataImpl()); - static_cast(postdata.get())->Set( - *upload_data_stream.get()); - requestimpl->SetPostData(postdata); - } - - int loadFlags = params->load_flags; - - // Handler output will be returned in these variables - CefString redirectUrl; - CefRefPtr resourceStream; - CefRefPtr response(new CefResponseImpl()); - - handled = handler->OnBeforeResourceLoad(browser_.get(), request, - redirectUrl, resourceStream, response, loadFlags); - if (!handled) { - // Observe URL from request. - const std::string requestUrl(request->GetURL()); - if (requestUrl != originalUrl) - params->url = GURL(requestUrl); - else if (!redirectUrl.empty()) - params->url = GURL(std::string(redirectUrl)); - - // Observe method from request. - params->method = request->GetMethod(); - - // Observe headers from request. - request->GetHeaderMap(headerMap); - CefString referrerStr; - referrerStr.FromASCII("Referer"); - CefRequest::HeaderMap::iterator referrer = - headerMap.find(referrerStr); - if (referrer == headerMap.end()) { - params->referrer = GURL(); - } else { - params->referrer = GURL(std::string(referrer->second)); - headerMap.erase(referrer); - } - params->headers = HttpHeaderUtils::GenerateHeaders(headerMap); - - // Observe post data from request. - CefRefPtr postData = request->GetPostData(); - if (postData.get()) { - upload_data_stream.reset( - static_cast(postData.get())->Get()); - } else { - upload_data_stream.reset(NULL); - } - } - - if (handled) { - // cancel the resource load - OnCompletedRequest(net::ERR_ABORTED, std::string(), - base::TimeTicks()); - } else if (resourceStream.get()) { - // load from the provided resource stream - handled = true; - - resourceStream->Seek(0, SEEK_END); - int64 offset = resourceStream->Tell(); - resourceStream->Seek(0, SEEK_SET); - - resource_stream_ = resourceStream; - - CefResponseImpl* responseImpl = - static_cast(response.get()); - - ResourceResponseInfo info; - info.content_length = offset; - info.mime_type = response->GetMimeType(); - info.headers = responseImpl->GetResponseHeaders(); - OnReceivedResponse(info, params->url); - AsyncReadData(); - } else if (response->GetStatus() != 0) { - // status set, but no resource stream - handled = true; - - CefResponseImpl* responseImpl = - static_cast(response.get()); - - ResourceResponseInfo info; - info.content_length = 0; - info.mime_type = response->GetMimeType(); - info.headers = responseImpl->GetResponseHeaders(); - OnReceivedResponse(info, params->url); - AsyncReadData(); - } - - if (!handled && ResourceType::IsFrame(params->request_type) && - !net::URLRequest::IsHandledProtocol(params->url.scheme())) { - bool allow_os_execution = false; - handled = handler->OnProtocolExecution(browser_.get(), - params->url.spec(), allow_os_execution); - if (!handled && allow_os_execution && - ExternalProtocolHandler::HandleExternalProtocol(params->url)) { - handled = true; - } - - if (handled) - OnCompletedRequest(net::OK, std::string(), base::TimeTicks()); - } - } - } - - if (!handled) { - net::URLRequestContext* context = browser_.get() ? - browser_->request_context_proxy() : _Context->request_context(); - - request_.reset(new net::URLRequest(params->url, this, context)); - request_->SetPriority(params->priority); - request_->set_method(params->method); - request_->set_first_party_for_cookies(params->first_party_for_cookies); - request_->SetReferrer(params->referrer.spec()); - webkit_glue::ConfigureURLRequestForReferrerPolicy( - request_.get(), params->referrer_policy); - net::HttpRequestHeaders headers; - headers.AddHeadersFromString(params->headers); - request_->SetExtraRequestHeaders(headers); - request_->set_load_flags(params->load_flags); - if (upload_data_stream) - request_->set_upload(upload_data_stream.Pass()); - request_->SetUserData(kCefUserData, - new ExtraRequestInfo(browser_.get(), params->request_type)); - BrowserAppCacheSystem::SetExtraRequestInfo( - request_.get(), params->appcache_host_id, params->request_type); - - download_to_file_ = params->download_to_file; - if (download_to_file_) { - base::FilePath path; - if (file_util::CreateTemporaryFile(&path)) { - downloaded_file_ = ShareableFileReference::GetOrCreate( - path, ShareableFileReference::DELETE_ON_FINAL_RELEASE, - base::MessageLoopProxy::current()); - file_stream_.reset(new net::FileStream(NULL)); - file_stream_->OpenSync( - path, base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE); - } - } - - request_->Start(); - - if (request_.get() && request_->has_upload() && - params->load_flags & net::LOAD_ENABLE_UPLOAD_PROGRESS) { - upload_progress_timer_.Start(FROM_HERE, - base::TimeDelta::FromMilliseconds( - kUpdateUploadProgressIntervalMsec), - this, &RequestProxy::MaybeUpdateUploadProgress); - } - } - - delete params; - } - - void AsyncCancel() { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - // This can be null in cases where the request is already done. - if (!resource_stream_.get() && !request_.get()) - return; - - if (request_.get()) - request_->Cancel(); - Done(); - } - - void AsyncFollowDeferredRedirect(bool has_new_first_party_for_cookies, - const GURL& new_first_party_for_cookies) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - // This can be null in cases where the request is already done. - if (!request_.get()) - return; - - if (has_new_first_party_for_cookies) - request_->set_first_party_for_cookies(new_first_party_for_cookies); - request_->FollowDeferredRedirect(); - } - - void AsyncSetDefersLoading(bool defer) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - if (defers_loading_ != defer) { - defers_loading_ = defer; - if (!defers_loading_ && defers_loading_want_read_) { - // Perform the pending AsyncReadData now. - defers_loading_want_read_ = false; - AsyncReadData(); - } - } - } - - void AsyncReadData() { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - // Pause downloading if we're in deferred mode. - if (defers_loading_) { - defers_loading_want_read_ = true; - return; - } - - if (resource_stream_.get()) { - // Read from the handler-provided resource stream - int bytes_read = resource_stream_->Read(buf_->data(), 1, kDataSize); - if (bytes_read > 0) { - OnReceivedData(bytes_read); - } else { - Done(); - } - return; - } - - // This can be null in cases where the request is already done. - if (!request_.get()) - return; - - if (request_->status().is_success()) { - int bytes_read; - if (request_->Read(buf_, kDataSize, &bytes_read) && bytes_read) { - OnReceivedData(bytes_read); - } else if (!request_->status().is_io_pending()) { - Done(); - } // else wait for OnReadCompleted - } else { - Done(); - } - } - - // -------------------------------------------------------------------------- - // The following methods are event hooks (corresponding to net::URLRequest - // callbacks) that run on the IO thread. They are designed to be overridden - // by the SyncRequestProxy subclass. - - virtual void OnReceivedRedirect( - const GURL& new_url, - const ResourceResponseInfo& info, - bool* defer_redirect) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - *defer_redirect = true; // See AsyncFollowDeferredRedirect - owner_loop_->PostTask(FROM_HERE, base::Bind( - &RequestProxy::NotifyReceivedRedirect, this, new_url, info)); - } - - virtual void OnReceivedResponse( - const ResourceResponseInfo& info, - // only used when loading from a resource stream - const GURL& simulated_url) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - GURL url; - bool allow_download(false); - if (request_.get()) { - url = request_->url(); - ExtraRequestInfo* info = - static_cast(request_->GetUserData(kCefUserData)); - if (info) - allow_download = info->allow_download(); - } else if (!simulated_url.is_empty() && simulated_url.is_valid()) { - url = simulated_url; - } - - owner_loop_->PostTask(FROM_HERE, base::Bind( - &RequestProxy::NotifyReceivedResponse, this, info, url, - allow_download)); - } - - virtual void OnReceivedData(int bytes_read) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - if (download_to_file_) { - file_stream_->WriteSync(buf_->data(), bytes_read); - owner_loop_->PostTask(FROM_HERE, base::Bind( - &RequestProxy::NotifyDownloadedData, this, bytes_read)); - return; - } - - owner_loop_->PostTask(FROM_HERE, base::Bind( - &RequestProxy::NotifyReceivedData, this, bytes_read)); - } - - virtual void OnCompletedRequest(int error_code, - const std::string& security_info, - const base::TimeTicks& complete_time) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - if (download_to_file_) - file_stream_.reset(); - - owner_loop_->PostTask(FROM_HERE, base::Bind( - &RequestProxy::NotifyCompletedRequest, this, error_code, security_info, - complete_time)); - } - - // -------------------------------------------------------------------------- - // net::URLRequest::Delegate implementation: - - virtual void OnReceivedRedirect(net::URLRequest* request, - const GURL& new_url, - bool* defer_redirect) OVERRIDE { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - DCHECK(request->status().is_success()); - ResourceResponseInfo info; - PopulateResponseInfo(request, &info); - OnReceivedRedirect(new_url, info, defer_redirect); - } - - virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - if (request->status().is_success()) { - ResourceResponseInfo info; - PopulateResponseInfo(request, &info); - OnReceivedResponse(info, GURL::EmptyGURL()); - AsyncReadData(); // start reading - } else { - Done(); - } - } - - virtual void OnAuthRequired(net::URLRequest* request, - net::AuthChallengeInfo* auth_info) OVERRIDE { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - if (browser_.get()) { - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetRequestHandler(); - if (handler.get()) { - CefString username, password; - if (handler->GetAuthCredentials(browser_.get(), - auth_info->is_proxy, - auth_info->challenger.host(), - auth_info->challenger.port(), - auth_info->realm, - auth_info->scheme, - username, password)) { - request->SetAuth(net::AuthCredentials(username, password)); - return; - } - } - } - } - - request->CancelAuth(); - } - - virtual void OnSSLCertificateError(net::URLRequest* request, - const net::SSLInfo& ssl_info, - bool fatal) OVERRIDE { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - // Allow all certificate errors. - request->ContinueDespiteLastError(); - } - - virtual void OnReadCompleted(net::URLRequest* request, - int bytes_read) OVERRIDE { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - if (request->status().is_success() && bytes_read > 0) { - OnReceivedData(bytes_read); - } else { - Done(); - } - } - - // -------------------------------------------------------------------------- - // Helpers and data: - - void Done() { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - if (resource_stream_.get()) { - // Resource stream reads always complete successfully - OnCompletedRequest(0, std::string(), base::TimeTicks()); - resource_stream_ = NULL; - } else if (request_.get()) { - if (upload_progress_timer_.IsRunning()) { - MaybeUpdateUploadProgress(); - upload_progress_timer_.Stop(); - } - DCHECK(request_.get()); - OnCompletedRequest(request_->status().error(), std::string(), - base::TimeTicks()); - request_.reset(); // destroy on the io thread - } - } - - void MaybeUpdateUploadProgress() { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - // If a redirect is received upload is cancelled in net::URLRequest, we - // should try to stop the |upload_progress_timer_| timer and return. - if (!request_->has_upload()) { - if (upload_progress_timer_.IsRunning()) - upload_progress_timer_.Stop(); - return; - } - - net::UploadProgress progress = request_->GetUploadProgress(); - if (progress.position() == last_upload_position_) - return; // no progress made since last time - - const uint64 kHalfPercentIncrements = 200; - const base::TimeDelta kOneSecond = base::TimeDelta::FromMilliseconds(1000); - - uint64 amt_since_last = progress.position() - last_upload_position_; - base::TimeDelta time_since_last = base::TimeTicks::Now() - - last_upload_ticks_; - - bool is_finished = (progress.size() == progress.position()); - bool enough_new_progress = (amt_since_last > (progress.size() / - kHalfPercentIncrements)); - bool too_much_time_passed = time_since_last > kOneSecond; - - if (is_finished || enough_new_progress || too_much_time_passed) { - owner_loop_->PostTask( - FROM_HERE, - base::Bind(&RequestProxy::NotifyUploadProgress, this, - progress.position(), progress.size())); - last_upload_ticks_ = base::TimeTicks::Now(); - last_upload_position_ = progress.position(); - } - } - - void PopulateResponseInfo(net::URLRequest* request, - ResourceResponseInfo* info) const { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - info->request_time = request->request_time(); - info->response_time = request->response_time(); - info->headers = request->response_headers(); - request->GetMimeType(&info->mime_type); - request->GetCharset(&info->charset); - info->content_length = request->GetExpectedContentSize(); - if (downloaded_file_) - info->download_file_path = downloaded_file_->path(); - BrowserAppCacheSystem::GetExtraResponseInfo( - request, - &info->appcache_id, - &info->appcache_manifest_url); - } - - scoped_ptr request_; - CefRefPtr resource_stream_; - - // Support for request.download_to_file behavior. - bool download_to_file_; - scoped_ptr file_stream_; - scoped_refptr downloaded_file_; - - // Size of our async IO data buffers. Limited by the sanity check in - // URLRequestJob::Read(). - static const int kDataSize = 1000000-1; - - // read buffer for async IO - scoped_refptr buf_; - - CefRefPtr browser_; - - base::MessageLoop* owner_loop_; - - // This is our peer in WebKit (implemented as ResourceHandleInternal). We do - // not manage its lifetime, and we may only access it from the owner's - // message loop (owner_loop_). - ResourceLoaderBridge::Peer* peer_; - - // Timer used to pull upload progress info. - base::RepeatingTimer upload_progress_timer_; - - // Info used to determine whether or not to send an upload progress update. - uint64 last_upload_position_; - base::TimeTicks last_upload_ticks_; - - CefRefPtr download_handler_; - CefRefPtr content_filter_; - - // True if loading of data is currently deferred. - bool defers_loading_; - - // True if an AsyncReadData was scheduled while we were deferred. - bool defers_loading_want_read_; -}; - -//----------------------------------------------------------------------------- - -class SyncRequestProxy : public RequestProxy { - public: - explicit SyncRequestProxy(CefRefPtr browser, - ResourceLoaderBridge::SyncLoadResponse* result) - : RequestProxy(browser), result_(result), event_(true, false) { - } - - void WaitForCompletion() { - event_.Wait(); - } - - // -------------------------------------------------------------------------- - // Event hooks that run on the IO thread: - - virtual void OnReceivedRedirect( - const GURL& new_url, - const ResourceResponseInfo& info, - bool* defer_redirect) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - // TODO(darin): It would be much better if this could live in WebCore, but - // doing so requires API changes at all levels. Similar code exists in - // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-( - if (new_url.GetOrigin() != result_->url.GetOrigin()) { - DLOG(WARNING) << "Cross origin redirect denied"; - Cancel(); - return; - } - result_->url = new_url; - } - - virtual void OnReceivedResponse(const ResourceResponseInfo& info, - const GURL&) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - *static_cast(result_) = info; - } - - virtual void OnReceivedData(int bytes_read) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - if (download_to_file_) - file_stream_->WriteSync(buf_->data(), bytes_read); - else - result_->data.append(buf_->data(), bytes_read); - AsyncReadData(); // read more (may recurse) - } - - virtual void OnCompletedRequest(int error_code, - const std::string& security_info, - const base::TimeTicks& complete_time) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - if (download_to_file_) - file_stream_.reset(); - - result_->error_code = error_code; - event_.Signal(); - } - - protected: - virtual void InitializeParams(RequestParams* params) { - // For synchronous requests ignore load limits to avoid a deadlock problem - // in SyncRequestProxy (issue #192). - params->load_flags |= net::LOAD_IGNORE_LIMITS; - params->priority = net::HIGHEST; - } - - private: - ResourceLoaderBridge::SyncLoadResponse* result_; - base::WaitableEvent event_; -}; - -//----------------------------------------------------------------------------- - -class ResourceLoaderBridgeImpl : public ResourceLoaderBridge, - public base::NonThreadSafe { - public: - ResourceLoaderBridgeImpl(CefRefPtr browser, - const webkit_glue::ResourceLoaderBridge::RequestInfo& request_info) - : browser_(browser), - params_(new RequestParams), - proxy_(NULL) { - params_->method = request_info.method; - params_->url = request_info.url; - params_->first_party_for_cookies = request_info.first_party_for_cookies; - params_->referrer = request_info.referrer; - params_->referrer_policy = request_info.referrer_policy; - params_->headers = request_info.headers; - params_->load_flags = request_info.load_flags; - params_->request_type = request_info.request_type; - params_->appcache_host_id = request_info.appcache_host_id; - params_->download_to_file = request_info.download_to_file; - } - - virtual ~ResourceLoaderBridgeImpl() { - if (proxy_) { - proxy_->DropPeer(); - // Let the proxy die on the IO thread - proxy_->AddRef(); - CefThread::ReleaseSoon(CefThread::IO, FROM_HERE, proxy_.get()); - } - } - - // -------------------------------------------------------------------------- - // ResourceLoaderBridge implementation: - - virtual void SetRequestBody(ResourceRequestBody* request_body) OVERRIDE { - DCHECK(CalledOnValidThread()); - DCHECK(params_.get()); - DCHECK(!params_->request_body); - params_->request_body = request_body; - } - - virtual bool Start(Peer* peer) OVERRIDE { - DCHECK(CalledOnValidThread()); - DCHECK(!proxy_); - - proxy_ = new RequestProxy(browser_); - proxy_->Start(peer, params_.release()); - - return true; // Any errors will be reported asynchronously. - } - - virtual void Cancel() OVERRIDE { - DCHECK(CalledOnValidThread()); - DCHECK(proxy_); - proxy_->Cancel(); - } - - virtual void SetDefersLoading(bool value) OVERRIDE { - DCHECK(CalledOnValidThread()); - DCHECK(proxy_); - proxy_->SetDefersLoading(value); - } - - virtual void DidChangePriority(net::RequestPriority new_priority) OVERRIDE { - } - - virtual void SyncLoad(SyncLoadResponse* response) OVERRIDE { - DCHECK(CalledOnValidThread()); - DCHECK(!proxy_); - - // this may change as the result of a redirect - response->url = params_->url; - - proxy_ = new SyncRequestProxy(browser_, response); - proxy_->Start(NULL, params_.release()); - - static_cast(proxy_.get())->WaitForCompletion(); - } - - private: - CefRefPtr browser_; - - // Ownership of params_ is transfered to the proxy when the proxy is created. - scoped_ptr params_; - - // The request proxy is allocated when we start the request, and then it - // sticks around until this ResourceLoaderBridge is destroyed. - scoped_refptr proxy_; -}; - -} // anonymous namespace - -//----------------------------------------------------------------------------- - -// static -webkit_glue::ResourceLoaderBridge* BrowserResourceLoaderBridge::Create( - const webkit_glue::ResourceLoaderBridge::RequestInfo& request_info) { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - CefRefPtr browser = - _Context->GetBrowserByID(request_info.routing_id); - return new ResourceLoaderBridgeImpl(browser.get(), request_info); -} - -//----------------------------------------------------------------------------- - -// static -CefRefPtr BrowserResourceLoaderBridge::GetBrowserForRequest( - net::URLRequest* request) { - REQUIRE_IOT(); - ExtraRequestInfo* extra_info = - static_cast(request->GetUserData(kCefUserData)); - if (extra_info) - return extra_info->browser(); - return NULL; -} - -// static -scoped_refptr -BrowserResourceLoaderBridge::GetCacheThread() { - return CefThread::GetMessageLoopProxyForThread(CefThread::FILE); -} - -// static -net::URLRequest::Interceptor* -BrowserResourceLoaderBridge::CreateRequestInterceptor() { - return new RequestInterceptor(); -} diff --git a/cef1/libcef/browser_resource_loader_bridge.h b/cef1/libcef/browser_resource_loader_bridge.h deleted file mode 100644 index d8ac3acb2..000000000 --- a/cef1/libcef/browser_resource_loader_bridge.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2008 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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. - -#ifndef CEF_LIBCEF_BROWSER_RESOURCE_LOADER_BRIDGE_H_ -#define CEF_LIBCEF_BROWSER_RESOURCE_LOADER_BRIDGE_H_ -#pragma once - -#include - -#include "include/cef_base.h" -#include "base/message_loop_proxy.h" -#include "net/url_request/url_request.h" -#include "webkit/glue/resource_loader_bridge.h" - -class CefBrowserImpl; -class GURL; - -class BrowserResourceLoaderBridge { - public: - // Return the CefBrowser associated with the specified request. The browser - // will be NULL in cases where the request was initiated using the - // CefWebURLRequest API. - static CefRefPtr GetBrowserForRequest( - net::URLRequest* request); - - // Creates a ResourceLoaderBridge instance. - static webkit_glue::ResourceLoaderBridge* Create( - const webkit_glue::ResourceLoaderBridge::RequestInfo& request_info); - - static scoped_refptr GetCacheThread(); - - // Used for intercepting URL redirects. Only one interceptor will be created - // and its lifespan is controlled by the BrowserRequestContext. - static net::URLRequest::Interceptor* CreateRequestInterceptor(); -}; - -#endif // CEF_LIBCEF_BROWSER_RESOURCE_LOADER_BRIDGE_H_ - diff --git a/cef1/libcef/browser_settings.cc b/cef1/libcef/browser_settings.cc deleted file mode 100644 index 35bd43c5e..000000000 --- a/cef1/libcef/browser_settings.cc +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework 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 "libcef/browser_settings.h" -#include "include/internal/cef_types_wrappers.h" -#include "base/utf_string_conversions.h" -#include "webkit/glue/webpreferences.h" - -using webkit_glue::WebPreferences; - -void BrowserToWebSettings(const CefBrowserSettings& cef, WebPreferences& web) { - if (cef.standard_font_family.length > 0) { - web.standard_font_family_map[WebPreferences::kCommonScript] = - CefString(&cef.standard_font_family); - } else { - web.standard_font_family_map[WebPreferences::kCommonScript] = - ASCIIToUTF16("Times"); - } - - if (cef.fixed_font_family.length > 0) { - web.fixed_font_family_map[WebPreferences::kCommonScript] = - CefString(&cef.fixed_font_family); - } else { - web.fixed_font_family_map[WebPreferences::kCommonScript] = - ASCIIToUTF16("Courier"); - } - - if (cef.serif_font_family.length > 0) { - web.serif_font_family_map[WebPreferences::kCommonScript] = - CefString(&cef.serif_font_family); - } else { - web.serif_font_family_map[WebPreferences::kCommonScript] = - ASCIIToUTF16("Times"); - } - - if (cef.sans_serif_font_family.length > 0) { - web.sans_serif_font_family_map[WebPreferences::kCommonScript] = - CefString(&cef.sans_serif_font_family); - } else { - web.sans_serif_font_family_map[WebPreferences::kCommonScript] = - ASCIIToUTF16("Helvetica"); - } - - // These two fonts below are picked from the intersection of - // Win XP font list and Vista font list : - // http://www.microsoft.com/typography/fonts/winxp.htm - // http://blogs.msdn.com/michkap/archive/2006/04/04/567881.aspx - // Some of them are installed only with CJK and complex script - // support enabled on Windows XP and are out of consideration here. - // (although we enabled both on our buildbots.) - // They (especially Impact for fantasy) are not typical cursive - // and fantasy fonts, but it should not matter for layout tests - // as long as they're available. - - if (cef.cursive_font_family.length > 0) { - web.cursive_font_family_map[WebPreferences::kCommonScript] = - CefString(&cef.cursive_font_family); - } else { - web.cursive_font_family_map[WebPreferences::kCommonScript] = -#if defined(OS_MACOSX) - ASCIIToUTF16("Apple Chancery"); -#else - ASCIIToUTF16("Comic Sans MS"); -#endif - } - - if (cef.fantasy_font_family.length > 0) { - web.fantasy_font_family_map[WebPreferences::kCommonScript] = - CefString(&cef.fantasy_font_family); - } else { - web.fantasy_font_family_map[WebPreferences::kCommonScript] = -#if defined(OS_MACOSX) - ASCIIToUTF16("Papyrus"); -#else - ASCIIToUTF16("Impact"); -#endif - } - - if (cef.default_font_size > 0) - web.default_font_size = cef.default_font_size; - else - web.default_font_size = 16; - - if (cef.default_fixed_font_size > 0) - web.default_fixed_font_size = cef.default_fixed_font_size; - else - web.default_fixed_font_size = 13; - - if (cef.minimum_font_size > 0) - web.minimum_font_size = cef.minimum_font_size; - else - web.minimum_font_size = 1; - - if (cef.minimum_logical_font_size > 0) - web.minimum_logical_font_size = cef.minimum_logical_font_size; - else - web.minimum_logical_font_size = 9; - - if (cef.default_encoding.length > 0) - web.default_encoding = CefString(&cef.default_encoding); - else - web.default_encoding = "ISO-8859-1"; - - web.javascript_enabled = !cef.javascript_disabled; - web.web_security_enabled = !cef.web_security_disabled; - web.javascript_can_open_windows_automatically = - !cef.javascript_open_windows_disallowed; - web.loads_images_automatically = !cef.image_load_disabled; - web.plugins_enabled = !cef.plugins_disabled; - web.dom_paste_enabled = !cef.dom_paste_disabled; - web.inspector_settings.clear(); - web.site_specific_quirks_enabled = !cef.site_specific_quirks_disabled; - web.shrinks_standalone_images_to_fit = cef.shrink_standalone_images_to_fit; - web.uses_universal_detector = cef.encoding_detector_enabled; - web.text_areas_are_resizable = !cef.text_area_resize_disabled; - web.java_enabled = !cef.java_disabled; - web.allow_scripts_to_close_windows = !cef.javascript_close_windows_disallowed; - web.uses_page_cache = !cef.page_cache_disabled; - web.remote_fonts_enabled = !cef.remote_fonts_disabled; - web.javascript_can_access_clipboard = - !cef.javascript_access_clipboard_disallowed; - web.xss_auditor_enabled = cef.xss_auditor_enabled; - web.local_storage_enabled = !cef.local_storage_disabled; - web.databases_enabled = !cef.databases_disabled; - web.application_cache_enabled = !cef.application_cache_disabled; - web.tabs_to_links = !cef.tab_to_links_disabled; - web.caret_browsing_enabled = cef.caret_browsing_enabled; - web.hyperlink_auditing_enabled = !cef.hyperlink_auditing_disabled; - - web.user_style_sheet_enabled = cef.user_style_sheet_enabled; - - if (cef.user_style_sheet_location.length > 0) { - web.user_style_sheet_location = - GURL(std::string(CefString(&cef.user_style_sheet_location))); - } - - web.author_and_user_styles_enabled = !cef.author_and_user_styles_disabled; - web.allow_universal_access_from_file_urls = - cef.universal_access_from_file_urls_allowed; - web.allow_file_access_from_file_urls = cef.file_access_from_file_urls_allowed; - web.experimental_webgl_enabled = !cef.webgl_disabled; - web.accelerated_compositing_enabled = cef.accelerated_compositing_enabled; - web.accelerated_compositing_for_3d_transforms_enabled = - !cef.accelerated_layers_disabled; - web.accelerated_compositing_for_animation_enabled = - !cef.accelerated_layers_disabled; - web.accelerated_compositing_for_video_enabled = - !cef.accelerated_video_disabled; - web.accelerated_2d_canvas_enabled = !cef.accelerated_2d_canvas_disabled; - web.accelerated_filters_enabled = !cef.accelerated_filters_disabled; - web.accelerated_compositing_for_plugins_enabled = - !cef.accelerated_plugins_disabled; - web.memory_info_enabled = false; - web.fullscreen_enabled = cef.fullscreen_enabled; -} diff --git a/cef1/libcef/browser_settings.h b/cef1/libcef/browser_settings.h deleted file mode 100644 index 7a04da48f..000000000 --- a/cef1/libcef/browser_settings.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that can -// be found in the LICENSE file. - -#ifndef CEF_LIBCEF_BROWSER_SETTINGS_H_ -#define CEF_LIBCEF_BROWSER_SETTINGS_H_ -#pragma once - -#include "include/internal/cef_types_wrappers.h" - -namespace webkit_glue { -struct WebPreferences; -} - -void BrowserToWebSettings(const CefBrowserSettings& cef, - webkit_glue::WebPreferences& web); - -#endif // CEF_LIBCEF_BROWSER_SETTINGS_H_ diff --git a/cef1/libcef/browser_socket_stream_bridge.cc b/cef1/libcef/browser_socket_stream_bridge.cc deleted file mode 100644 index 77e1716a0..000000000 --- a/cef1/libcef/browser_socket_stream_bridge.cc +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright (c) 2011 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 - -#include "libcef/browser_socket_stream_bridge.h" - -#include "base/atomicops.h" -#include "base/bind.h" -#include "base/memory/ref_counted.h" -#include "base/message_loop.h" -#include "googleurl/src/gurl.h" -#include "net/socket_stream/socket_stream_job.h" -#include "net/websockets/websocket_job.h" -#include "net/url_request/url_request_context.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebSocketStreamHandle.h" -#include "webkit/glue/websocketstreamhandle_bridge.h" -#include "webkit/glue/websocketstreamhandle_delegate.h" - -using webkit_glue::WebSocketStreamHandleBridge; - -const int kNoSocketId = 0; - -namespace { - -base::MessageLoop* g_io_thread; -net::URLRequestContext* g_request_context; - -class WebSocketStreamHandleBridgeImpl - : public WebSocketStreamHandleBridge, - public net::SocketStream::Delegate { - public: - WebSocketStreamHandleBridgeImpl( - WebKit::WebSocketStreamHandle* handle, - webkit_glue::WebSocketStreamHandleDelegate* delegate); - - // WebSocketStreamHandleBridge methods. - virtual void Connect(const GURL& url) OVERRIDE; - virtual bool Send(const std::vector& data) OVERRIDE; - virtual void Close() OVERRIDE; - - // net::SocketStream::Delegate methods. - virtual void OnConnected(net::SocketStream* req, - int max_pending_send_allowed) OVERRIDE; - virtual void OnSentData(net::SocketStream* req, - int amount_sent) OVERRIDE; - virtual void OnReceivedData(net::SocketStream* req, - const char* data, int len) OVERRIDE; - virtual void OnClose(net::SocketStream* req) OVERRIDE; - - private: - virtual ~WebSocketStreamHandleBridgeImpl(); - - // Runs on |g_io_thread|; - void DoConnect(const GURL& url); - void DoSend(std::vector* data); - void DoClose(); - - // Runs on |message_loop_|; - void DoOnConnected(int max_amount_send_allowed); - void DoOnSentData(int amount_sent); - void DoOnReceivedData(std::vector* data); - void DoOnClose(); - - int socket_id_; - base::MessageLoop* message_loop_; - WebKit::WebSocketStreamHandle* handle_; - webkit_glue::WebSocketStreamHandleDelegate* delegate_; - - scoped_refptr socket_; - // Number of pending tasks to handle net::SocketStream::Delegate methods. - base::subtle::Atomic32 num_pending_tasks_; - - DISALLOW_COPY_AND_ASSIGN(WebSocketStreamHandleBridgeImpl); -}; - -WebSocketStreamHandleBridgeImpl::WebSocketStreamHandleBridgeImpl( - WebKit::WebSocketStreamHandle* handle, - webkit_glue::WebSocketStreamHandleDelegate* delegate) - : socket_id_(kNoSocketId), - message_loop_(base::MessageLoop::current()), - handle_(handle), - delegate_(delegate), - num_pending_tasks_(0) { - net::WebSocketJob::EnsureInit(); -} - -WebSocketStreamHandleBridgeImpl::~WebSocketStreamHandleBridgeImpl() { - DCHECK_EQ(socket_id_, kNoSocketId); -} - -void WebSocketStreamHandleBridgeImpl::Connect(const GURL& url) { - DCHECK(g_io_thread); - AddRef(); // Released in DoOnClose(). - g_io_thread->PostTask( - FROM_HERE, - base::Bind(&WebSocketStreamHandleBridgeImpl::DoConnect, this, url)); - if (delegate_) - delegate_->WillOpenStream(handle_, url); -} - -bool WebSocketStreamHandleBridgeImpl::Send( - const std::vector& data) { - DCHECK(g_io_thread); - g_io_thread->PostTask( - FROM_HERE, - base::Bind(&WebSocketStreamHandleBridgeImpl::DoSend, this, - new std::vector(data))); - return true; -} - -void WebSocketStreamHandleBridgeImpl::Close() { - DCHECK(g_io_thread); - g_io_thread->PostTask( - FROM_HERE, - base::Bind(&WebSocketStreamHandleBridgeImpl::DoClose, this)); -} - -void WebSocketStreamHandleBridgeImpl::OnConnected( - net::SocketStream* socket, int max_pending_send_allowed) { - base::subtle::NoBarrier_AtomicIncrement(&num_pending_tasks_, 1); - message_loop_->PostTask( - FROM_HERE, - base::Bind(&WebSocketStreamHandleBridgeImpl::DoOnConnected, this, - max_pending_send_allowed)); -} - -void WebSocketStreamHandleBridgeImpl::OnSentData( - net::SocketStream* socket, int amount_sent) { - base::subtle::NoBarrier_AtomicIncrement(&num_pending_tasks_, 1); - message_loop_->PostTask( - FROM_HERE, - base::Bind(&WebSocketStreamHandleBridgeImpl::DoOnSentData, this, - amount_sent)); -} - -void WebSocketStreamHandleBridgeImpl::OnReceivedData( - net::SocketStream* socket, const char* data, int len) { - base::subtle::NoBarrier_AtomicIncrement(&num_pending_tasks_, 1); - message_loop_->PostTask( - FROM_HERE, - base::Bind(&WebSocketStreamHandleBridgeImpl::DoOnReceivedData, this, - new std::vector(data, data + len))); -} - -void WebSocketStreamHandleBridgeImpl::OnClose(net::SocketStream* socket) { - base::subtle::NoBarrier_AtomicIncrement(&num_pending_tasks_, 1); - // Release socket_ on IO thread. - socket_ = NULL; - socket_id_ = kNoSocketId; - message_loop_->PostTask( - FROM_HERE, - base::Bind(&WebSocketStreamHandleBridgeImpl::DoOnClose, this)); -} - -void WebSocketStreamHandleBridgeImpl::DoConnect(const GURL& url) { - DCHECK(base::MessageLoop::current() == g_io_thread); - socket_ = net::SocketStreamJob::CreateSocketStreamJob( - url, this, g_request_context->transport_security_state(), - g_request_context->ssl_config_service()); - socket_->set_context(g_request_context); - socket_->Connect(); -} - -void WebSocketStreamHandleBridgeImpl::DoSend(std::vector* data) { - DCHECK(base::MessageLoop::current() == g_io_thread); - scoped_ptr > scoped_data(data); - if (!socket_) - return; - if (!socket_->SendData(&(data->at(0)), data->size())) - socket_->Close(); -} - -void WebSocketStreamHandleBridgeImpl::DoClose() { - DCHECK(base::MessageLoop::current() == g_io_thread); - if (!socket_) - return; - socket_->Close(); -} - -void WebSocketStreamHandleBridgeImpl::DoOnConnected( - int max_pending_send_allowed) { - DCHECK(base::MessageLoop::current() == message_loop_); - base::subtle::NoBarrier_AtomicIncrement(&num_pending_tasks_, -1); - if (delegate_) - delegate_->DidOpenStream(handle_, max_pending_send_allowed); -} - -void WebSocketStreamHandleBridgeImpl::DoOnSentData(int amount_sent) { - DCHECK(base::MessageLoop::current() == message_loop_); - base::subtle::NoBarrier_AtomicIncrement(&num_pending_tasks_, -1); - if (delegate_) - delegate_->DidSendData(handle_, amount_sent); -} - -void WebSocketStreamHandleBridgeImpl::DoOnReceivedData( - std::vector* data) { - DCHECK(base::MessageLoop::current() == message_loop_); - base::subtle::NoBarrier_AtomicIncrement(&num_pending_tasks_, -1); - scoped_ptr > scoped_data(data); - if (delegate_) - delegate_->DidReceiveData(handle_, &(data->at(0)), data->size()); -} - -void WebSocketStreamHandleBridgeImpl::DoOnClose() { - DCHECK(base::MessageLoop::current() == message_loop_); - base::subtle::NoBarrier_AtomicIncrement(&num_pending_tasks_, -1); - // Don't handle OnClose if there are pending tasks. - DCHECK_EQ(num_pending_tasks_, 0); - DCHECK(!socket_); - DCHECK_EQ(socket_id_, kNoSocketId); - webkit_glue::WebSocketStreamHandleDelegate* delegate = delegate_; - delegate_ = NULL; - if (delegate) - delegate->DidClose(handle_); - Release(); -} - -} // namespace - -/* static */ -void BrowserSocketStreamBridge::InitializeOnIOThread( - net::URLRequestContext* request_context) { - g_io_thread = base::MessageLoop::current(); - g_request_context = request_context; -} - -void BrowserSocketStreamBridge::Cleanup() { - g_io_thread = NULL; - g_request_context = NULL; -} - -/* static */ -webkit_glue::WebSocketStreamHandleBridge* BrowserSocketStreamBridge::Create( - WebKit::WebSocketStreamHandle* handle, - webkit_glue::WebSocketStreamHandleDelegate* delegate) { - return new WebSocketStreamHandleBridgeImpl(handle, delegate); -} diff --git a/cef1/libcef/browser_socket_stream_bridge.h b/cef1/libcef/browser_socket_stream_bridge.h deleted file mode 100644 index a59ac09a4..000000000 --- a/cef1/libcef/browser_socket_stream_bridge.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_BROWSER_SOCKET_STREAM_BRIDGE_H_ -#define CEF_LIBCEF_BROWSER_SOCKET_STREAM_BRIDGE_H_ -#pragma once - -#include "base/basictypes.h" - -namespace net { -class URLRequestContext; -} // namespace net - -namespace WebKit { -class WebSocketStreamHandle; -} // namespace WebKit - -namespace webkit_glue { -class WebSocketStreamHandleDelegate; -class WebSocketStreamHandleBridge; -} // namespace webkit_glue - -class BrowserSocketStreamBridge { - public: - static void InitializeOnIOThread(net::URLRequestContext* request_context); - static void Cleanup(); - static webkit_glue::WebSocketStreamHandleBridge* Create( - WebKit::WebSocketStreamHandle* handle, - webkit_glue::WebSocketStreamHandleDelegate* delegate); - - private: - DISALLOW_IMPLICIT_CONSTRUCTORS(BrowserSocketStreamBridge); -}; - -#endif // CEF_LIBCEF_BROWSER_SOCKET_STREAM_BRIDGE_H_ diff --git a/cef1/libcef/browser_thread_stub.cc b/cef1/libcef/browser_thread_stub.cc deleted file mode 100644 index 3b6ac32e2..000000000 --- a/cef1/libcef/browser_thread_stub.cc +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 "content/public/browser/browser_thread.h" -#include "libcef/cef_thread.h" - -// Stub implementations to convert BrowserThread calls to CefThread. - -namespace content { - -namespace { - -int GetCefId(BrowserThread::ID browser_id) { - switch (browser_id) { - case BrowserThread::UI: - return CefThread::UI; - case BrowserThread::IO: - return CefThread::IO; - case BrowserThread::DB: - case BrowserThread::FILE: - return CefThread::FILE; - default: - break; - } - - // The specified BrowserThread ID is not supported. - NOTREACHED(); - return -1; -} - -} // namespace - -// static -bool BrowserThread::PostTask(ID identifier, - const tracked_objects::Location& from_here, - const base::Closure& task) { - int cef_id = GetCefId(identifier); - if (cef_id < 0) - return false; - - return CefThread::PostTask(static_cast(cef_id), from_here, - task); -} - -// static -bool BrowserThread::PostDelayedTask(ID identifier, - const tracked_objects::Location& from_here, - const base::Closure& task, - base::TimeDelta delay) { - int cef_id = GetCefId(identifier); - if (cef_id < 0) - return false; - - return CefThread::PostDelayedTask(static_cast(cef_id), - from_here, task, delay); -} - -// static -bool BrowserThread::CurrentlyOn(ID identifier) { - int cef_id = GetCefId(identifier); - if (cef_id < 0) - return false; - - return CefThread::CurrentlyOn(static_cast(cef_id)); -} - -// static -scoped_refptr - BrowserThread::GetMessageLoopProxyForThread(ID identifier) { - int cef_id = GetCefId(identifier); - if (cef_id < 0) - return NULL; - - return CefThread::GetMessageLoopProxyForThread( - static_cast(cef_id)); -} - -// static -base::SequencedWorkerPool* BrowserThread::GetBlockingPool() { - return CefThread::GetBlockingPool(); -} - -} // namespace content diff --git a/cef1/libcef/browser_tooltip_mac.h b/cef1/libcef/browser_tooltip_mac.h deleted file mode 100644 index 3a7b037d2..000000000 --- a/cef1/libcef/browser_tooltip_mac.h +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) 2013 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. - -#ifndef CEF_LIBCEF_BROWSER_TOOLTIP_MAC_H_ -#define CEF_LIBCEF_BROWSER_TOOLTIP_MAC_H_ -#pragma once - -@protocol BrowserTooltip -- (void)setToolTipAtMousePoint:(NSString *)string; -@end - -#endif // CEF_LIBCEF_BROWSER_TOOLTIP_MAC_H_ diff --git a/cef1/libcef/browser_webblobregistry_impl.cc b/cef1/libcef/browser_webblobregistry_impl.cc deleted file mode 100644 index e24159967..000000000 --- a/cef1/libcef/browser_webblobregistry_impl.cc +++ /dev/null @@ -1,128 +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 "libcef/browser_webblobregistry_impl.h" - -#include "base/bind.h" -#include "base/message_loop.h" -#include "googleurl/src/gurl.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebBlobData.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" -#include "webkit/base/file_path_string_conversions.h" -#include "webkit/blob/blob_data.h" -#include "webkit/blob/blob_storage_controller.h" - -using WebKit::WebBlobData; -using WebKit::WebURL; -using webkit_blob::BlobData; - -namespace { - -base::MessageLoop* g_io_thread; -webkit_blob::BlobStorageController* g_blob_storage_controller; - -// Creates a new BlobData from WebBlobData. -BlobData* NewBlobData(const WebBlobData& data) { - BlobData* blob = new BlobData; - size_t i = 0; - WebBlobData::Item item; - while (data.itemAt(i++, item)) { - switch (item.type) { - case WebBlobData::Item::TypeData: - if (!item.data.isEmpty()) { - // WebBlobData does not allow partial data. - DCHECK(!item.offset && item.length == -1); - blob->AppendData(item.data); - } - break; - case WebBlobData::Item::TypeFile: - if (item.length) { - blob->AppendFile( - webkit_base::WebStringToFilePath(item.filePath), - static_cast(item.offset), - static_cast(item.length), - base::Time::FromDoubleT(item.expectedModificationTime)); - } - break; - case WebBlobData::Item::TypeBlob: - if (item.length) { - blob->AppendBlob( - item.blobURL, - static_cast(item.offset), - static_cast(item.length)); - } - break; - default: - NOTREACHED(); - } - } - blob->set_content_type(data.contentType().utf8().data()); - blob->set_content_disposition(data.contentDisposition().utf8().data()); - return blob; -} - -} // namespace - -/* static */ -void BrowserWebBlobRegistryImpl::InitializeOnIOThread( - webkit_blob::BlobStorageController* blob_storage_controller) { - g_io_thread = base::MessageLoop::current(); - g_blob_storage_controller = blob_storage_controller; -} - -/* static */ -void BrowserWebBlobRegistryImpl::Cleanup() { - g_io_thread = NULL; - g_blob_storage_controller = NULL; -} - -BrowserWebBlobRegistryImpl::BrowserWebBlobRegistryImpl() { -} - -void BrowserWebBlobRegistryImpl::registerBlobURL( - const WebURL& url, WebBlobData& data) { - DCHECK(g_io_thread); - GURL thread_safe_url = url; // WebURL uses refcounted strings. - g_io_thread->PostTask(FROM_HERE, base::Bind( - &BrowserWebBlobRegistryImpl::AddFinishedBlob, this, - thread_safe_url, make_scoped_refptr(NewBlobData(data)))); -} - -void BrowserWebBlobRegistryImpl::registerBlobURL( - const WebURL& url, const WebURL& src_url) { - DCHECK(g_io_thread); - GURL thread_safe_url = url; - GURL thread_safe_src_url = src_url; - g_io_thread->PostTask(FROM_HERE, base::Bind( - &BrowserWebBlobRegistryImpl::CloneBlob, this, - thread_safe_url, thread_safe_src_url)); -} - -void BrowserWebBlobRegistryImpl::unregisterBlobURL(const WebURL& url) { - DCHECK(g_io_thread); - GURL thread_safe_url = url; - g_io_thread->PostTask(FROM_HERE, base::Bind( - &BrowserWebBlobRegistryImpl::RemoveBlob, this, - thread_safe_url)); -} - -BrowserWebBlobRegistryImpl::~BrowserWebBlobRegistryImpl() { -} - -void BrowserWebBlobRegistryImpl::AddFinishedBlob( - const GURL& url, BlobData* blob_data) { - DCHECK(g_blob_storage_controller); - g_blob_storage_controller->AddFinishedBlob(url, blob_data); -} - -void BrowserWebBlobRegistryImpl::CloneBlob( - const GURL& url, const GURL& src_url) { - DCHECK(g_blob_storage_controller); - g_blob_storage_controller->CloneBlob(url, src_url); -} - -void BrowserWebBlobRegistryImpl::RemoveBlob(const GURL& url) { - DCHECK(g_blob_storage_controller); - g_blob_storage_controller->RemoveBlob(url); -} diff --git a/cef1/libcef/browser_webblobregistry_impl.h b/cef1/libcef/browser_webblobregistry_impl.h deleted file mode 100644 index ee961d9f4..000000000 --- a/cef1/libcef/browser_webblobregistry_impl.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_BROWSER_WEBBLOBREGISTRY_IMPL_H_ -#define CEF_LIBCEF_BROWSER_WEBBLOBREGISTRY_IMPL_H_ -#pragma once - -#include "base/memory/ref_counted.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebBlobRegistry.h" - -class GURL; - -namespace webkit_blob { -class BlobData; -class BlobStorageController; -} - -class BrowserWebBlobRegistryImpl - : public WebKit::WebBlobRegistry, - public base::RefCountedThreadSafe { - public: - static void InitializeOnIOThread( - webkit_blob::BlobStorageController* blob_storage_controller); - static void Cleanup(); - - BrowserWebBlobRegistryImpl(); - - // See WebBlobRegistry.h for documentation on these functions. - virtual void registerBlobURL(const WebKit::WebURL& url, - WebKit::WebBlobData& data); - virtual void registerBlobURL(const WebKit::WebURL& url, - const WebKit::WebURL& src_url); - virtual void unregisterBlobURL(const WebKit::WebURL& url); - - protected: - virtual ~BrowserWebBlobRegistryImpl(); - - private: - friend class base::RefCountedThreadSafe; - - // Run on I/O thread. - void AddFinishedBlob(const GURL& url, webkit_blob::BlobData* blob_data); - void CloneBlob(const GURL& url, const GURL& src_url); - void RemoveBlob(const GURL& url); - - DISALLOW_COPY_AND_ASSIGN(BrowserWebBlobRegistryImpl); -}; - -#endif // CEF_LIBCEF_BROWSER_WEBBLOBREGISTRY_IMPL_H_ diff --git a/cef1/libcef/browser_webcookiejar_impl.cc b/cef1/libcef/browser_webcookiejar_impl.cc deleted file mode 100644 index 8b470fdfb..000000000 --- a/cef1/libcef/browser_webcookiejar_impl.cc +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (c) 2012 the Chromium Embedded Framework authors. -// Portions 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. - -#include "libcef/browser_webcookiejar_impl.h" - -#include - -#include "libcef/browser_resource_loader_bridge.h" -#include "libcef/browser_impl.h" -#include "libcef/cookie_manager_impl.h" -#include "libcef/cef_context.h" -#include "libcef/cef_thread.h" - -#include "base/synchronization/waitable_event.h" -#include "net/cookies/cookie_store.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" - -using WebKit::WebString; -using WebKit::WebURL; - -namespace { - -net::CookieStore* GetCookieStore(CefRefPtr browser) { - scoped_refptr cookie_store; - if (browser) { - CefRefPtr client = browser->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetRequestHandler(); - if (handler.get()) { - // Get the manager from the handler. - CefRefPtr manager = - handler->GetCookieManager(browser.get(), - browser->pending_url().spec()); - if (manager.get()) { - cookie_store = - reinterpret_cast( - manager.get())->cookie_monster(); - } - } - } - } - - if (!cookie_store) { - // Use the global cookie store. - cookie_store = _Context->request_context()->cookie_store(); - } - - DCHECK(cookie_store); - return cookie_store; -} - -class CookieSetter : public base::RefCountedThreadSafe { - public: - void Set(CefRefPtr browser, - const GURL& url, - const std::string& cookie) { - REQUIRE_IOT(); - - scoped_refptr cookie_store = GetCookieStore(browser); - cookie_store->SetCookieWithOptionsAsync( - url, cookie, net::CookieOptions(), - net::CookieStore::SetCookiesCallback()); - } - - private: - friend class base::RefCountedThreadSafe; - - ~CookieSetter() {} -}; - -class CookieGetter : public base::RefCountedThreadSafe { - public: - CookieGetter() : event_(false, false) { - } - - void Get(CefRefPtr browser, const GURL& url) { - REQUIRE_IOT(); - - scoped_refptr cookie_store = GetCookieStore(browser); - cookie_store->GetCookiesWithOptionsAsync( - url, net::CookieOptions(), - base::Bind(&CookieGetter::OnGetCookies, this)); - } - - std::string GetResult() { - event_.Wait(); - return result_; - } - - private: - void OnGetCookies(const std::string& cookie_line) { - result_ = cookie_line; - event_.Signal(); - } - friend class base::RefCountedThreadSafe; - - ~CookieGetter() {} - - base::WaitableEvent event_; - std::string result_; -}; - -} // namespace - -BrowserWebCookieJarImpl::BrowserWebCookieJarImpl() - : browser_(NULL) { -} - -BrowserWebCookieJarImpl::BrowserWebCookieJarImpl(CefBrowserImpl* browser) - : browser_(browser) { -} - -void BrowserWebCookieJarImpl::setCookie(const WebURL& url, - const WebURL& first_party_for_cookies, - const WebString& value) { - GURL gurl = url; - std::string cookie = value.utf8(); - - // Proxy to IO thread to synchronize w/ network loading. - scoped_refptr cookie_setter = new CookieSetter(); - CefThread::PostTask(CefThread::IO, FROM_HERE, base::Bind( - &CookieSetter::Set, cookie_setter.get(), browser_, gurl, cookie)); -} - -WebString BrowserWebCookieJarImpl::cookies( - const WebURL& url, - const WebURL& first_party_for_cookies) { - GURL gurl = url; - - // Proxy to IO thread to synchronize w/ network loading. - scoped_refptr cookie_getter = new CookieGetter(); - CefThread::PostTask(CefThread::IO, FROM_HERE, base::Bind( - &CookieGetter::Get, cookie_getter.get(), browser_, gurl)); - - // Blocks until the result is available. - return WebString::fromUTF8(cookie_getter->GetResult()); -} diff --git a/cef1/libcef/browser_webcookiejar_impl.h b/cef1/libcef/browser_webcookiejar_impl.h deleted file mode 100644 index 52d2b26a0..000000000 --- a/cef1/libcef/browser_webcookiejar_impl.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2012 the Chromium Embedded Framework authors. -// Portions 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. - -#ifndef CEF_LIBCEF_BROWSER_WEBCOOKIEJAR_IMPL_H_ -#define CEF_LIBCEF_BROWSER_WEBCOOKIEJAR_IMPL_H_ -#pragma once - -#include "third_party/WebKit/Source/Platform/chromium/public/WebCookieJar.h" - -namespace net { -class CookieStore; -} - -class CefBrowserImpl; - -// Handles cookie requests from the renderer. -class BrowserWebCookieJarImpl : public WebKit::WebCookieJar { - public: - BrowserWebCookieJarImpl(); - explicit BrowserWebCookieJarImpl(CefBrowserImpl* browser); - - // WebKit::WebCookieJar methods. - virtual void setCookie( - const WebKit::WebURL& url, const WebKit::WebURL& first_party_for_cookies, - const WebKit::WebString& cookie); - virtual WebKit::WebString cookies( - const WebKit::WebURL& url, const WebKit::WebURL& first_party_for_cookies); - - private: - // May be NULL for the global implementation. - CefBrowserImpl* browser_; -}; - -#endif // CEF_LIBCEF_BROWSER_WEBCOOKIEJAR_IMPL_H_ diff --git a/cef1/libcef/browser_webkit_glue.cc b/cef1/libcef/browser_webkit_glue.cc deleted file mode 100644 index ff6891859..000000000 --- a/cef1/libcef/browser_webkit_glue.cc +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright (c) 2008-2009 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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 "libcef/browser_webkit_glue.h" - -#include "third_party/WebKit/Source/WebCore/config.h" -MSVC_PUSH_WARNING_LEVEL(0); -#include "CrossOriginPreflightResultCache.h" // NOLINT(build/include) -#include "DocumentLoader.h" // NOLINT(build/include) -#include "MemoryCache.h" // NOLINT(build/include) -#include "ScriptController.h" // NOLINT(build/include) -#include "TextEncoding.h" // NOLINT(build/include) -#include "third_party/WebKit/Source/WebKit/chromium/src/WebFrameImpl.h" -MSVC_POP_WARNING(); -#undef LOG - -#include "base/logging.h" -#include "base/string_util.h" -#include "net/base/mime_util.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "webkit/glue/webkit_glue.h" -#include "webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h" -#include "webkit/gpu/webgraphicscontext3d_in_process_impl.h" -#include "webkit/plugins/npapi/plugin_list.h" - -// Generated by GRIT -#include "grit/webkit_resources.h" - -using WebKit::WebFrameImpl; - -namespace webkit_glue { - -bool IsMediaPlayerAvailable() { - return true; -} - -void InitializeTextEncoding() { - WebCore::UTF8Encoding(); -} - -v8::Handle GetV8Context(WebKit::WebFrame* frame) { - WebFrameImpl* impl = static_cast(frame); - return WebCore::ScriptController::mainWorldContext(impl->frame()); -} - -void ClearCache() { - if (WebCore::memoryCache()->disabled()) - return; - - // Clear the memory cache by disabling and then re-enabling it. - WebCore::memoryCache()->setDisabled(true); - WebCore::memoryCache()->setDisabled(false); - - // Empty the Cross-Origin Preflight cache - WebCore::CrossOriginPreflightResultCache::shared().empty(); -} - -#if defined(OS_LINUX) -int MatchFontWithFallback(const std::string& face, bool bold, - bool italic, int charset) { - return -1; -} - -bool GetFontTable(int fd, uint32_t table, uint8_t* output, - size_t* output_length) { - return false; -} -#endif - -// Adapted from Chromium's BufferedResourceHandler::ShouldDownload -bool ShouldDownload(const std::string& content_disposition, - const std::string& mime_type) { - std::string type = StringToLowerASCII(mime_type); - std::string disposition = StringToLowerASCII(content_disposition); - - // First, examine content-disposition. - if (!disposition.empty()) { - bool should_download = true; - - // Some broken sites just send ... - // Content-Disposition: ; filename="file" - // ... screen those out here. - if (disposition[0] == ';') - should_download = false; - - if (disposition.compare(0, 6, "inline") == 0) - should_download = false; - - // Some broken sites just send ... - // Content-Disposition: filename="file" - // ... without a disposition token... Screen those out. - if (disposition.compare(0, 8, "filename") == 0) - should_download = false; - - // Also in use is Content-Disposition: name="file" - if (disposition.compare(0, 4, "name") == 0) - should_download = false; - - // We have a content-disposition of "attachment" or unknown. - // RFC 2183, section 2.8 says that an unknown disposition - // value should be treated as "attachment". - if (should_download) - return true; - } - - // Mirrors WebViewImpl::CanShowMIMEType() - if (type.empty() || net::IsSupportedMimeType(type)) - return false; - - // Finally, check the plugin list. - bool allow_wildcard = false; - std::vector plugins; - webkit::npapi::PluginList::Singleton()->GetPluginInfoArray( - GURL(), type, allow_wildcard, NULL, &plugins, NULL); - - // If any associated plugins exist and are enabled don't allow the download. - if (!plugins.empty()) { - std::vector::const_iterator it = plugins.begin(); - for (; it != plugins.end(); ++it) { - if (webkit_glue::IsPluginEnabled(*it)) - return false; - } - } - - return true; -} - -bool IsPluginEnabled(const webkit::WebPluginInfo& plugin) { - return true; -} - -WebKit::WebGraphicsContext3D* CreateGraphicsContext3D( - cef_graphics_implementation_t graphics_implementation, - const WebKit::WebGraphicsContext3D::Attributes& attributes, - WebKit::WebView* web_view, - bool renderDirectlyToWebView) { -#if defined(OS_WIN) - bool use_command_buffer = - (graphics_implementation == ANGLE_IN_PROCESS_COMMAND_BUFFER || - graphics_implementation == DESKTOP_IN_PROCESS_COMMAND_BUFFER); -#else - bool use_command_buffer = - (graphics_implementation == DESKTOP_IN_PROCESS_COMMAND_BUFFER); -#endif - - if (use_command_buffer) { - return new webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl(attributes); - } else { - return webkit::gpu::WebGraphicsContext3DInProcessImpl::CreateForWebView( - attributes, renderDirectlyToWebView); - } -} - -} // namespace webkit_glue diff --git a/cef1/libcef/browser_webkit_glue.h b/cef1/libcef/browser_webkit_glue.h deleted file mode 100644 index 08cfee567..000000000 --- a/cef1/libcef/browser_webkit_glue.h +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_BROWSER_WEBKIT_GLUE_H_ -#define CEF_LIBCEF_BROWSER_WEBKIT_GLUE_H_ -#pragma once - -#include - -#include "include/internal/cef_types.h" - -#include "base/compiler_specific.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h" -#include "v8/include/v8.h" - -#if defined(OS_WIN) -#include // NOLINT(build/include_order) -#endif - -namespace WebKit { -class WebFrame; -class WebView; -} -namespace webkit { -struct WebPluginInfo; -} - -namespace webkit_glue { - -// Text encoding objects must be initialized on the main thread. -void InitializeTextEncoding(); - -// Retrieve the V8 context associated with the frame. -v8::Handle GetV8Context(WebKit::WebFrame* frame); - -// Clear all cached data. -void ClearCache(); - -// Returns true if the request represents a download based on -// the supplied Content-Type and Content-Disposition headers. -bool ShouldDownload(const std::string& content_disposition, - const std::string& mime_type); - -// Checks whether a plugin is enabled either by the user or by policy. -bool IsPluginEnabled(const webkit::WebPluginInfo& plugin); - -// Create a new WebGraphicsContext3D object. -WebKit::WebGraphicsContext3D* CreateGraphicsContext3D( - cef_graphics_implementation_t graphics_implementation, - const WebKit::WebGraphicsContext3D::Attributes& attributes, - WebKit::WebView* web_view, - bool renderDirectlyToWebView); - -} // namespace webkit_glue - -#endif // CEF_LIBCEF_BROWSER_WEBKIT_GLUE_H_ diff --git a/cef1/libcef/browser_webkit_glue_win.cc b/cef1/libcef/browser_webkit_glue_win.cc deleted file mode 100644 index bb6dadb96..000000000 --- a/cef1/libcef/browser_webkit_glue_win.cc +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2008 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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 "libcef/browser_webkit_glue.h" -#include "webkit/glue/webkit_glue.h" - -namespace webkit_glue { - -bool EnsureFontLoaded(HFONT font) { - return true; -} - -} // namespace webkit_glue diff --git a/cef1/libcef/browser_webkit_init.cc b/cef1/libcef/browser_webkit_init.cc deleted file mode 100644 index 8d51d5383..000000000 --- a/cef1/libcef/browser_webkit_init.cc +++ /dev/null @@ -1,298 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2009 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 "libcef/browser_webkit_init.h" -#include "libcef/browser_resource_loader_bridge.h" -#include "libcef/browser_socket_stream_bridge.h" -#include "libcef/browser_webkit_glue.h" -#include "libcef/cef_context.h" - -#include "base/metrics/stats_counters.h" -#include "base/path_service.h" -#include "base/utf_string_conversions.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebPrerenderingSupport.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDatabase.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebRuntimeFeatures.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBFactory.h" -#include "v8/include/v8.h" -#include "webkit/plugins/npapi/plugin_list.h" - - -// Stub implementation of WebKit::WebPrerenderingSupport. -class BrowserPrerenderingSupport : public WebKit::WebPrerenderingSupport { - public: - virtual ~BrowserPrerenderingSupport() {} - - private: - virtual void add(const WebKit::WebPrerender& prerender) OVERRIDE {} - virtual void cancel(const WebKit::WebPrerender& prerender) OVERRIDE {} - virtual void abandon(const WebKit::WebPrerender& prerender) OVERRIDE {} -}; - - -BrowserWebKitInit::BrowserWebKitInit() - : clipboard_(&clipboard_client_) { - v8::V8::SetCounterFunction(base::StatsTable::FindLocation); - - WebKit::initialize(this); - WebKit::setLayoutTestMode(false); - WebKit::WebRuntimeFeatures::enableApplicationCache(true); - WebKit::WebRuntimeFeatures::enableDatabase(true); - WebKit::WebRuntimeFeatures::enableIndexedDatabase(true); - WebKit::WebRuntimeFeatures::enableFileSystem(true); - WebKit::WebRuntimeFeatures::enableGeolocation(true); - - // TODO(cef): Enable these once the implementation supports it. - WebKit::WebRuntimeFeatures::enableNotifications(false); - WebKit::WebRuntimeFeatures::enableSpeechInput(false); - WebKit::WebRuntimeFeatures::enableTouch(false); - WebKit::WebRuntimeFeatures::enableDeviceMotion(false); - WebKit::WebRuntimeFeatures::enableDeviceOrientation(false); - - prerendering_support_.reset(new BrowserPrerenderingSupport); - WebKit::WebPrerenderingSupport::initialize(prerendering_support_.get()); - - base::FilePath appcache_path; - base::FilePath cache_path = _Context->cache_path(); - if (!cache_path.empty()) { - appcache_path = cache_path.Append(FILE_PATH_LITERAL("AppCache")); - if (!file_util::PathExists(appcache_path) && - !file_util::CreateDirectory(appcache_path)) { - LOG(WARNING) << "Failed to create appcache storage directory"; - appcache_path.clear(); - } - } - BrowserAppCacheSystem::InitializeOnUIThread(appcache_path); - - WebKit::WebDatabase::setObserver(&database_system_); - - blob_registry_ = new BrowserWebBlobRegistryImpl(); - - file_utilities_.set_sandbox_enabled(sandboxEnabled()); -} - -BrowserWebKitInit::~BrowserWebKitInit() { - WebKit::shutdown(); -} - -WebKit::WebMimeRegistry* BrowserWebKitInit::mimeRegistry() { - return &mime_registry_; -} - -WebKit::WebClipboard* BrowserWebKitInit::clipboard() { - return &clipboard_; -} - -WebKit::WebFileUtilities* BrowserWebKitInit::fileUtilities() { - return &file_utilities_; -} - -WebKit::WebSandboxSupport* BrowserWebKitInit::sandboxSupport() { - return NULL; -} - -WebKit::WebBlobRegistry* BrowserWebKitInit::blobRegistry() { - return blob_registry_.get(); -} - -WebKit::WebCookieJar* BrowserWebKitInit::cookieJar() { - return &cookie_jar_; -} - -WebKit::WebFileSystem* BrowserWebKitInit::fileSystem() { - BrowserFileSystem* file_system = _Context->file_system(); - // Create the context if it doesn't already exist. - file_system->CreateContext(); - return file_system; -} - -bool BrowserWebKitInit::sandboxEnabled() { - return false; -} - -WebKit::Platform::FileHandle BrowserWebKitInit::databaseOpenFile( - const WebKit::WebString& vfs_file_name, int desired_flags) { - return BrowserDatabaseSystem::GetInstance()->OpenFile( - vfs_file_name, desired_flags); -} - -int BrowserWebKitInit::databaseDeleteFile( - const WebKit::WebString& vfs_file_name, bool sync_dir) { - return BrowserDatabaseSystem::GetInstance()->DeleteFile( - vfs_file_name, sync_dir); -} - -long BrowserWebKitInit::databaseGetFileAttributes( // NOLINT(runtime/int) - const WebKit::WebString& vfs_file_name) { - return BrowserDatabaseSystem::GetInstance()->GetFileAttributes( - vfs_file_name); -} - -long long BrowserWebKitInit::databaseGetFileSize( // NOLINT(runtime/int) - const WebKit::WebString& vfs_file_name) { - return BrowserDatabaseSystem::GetInstance()->GetFileSize(vfs_file_name); -} - -long long // NOLINT(runtime/int) -BrowserWebKitInit::databaseGetSpaceAvailableForOrigin( - const WebKit::WebString& origin_identifier) { - return BrowserDatabaseSystem::GetInstance()->GetSpaceAvailable( - origin_identifier); -} - -unsigned long long BrowserWebKitInit::visitedLinkHash( // NOLINT(runtime/int) - const char* canonicalURL, size_t length) { - return 0; -} - -bool BrowserWebKitInit::isLinkVisited( - unsigned long long linkHash) { // NOLINT(runtime/int) - return false; -} - -WebKit::WebMessagePortChannel* -BrowserWebKitInit::createMessagePortChannel() { - return NULL; -} - -void BrowserWebKitInit::prefetchHostName(const WebKit::WebString&) { -} - -void BrowserWebKitInit::decrementStatsCounter(const char* name) { -} - -void BrowserWebKitInit::incrementStatsCounter(const char* name) { -} - -void BrowserWebKitInit::histogramCustomCounts(const char* name, int sample, - int min, int max, - int bucket_count) { -} - -void BrowserWebKitInit::histogramEnumeration(const char* name, int sample, - int boundary_value) { -} - -WebKit::WebData BrowserWebKitInit::loadResource(const char* name) { - if (!strcmp(name, "deleteButton")) { - // Create a red 30x30 square. - const char red_square[] = - "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52" - "\x00\x00\x00\x1e\x00\x00\x00\x1e\x04\x03\x00\x00\x00\xc9\x1e\xb3" - "\x91\x00\x00\x00\x30\x50\x4c\x54\x45\x00\x00\x00\x80\x00\x00\x00" - "\x80\x00\x80\x80\x00\x00\x00\x80\x80\x00\x80\x00\x80\x80\x80\x80" - "\x80\xc0\xc0\xc0\xff\x00\x00\x00\xff\x00\xff\xff\x00\x00\x00\xff" - "\xff\x00\xff\x00\xff\xff\xff\xff\xff\x7b\x1f\xb1\xc4\x00\x00\x00" - "\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a" - "\x9c\x18\x00\x00\x00\x17\x49\x44\x41\x54\x78\x01\x63\x98\x89\x0a" - "\x18\x50\xb9\x33\x47\xf9\xa8\x01\x32\xd4\xc2\x03\x00\x33\x84\x0d" - "\x02\x3a\x91\xeb\xa5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60" - "\x82"; - return WebKit::WebData(red_square, arraysize(red_square)); - } - return webkit_glue::WebKitPlatformSupportImpl::loadResource(name); -} - -WebKit::WebString BrowserWebKitInit::defaultLocale() { - return ASCIIToUTF16(_Context->locale()); -} - -WebKit::WebStorageNamespace* BrowserWebKitInit::createLocalStorageNamespace( - const WebKit::WebString& path, unsigned quota) { - return dom_storage_system_.CreateLocalStorageNamespace(); -} - -WebKit::WebIDBFactory* BrowserWebKitInit::idbFactory() { - return WebKit::WebIDBFactory::create(); -} - -WebKit::WebGraphicsContext3D* -BrowserWebKitInit::createOffscreenGraphicsContext3D( - const WebKit::WebGraphicsContext3D::Attributes& attributes) { - const CefSettings& settings = _Context->settings(); - return webkit_glue::CreateGraphicsContext3D(settings.graphics_implementation, - attributes, NULL, false); -} - -void BrowserWebKitInit::GetPlugins( - bool refresh, std::vector* plugins) { - if (refresh) - webkit::npapi::PluginList::Singleton()->RefreshPlugins(); - webkit::npapi::PluginList::Singleton()->GetPlugins(plugins); -} - -string16 BrowserWebKitInit::GetLocalizedString(int message_id) { - return _Context->GetLocalizedString(message_id); -} - -base::StringPiece BrowserWebKitInit::GetDataResource( - int resource_id, - ui::ScaleFactor scale_factor) { - return _Context->GetDataResource(resource_id); -} - -webkit_glue::ResourceLoaderBridge* BrowserWebKitInit::CreateResourceLoader( - const webkit_glue::ResourceLoaderBridge::RequestInfo& request_info) { - return BrowserResourceLoaderBridge::Create(request_info); -} - -webkit_glue::WebSocketStreamHandleBridge* -BrowserWebKitInit::CreateWebSocketBridge( - WebKit::WebSocketStreamHandle* handle, - webkit_glue::WebSocketStreamHandleDelegate* delegate) { - return BrowserSocketStreamBridge::Create(handle, delegate); -} - -WebKit::WebString BrowserWebKitInit::queryLocalizedString( - WebKit::WebLocalizedString::Name name) { - switch (name) { - case WebKit::WebLocalizedString::ValidationValueMissing: - case WebKit::WebLocalizedString::ValidationValueMissingForCheckbox: - case WebKit::WebLocalizedString::ValidationValueMissingForFile: - case WebKit::WebLocalizedString::ValidationValueMissingForMultipleFile: - case WebKit::WebLocalizedString::ValidationValueMissingForRadio: - case WebKit::WebLocalizedString::ValidationValueMissingForSelect: - return ASCIIToUTF16("value missing"); - case WebKit::WebLocalizedString::ValidationTypeMismatch: - case WebKit::WebLocalizedString::ValidationTypeMismatchForEmail: - case WebKit::WebLocalizedString::ValidationTypeMismatchForMultipleEmail: - case WebKit::WebLocalizedString::ValidationTypeMismatchForURL: - return ASCIIToUTF16("type mismatch"); - case WebKit::WebLocalizedString::ValidationPatternMismatch: - return ASCIIToUTF16("pattern mismatch"); - case WebKit::WebLocalizedString::ValidationTooLong: - return ASCIIToUTF16("too long"); - case WebKit::WebLocalizedString::ValidationRangeUnderflow: - return ASCIIToUTF16("range underflow"); - case WebKit::WebLocalizedString::ValidationRangeOverflow: - return ASCIIToUTF16("range overflow"); - case WebKit::WebLocalizedString::ValidationStepMismatch: - return ASCIIToUTF16("step mismatch"); - default: - return WebKitPlatformSupportImpl::queryLocalizedString(name); - } -} - -WebKit::WebString BrowserWebKitInit::queryLocalizedString( - WebKit::WebLocalizedString::Name name, const WebKit::WebString& value) { - if (name == WebKit::WebLocalizedString::ValidationRangeUnderflow) - return ASCIIToUTF16("range underflow"); - if (name == WebKit::WebLocalizedString::ValidationRangeOverflow) - return ASCIIToUTF16("range overflow"); - return WebKitPlatformSupportImpl::queryLocalizedString(name, value); -} - -WebKit::WebString BrowserWebKitInit::queryLocalizedString( - WebKit::WebLocalizedString::Name name, - const WebKit::WebString& value1, - const WebKit::WebString& value2) { - if (name == WebKit::WebLocalizedString::ValidationTooLong) - return ASCIIToUTF16("too long"); - if (name == WebKit::WebLocalizedString::ValidationStepMismatch) - return ASCIIToUTF16("step mismatch"); - return WebKitPlatformSupportImpl::queryLocalizedString( - name, value1, value2); -} diff --git a/cef1/libcef/browser_webkit_init.h b/cef1/libcef/browser_webkit_init.h deleted file mode 100644 index 9c162ca54..000000000 --- a/cef1/libcef/browser_webkit_init.h +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2009 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. - -#ifndef CEF_LIBCEF_BROWSER_WEBKIT_INIT_H_ -#define CEF_LIBCEF_BROWSER_WEBKIT_INIT_H_ -#pragma once - -#include - -#include "libcef/browser_appcache_system.h" -#include "libcef/browser_database_system.h" -#include "libcef/browser_dom_storage_system.h" -#include "libcef/browser_file_system.h" -#include "libcef/browser_webblobregistry_impl.h" -#include "libcef/browser_webcookiejar_impl.h" -#include "libcef/simple_clipboard_impl.h" - -#include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h" -#include "webkit/glue/simple_webmimeregistry_impl.h" -#include "webkit/glue/webclipboard_impl.h" -#include "webkit/glue/webfileutilities_impl.h" -#include "webkit/glue/webkitplatformsupport_impl.h" - -class BrowserPrerenderingSupport; - -namespace WebKit { -class WebIDBFactory; -} - -class BrowserWebKitInit : public webkit_glue::WebKitPlatformSupportImpl { - public: - BrowserWebKitInit(); - virtual ~BrowserWebKitInit(); - - virtual WebKit::WebMimeRegistry* mimeRegistry() OVERRIDE; - virtual WebKit::WebClipboard* clipboard() OVERRIDE; - virtual WebKit::WebFileUtilities* fileUtilities() OVERRIDE; - virtual WebKit::WebSandboxSupport* sandboxSupport() OVERRIDE; - virtual WebKit::WebBlobRegistry* blobRegistry() OVERRIDE; - virtual WebKit::WebCookieJar* cookieJar() OVERRIDE; - virtual WebKit::WebFileSystem* fileSystem() OVERRIDE; - virtual bool sandboxEnabled() OVERRIDE; - virtual WebKit::Platform::FileHandle databaseOpenFile( - const WebKit::WebString& vfs_file_name, int desired_flags) OVERRIDE; - virtual int databaseDeleteFile(const WebKit::WebString& vfs_file_name, - bool sync_dir) OVERRIDE; - virtual long databaseGetFileAttributes( // NOLINT(runtime/int) - const WebKit::WebString& vfs_file_name) OVERRIDE; - virtual long long databaseGetFileSize( // NOLINT(runtime/int) - const WebKit::WebString& vfs_file_name) OVERRIDE; - virtual long long databaseGetSpaceAvailableForOrigin( // NOLINT(runtime/int) - const WebKit::WebString& origin_identifier) OVERRIDE; - virtual unsigned long long visitedLinkHash( // NOLINT(runtime/int) - const char* canonicalURL, - size_t length) OVERRIDE; - virtual bool isLinkVisited( - unsigned long long linkHash) OVERRIDE; // NOLINT(runtime/int) - virtual WebKit::WebMessagePortChannel* createMessagePortChannel() OVERRIDE; - virtual void prefetchHostName(const WebKit::WebString&) OVERRIDE; - virtual void decrementStatsCounter(const char* name) OVERRIDE; - virtual void incrementStatsCounter(const char* name) OVERRIDE; - virtual void histogramCustomCounts(const char* name, int sample, int min, - int max, int bucket_count) OVERRIDE; - virtual void histogramEnumeration(const char* name, int sample, - int boundary_value) OVERRIDE; - virtual WebKit::WebData loadResource(const char* name) OVERRIDE; - virtual WebKit::WebString defaultLocale() OVERRIDE; - virtual WebKit::WebStorageNamespace* createLocalStorageNamespace( - const WebKit::WebString& path, unsigned quota) OVERRIDE; - virtual WebKit::WebIDBFactory* idbFactory(); - virtual WebKit::WebGraphicsContext3D* createOffscreenGraphicsContext3D( - const WebKit::WebGraphicsContext3D::Attributes& attributes) OVERRIDE; - virtual string16 GetLocalizedString(int message_id) OVERRIDE; - virtual base::StringPiece GetDataResource( - int resource_id, - ui::ScaleFactor scale_factor) OVERRIDE; - virtual void GetPlugins(bool refresh, - std::vector* plugins) OVERRIDE; - virtual webkit_glue::ResourceLoaderBridge* CreateResourceLoader( - const webkit_glue::ResourceLoaderBridge::RequestInfo& request_info) - OVERRIDE; - virtual webkit_glue::WebSocketStreamHandleBridge* CreateWebSocketBridge( - WebKit::WebSocketStreamHandle* handle, - webkit_glue::WebSocketStreamHandleDelegate* delegate) OVERRIDE; - virtual WebKit::WebString queryLocalizedString( - WebKit::WebLocalizedString::Name name) OVERRIDE; - virtual WebKit::WebString queryLocalizedString( - WebKit::WebLocalizedString::Name name, const WebKit::WebString& value) - OVERRIDE; - virtual WebKit::WebString queryLocalizedString( - WebKit::WebLocalizedString::Name name, - const WebKit::WebString& value1, - const WebKit::WebString& value2) OVERRIDE; - - private: - webkit_glue::SimpleWebMimeRegistryImpl mime_registry_; - webkit_glue::WebClipboardImpl clipboard_; - SimpleClipboardClient clipboard_client_; - webkit_glue::WebFileUtilitiesImpl file_utilities_; - BrowserAppCacheSystem appcache_system_; - BrowserDatabaseSystem database_system_; - BrowserDomStorageSystem dom_storage_system_; - BrowserWebCookieJarImpl cookie_jar_; - scoped_refptr blob_registry_; - scoped_ptr prerendering_support_; -}; - -#endif // CEF_LIBCEF_BROWSER_WEBKIT_INIT_H_ diff --git a/cef1/libcef/browser_webview_delegate.cc b/cef1/libcef/browser_webview_delegate.cc deleted file mode 100644 index 6b99c07c6..000000000 --- a/cef1/libcef/browser_webview_delegate.cc +++ /dev/null @@ -1,1341 +0,0 @@ -// Copyright (c) 2008-2009 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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. - -// This file contains the implementation of BrowserWebViewDelegate, which serves -// as the WebViewDelegate for the BrowserWebHost. The host is expected to -// have initialized a MessageLoop before these methods are called. - -#include "libcef/browser_webview_delegate.h" - -#include - -#include "libcef/browser_appcache_system.h" -#include "libcef/browser_dom_storage_system.h" -#include "libcef/browser_file_system.h" -#include "libcef/browser_impl.h" -#include "libcef/browser_navigation_controller.h" -#include "libcef/browser_webkit_glue.h" -#include "libcef/browser_zoom_map.h" -#include "libcef/cef_context.h" -#include "libcef/cef_process_ui_thread.h" -#include "libcef/dom_document_impl.h" -#include "libcef/request_impl.h" -#include "libcef/v8_impl.h" - -#include "base/debug/trace_event.h" -#include "base/file_util.h" -#include "base/message_loop.h" -#include "base/process_util.h" -#include "base/string_util.h" -#include "base/stringprintf.h" -#include "net/base/net_errors.h" -#include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebCString.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebData.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebPoint.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURLError.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURLRequest.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURLResponse.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebVector.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebContextMenuData.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileError.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileSystemCallbacks.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebHistoryItem.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebIconURL.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginParams.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebRange.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebStorageNamespace.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebWindowFeatures.h" -#include "ui/base/window_open_disposition.h" -#include "ui/gfx/native_widget_types.h" -#include "ui/gfx/point.h" -#include "webkit/appcache/web_application_cache_host_impl.h" -#include "webkit/base/file_path_string_conversions.h" -#include "webkit/glue/glue_serialize.h" -#include "webkit/glue/webpreferences.h" -#include "webkit/glue/weburlrequest_extradata_impl.h" -#include "webkit/plugins/npapi/plugin_list.h" -#include "webkit/plugins/npapi/webplugin_delegate_impl.h" -#include "webkit/plugins/npapi/webplugin_impl.h" - -#if defined(OS_WIN) -#include "libcef/browser_drag_delegate_win.h" -#include "libcef/web_drop_target_win.h" -#endif - -#if defined(OS_LINUX) -#include "libcef/web_drag_source_gtk.h" -#include "libcef/web_drop_target_gtk.h" -#endif - -using appcache::WebApplicationCacheHostImpl; -using WebKit::WebApplicationCacheHost; -using WebKit::WebApplicationCacheHostClient; -using WebKit::WebConsoleMessage; -using WebKit::WebContextMenuData; -using WebKit::WebCookieJar; -using WebKit::WebData; -using WebKit::WebDataSource; -using WebKit::WebEditingAction; -using WebKit::WebFileChooserParams; -using WebKit::WebFileSystem; -using WebKit::WebFileSystemCallbacks; -using WebKit::WebFormElement; -using WebKit::WebFrame; -using WebKit::WebHistoryItem; -using WebKit::WebMediaPlayer; -using WebKit::WebMediaPlayerClient; -using WebKit::WebNavigationType; -using WebKit::WebNavigationPolicy; -using WebKit::WebNode; -using WebKit::WebPlugin; -using WebKit::WebPluginParams; -using WebKit::WebPoint; -using WebKit::WebPopupType; -using WebKit::WebRange; -using WebKit::WebRect; -using WebKit::WebScreenInfo; -using WebKit::WebSecurityOrigin; -using WebKit::WebSize; -using WebKit::WebStorageNamespace; -using WebKit::WebString; -using WebKit::WebTextAffinity; -using WebKit::WebTextDirection; -using WebKit::WebURL; -using WebKit::WebURLError; -using WebKit::WebURLRequest; -using WebKit::WebURLResponse; -using WebKit::WebVector; -using WebKit::WebView; -using WebKit::WebWidget; -using WebKit::WebWindowFeatures; -using WebKit::WebKeyboardEvent; - -namespace { - -int next_page_id_ = 1; - -void TranslatePopupFeatures(const WebWindowFeatures& webKitFeatures, - CefPopupFeatures& features) { - features.x = static_cast(webKitFeatures.x); - features.xSet = webKitFeatures.xSet; - features.y = static_cast(webKitFeatures.y); - features.ySet = webKitFeatures.ySet; - features.width = static_cast(webKitFeatures.width); - features.widthSet = webKitFeatures.widthSet; - features.height = static_cast(webKitFeatures.height); - features.heightSet = webKitFeatures.heightSet; - - features.menuBarVisible = webKitFeatures.menuBarVisible; - features.statusBarVisible = webKitFeatures.statusBarVisible; - features.toolBarVisible = webKitFeatures.toolBarVisible; - features.locationBarVisible = webKitFeatures.locationBarVisible; - features.scrollbarsVisible = webKitFeatures.scrollbarsVisible; - features.resizable = webKitFeatures.resizable; - - features.fullscreen = webKitFeatures.fullscreen; - features.dialog = webKitFeatures.dialog; - features.additionalFeatures = NULL; - if (webKitFeatures.additionalFeatures.size() > 0) - features.additionalFeatures = cef_string_list_alloc(); - - CefString str; - for (unsigned int i = 0; i < webKitFeatures.additionalFeatures.size(); ++i) { - str = string16(webKitFeatures.additionalFeatures[i]); - cef_string_list_append(features.additionalFeatures, str.GetStruct()); - } -} - -} // namespace - -// WebViewClient ------------------------------------------------------------- - -WebView* BrowserWebViewDelegate::createView(WebFrame* creator, - const WebURLRequest& request, const WebWindowFeatures& features, - const WebString& name, WebKit::WebNavigationPolicy policy) { - CefString url; - if (!request.isNull()) - url = request.url().spec().utf16(); - CefPopupFeatures cefFeatures; - TranslatePopupFeatures(features, cefFeatures); - CefRefPtr browser = - browser_->UIT_CreatePopupWindow(url, cefFeatures); - return browser.get() ? browser->UIT_GetWebView() : NULL; -} - -WebWidget* BrowserWebViewDelegate::createPopupMenu(WebPopupType popup_type) { - // TODO(darin): Should we take into account |popup_type| (for activation - // purpose)? - return browser_->UIT_CreatePopupWidget(); -} - -void BrowserWebViewDelegate::didStopLoading() { - WebView* view = browser_->UIT_GetWebView(); - if (view) { - WebFrame* mainFrame = view->mainFrame(); - if (mainFrame) - OnFaviconURLChange(mainFrame); - } -} - -WebStorageNamespace* BrowserWebViewDelegate::createSessionStorageNamespace( - unsigned quota) { - return BrowserDomStorageSystem::instance().CreateSessionStorageNamespace(); -} - -void BrowserWebViewDelegate::didAddMessageToConsole( - const WebConsoleMessage& message, const WebString& source_name, - unsigned source_line) { - std::string messageStr = message.text.utf8(); - std::string sourceStr = source_name.utf8(); - - bool handled = false; - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetDisplayHandler(); - if (handler.get()) { - handled = handler->OnConsoleMessage(browser_, messageStr, sourceStr, - source_line); - } - } - - if (!handled) { - logging::LogMessage("CONSOLE", 0).stream() << "\"" - << messageStr - << ",\" source: " - << sourceStr - << "(" - << source_line - << ")"; - } -} - -void BrowserWebViewDelegate::printPage(WebFrame* frame) { - if (!frame) { - WebView* view = browser_->UIT_GetWebView(); - if (view) - frame = view->mainFrame(); - } - if (frame) - browser_->UIT_PrintPages(frame); -} - -bool BrowserWebViewDelegate::shouldBeginEditing(const WebRange& range) { - return browser_->UIT_AllowEditing(); -} - -bool BrowserWebViewDelegate::shouldEndEditing(const WebRange& range) { - return browser_->UIT_AllowEditing(); -} - -bool BrowserWebViewDelegate::shouldInsertNode(const WebNode& node, - const WebRange& range, - WebEditingAction action) { - return browser_->UIT_AllowEditing(); -} - -bool BrowserWebViewDelegate::shouldInsertText(const WebString& text, - const WebRange& range, - WebEditingAction action) { - return browser_->UIT_AllowEditing(); -} - -bool BrowserWebViewDelegate::shouldChangeSelectedRange( - const WebRange& from_range, const WebRange& to_range, - WebTextAffinity affinity, bool still_selecting) { - return browser_->UIT_AllowEditing(); -} - -bool BrowserWebViewDelegate::shouldDeleteRange(const WebRange& range) { - return browser_->UIT_AllowEditing(); -} - -bool BrowserWebViewDelegate::shouldApplyStyle(const WebString& style, - const WebRange& range) { - return browser_->UIT_AllowEditing(); -} - -bool BrowserWebViewDelegate::handleCurrentKeyboardEvent() { - WebWidgetHost* host = GetWidgetHost(); - if (host && OnKeyboardEvent(host->GetLastKeyEvent(), true)) - return true; - - if (edit_command_name_.empty()) - return false; - - WebView* view = browser_->UIT_GetWebView(); - WebFrame* frame = NULL; - if (view) - frame = view->focusedFrame(); - if (!frame) - return false; - - return frame->executeCommand(WebString::fromUTF8(edit_command_name_), - WebString::fromUTF8(edit_command_value_)); -} - -bool BrowserWebViewDelegate::runFileChooser( - const WebFileChooserParams& params, - WebKit::WebFileChooserCompletion* chooser_completion) { - // Support file open dialog. - std::vector file_names; - std::vector mime_types; - - for (size_t i = 0; i < params.acceptTypes.size(); ++i) - mime_types.push_back(params.acceptTypes[i].utf8()); - - if (!ShowFileChooser(file_names, params.multiSelect, params.title, - webkit_base::WebStringToFilePath(params.initialValue), - mime_types)) { - return false; - } - - WebVector ws_file_names(file_names.size()); - for (size_t i = 0; i < file_names.size(); ++i) - ws_file_names[i] = webkit_base::FilePathToWebString(file_names[i]); - - chooser_completion->didChooseFile(ws_file_names); - - return true; -} - -void BrowserWebViewDelegate::runModalAlertDialog( - WebFrame* frame, const WebString& message) { - CefString messageStr = string16(message); - bool handled = false; - - CefRefPtr client = browser_->GetClient(); - CefRefPtr handler; - if (client.get()) - handler = client->GetJSDialogHandler(); - - if (handler.get()) { - handled = handler->OnJSAlert(browser_, browser_->UIT_GetCefFrame(frame), - messageStr); - } - if (!handled) - ShowJavaScriptAlert(frame, messageStr); -} - -bool BrowserWebViewDelegate::runModalConfirmDialog( - WebFrame* frame, const WebString& message) { - CefString messageStr = string16(message); - bool retval = false; - bool handled = false; - - CefRefPtr client = browser_->GetClient(); - CefRefPtr handler; - if (client.get()) - handler = client->GetJSDialogHandler(); - - if (handler.get()) { - handled = handler->OnJSConfirm(browser_, browser_->UIT_GetCefFrame(frame), - messageStr, retval); - } - if (!handled) - retval = ShowJavaScriptConfirm(frame, messageStr); - return retval; -} - -bool BrowserWebViewDelegate::runModalPromptDialog( - WebFrame* frame, const WebString& message, const WebString& default_value, - WebString* actual_value) { - CefString messageStr = string16(message); - CefString defaultValueStr = string16(default_value); - CefString actualValueStr; - if (actual_value) - actualValueStr = string16(*actual_value); - - bool retval = false; - bool handled = false; - - CefRefPtr client = browser_->GetClient(); - CefRefPtr handler; - if (client.get()) - handler = client->GetJSDialogHandler(); - - if (handler.get()) { - handled = handler->OnJSPrompt(browser_, browser_->UIT_GetCefFrame(frame), - messageStr, defaultValueStr, retval, actualValueStr); - } - if (!handled) { - retval = ShowJavaScriptPrompt(frame, messageStr, defaultValueStr, - &actualValueStr); - } - if (actual_value) - *actual_value = string16(actualValueStr); - - return retval; -} - -bool BrowserWebViewDelegate::runModalBeforeUnloadDialog( - WebFrame* frame, const WebString& message) { - return true; // Allow window closure. -} - -void BrowserWebViewDelegate::setStatusText(const WebString& text) { - ShowStatus(text, STATUSTYPE_TEXT); -} - -void BrowserWebViewDelegate::setMouseOverURL(const WebURL& url) { - ShowStatus(url.spec().utf16(), STATUSTYPE_MOUSEOVER_URL); -} - -void BrowserWebViewDelegate::setKeyboardFocusURL(const WebKit::WebURL& url) { - ShowStatus(url.spec().utf16(), STATUSTYPE_KEYBOARD_FOCUS_URL); -} - -void BrowserWebViewDelegate::setToolTipText( - const WebString& text, WebTextDirection hint) { - CefString tooltipStr = string16(text); - bool handled = false; - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetDisplayHandler(); - if (handler.get()) - handled = handler->OnTooltip(browser_, tooltipStr); - } - - if (!handled) - GetWidgetHost()->SetTooltipText(tooltipStr); -} - -bool BrowserWebViewDelegate::acceptsLoadDrops() { - return !browser_->settings().load_drops_disabled; -} - -void BrowserWebViewDelegate::focusNext() { - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetFocusHandler(); - if (handler.get()) { - // Notify the handler that it should take a focus - handler->OnTakeFocus(browser_, true); - } - } -} - -void BrowserWebViewDelegate::focusPrevious() { - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetFocusHandler(); - if (handler.get()) { - // Notify the handler that it should take a focus - handler->OnTakeFocus(browser_, false); - } - } -} - -void BrowserWebViewDelegate::focusedNodeChanged(const WebKit::WebNode& node) { - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetFocusHandler(); - if (handler.get()) { - if (node.isNull()) { - handler->OnFocusedNodeChanged(browser_, browser_->GetFocusedFrame(), - NULL); - } else { - const WebKit::WebDocument& document = node.document(); - if (!document.isNull()) { - WebKit::WebFrame* frame = document.frame(); - CefRefPtr documentImpl = - new CefDOMDocumentImpl(browser_, frame); - handler->OnFocusedNodeChanged(browser_, - browser_->UIT_GetCefFrame(frame), - documentImpl->GetOrCreateNode(node)); - documentImpl->Detach(); - } - } - } - } -} - -void BrowserWebViewDelegate::navigateBackForwardSoon(int offset) { - browser_->UIT_GetNavigationController()->GoToOffset(offset); -} - -int BrowserWebViewDelegate::historyBackListCount() { - int current_index = - browser_->UIT_GetNavigationController()->GetLastCommittedEntryIndex(); - return current_index; -} - -int BrowserWebViewDelegate::historyForwardListCount() { - int current_index = - browser_->UIT_GetNavigationController()->GetLastCommittedEntryIndex(); - return browser_->UIT_GetNavigationController()->GetEntryCount() - - current_index - 1; -} - -WebKit::WebGeolocationClient* BrowserWebViewDelegate::geolocationClient() { - return browser_->UIT_GetGeolocationClient(); -} - -// WebPermissionClient ------------------------------------------------------- - -bool BrowserWebViewDelegate::allowScriptExtension( - WebKit::WebFrame* frame, - const WebKit::WebString& extensionName, - int extensionGroup) { - bool allowExtension = true; - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetPermissionHandler(); - if (handler.get()) { - CefString extensionNameStr = string16(extensionName); - allowExtension = !handler->OnBeforeScriptExtensionLoad( - browser_, browser_->UIT_GetCefFrame(frame), extensionNameStr); - } - } - return allowExtension; -} - -// WebPrerendererClient ------------------------------------------------------ - -void BrowserWebViewDelegate::willAddPrerender(WebKit::WebPrerender* prerender) { -} - -// WebPluginPageDelegate ----------------------------------------------------- - -WebKit::WebPlugin* BrowserWebViewDelegate::CreatePluginReplacement( - const base::FilePath& file_path) { - return NULL; -} - -WebCookieJar* BrowserWebViewDelegate::GetCookieJar() { - return &cookie_jar_; -} - -// WebWidgetClient ----------------------------------------------------------- - -void BrowserWebViewDelegate::didInvalidateRect(const WebRect& rect) { - if (WebWidgetHost* host = GetWidgetHost()) - host->InvalidateRect(rect); -} - -void BrowserWebViewDelegate::didScrollRect(int dx, int dy, - const WebRect& clip_rect) { - if (WebWidgetHost* host = GetWidgetHost()) - host->ScrollRect(dx, dy, clip_rect); -} - -void BrowserWebViewDelegate::scheduleAnimation() { - if (WebWidgetHost* host = GetWidgetHost()) - host->ScheduleAnimation(); -} - -// This method is called when: -// A. A request is loaded in a window other than the source window -// (FrameLoader::loadFrameRequest), or -// B. A request is loaded in an already existing popup window -// (FrameLoader::createWindow), or -// C. A DOM window receives a focus event (DOMWindow::focus) -void BrowserWebViewDelegate::didFocus() { - if (WebWidgetHost* host = GetWidgetHost()) { - bool handled = false; - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetFocusHandler(); - if (handler.get()) - handled = handler->OnSetFocus(browser_, FOCUS_SOURCE_WIDGET); - } - - if (!handled) - browser_->UIT_SetFocus(host, true); - } -} - -// This method is called when a DOM window receives a blur event -// (DOMWindow::blur). -void BrowserWebViewDelegate::didBlur() { - if (WebWidgetHost* host = GetWidgetHost()) - browser_->UIT_SetFocus(host, false); -} - -void BrowserWebViewDelegate::closeWidgetSoon() { - if (this == browser_->UIT_GetWebViewDelegate()) { - browser_->UIT_CloseBrowser(); - } else if (this == browser_->UIT_GetPopupDelegate()) { - browser_->UIT_ClosePopupWidget(); - } -} - -WebScreenInfo BrowserWebViewDelegate::screenInfo() { - if (WebWidgetHost* host = GetWidgetHost()) { - WebScreenInfo info = host->GetScreenInfo(); - - if (browser_->IsWindowRenderingDisabled()) { - // Retrieve the screen rectangle from the handler. - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetRenderHandler(); - if (handler.get()) { - CefRect rect(info.rect.x, info.rect.y, info.rect.width, - info.rect.height); - if (handler->GetScreenRect(browser_, rect)) { - info.rect = WebRect(rect.x, rect.y, rect.width, rect.height); - info.availableRect = info.rect; - } - } - } - } - - return info; - } - - return WebScreenInfo(); -} - -// WebFrameClient ------------------------------------------------------------ - -WebPlugin* BrowserWebViewDelegate::createPlugin( - WebFrame* frame, const WebPluginParams& params) { - bool allow_wildcard = true; - std::vector plugins; - std::vector mime_types; - webkit::npapi::PluginList::Singleton()->GetPluginInfoArray( - params.url, params.mimeType.utf8(), allow_wildcard, - NULL, &plugins, &mime_types); - if (plugins.empty()) - return NULL; - -#if defined(OS_MACOSX) - // Mac does not supported windowed plugins. - bool force_windowless = true; -#else - bool force_windowless = browser_->IsWindowRenderingDisabled(); -#endif - - if (force_windowless) { - DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size()); - - std::string mime_type = mime_types.front(); - bool flash = LowerCaseEqualsASCII(mime_type, - "application/x-shockwave-flash"); - bool silverlight = StartsWithASCII(mime_type, - "application/x-silverlight", false); - - if (flash) { - // "wmode" values of "opaque" or "transparent" are allowed. - size_t size = params.attributeNames.size(); - for (size_t i = 0; i < size; ++i) { - std::string name = params.attributeNames[i].utf8(); - if (name == "wmode") { - std::string value = params.attributeValues[i].utf8(); - if (value == "opaque" || value == "transparent") - flash = false; - break; - } - } - } - - if (flash || silverlight) { - WebPluginParams params_copy = params; - params_copy.mimeType = WebString::fromUTF8(mime_type); - - // Force Flash and Silverlight plugins to use windowless mode. - size_t size = params_copy.attributeNames.size(); - - WebVector new_names(size+1), new_values(size+1); - - for (size_t i = 0; i < size; ++i) { - new_names[i] = params_copy.attributeNames[i]; - new_values[i] = params_copy.attributeValues[i]; - } - - if (flash) { - new_names[size] = "wmode"; - new_values[size] = "opaque"; - } else if (silverlight) { - new_names[size] = "windowless"; - new_values[size] = "true"; - } - - params_copy.attributeNames.swap(new_names); - params_copy.attributeValues.swap(new_values); - - return new webkit::npapi::WebPluginImpl( - frame, params_copy, plugins.front().path, AsWeakPtr()); - } - } - - return new webkit::npapi::WebPluginImpl( - frame, params, plugins.front().path, AsWeakPtr()); -} - -WebApplicationCacheHost* BrowserWebViewDelegate::createApplicationCacheHost( - WebFrame* frame, WebApplicationCacheHostClient* client) { - return BrowserAppCacheSystem::CreateApplicationCacheHost(client); -} - -WebKit::WebCookieJar* BrowserWebViewDelegate::cookieJar(WebFrame* frame) { - return &cookie_jar_; -} - -void BrowserWebViewDelegate::willClose(WebFrame* frame) { - browser_->UIT_BeforeFrameClosed(frame); -} - -void BrowserWebViewDelegate::loadURLExternally( - WebFrame* frame, const WebURLRequest& request, - WebNavigationPolicy policy) { - DCHECK_NE(policy, WebKit::WebNavigationPolicyCurrentTab); - std::string url = request.url().spec().data(); - CefRefPtr newBrowser = - browser_->UIT_CreatePopupWindow(url, CefPopupFeatures()); - if (newBrowser.get() && !url.empty()) - newBrowser->GetMainFrame()->LoadURL(url); -} - -WebNavigationPolicy BrowserWebViewDelegate::decidePolicyForNavigation( - WebFrame* frame, const WebURLRequest& request, - WebNavigationType type, const WebNode& originating_node, - WebNavigationPolicy default_policy, bool is_redirect) { - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetRequestHandler(); - if (handler.get()) { - // Gather browse request information - CefRefPtr req(CefRequest::CreateRequest()); - - GURL request_url = request.url(); - if (!request_url.is_valid()) - return WebKit::WebNavigationPolicyIgnore; - - req->SetURL(request_url.spec()); - req->SetMethod(string16(request.httpMethod())); - - const WebKit::WebHTTPBody& httpBody = request.httpBody(); - if (!httpBody.isNull()) { - CefRefPtr postdata(CefPostData::CreatePostData()); - static_cast(postdata.get())->Set(httpBody); - req->SetPostData(postdata); - } - - CefRequest::HeaderMap map; - CefRequestImpl::GetHeaderMap(request, map); - if (map.size() > 0) - static_cast(req.get())->SetHeaderMap(map); - - cef_handler_navtype_t navType; - if (browser_->is_dropping()) - navType = NAVTYPE_LINKDROPPED; - else - navType = (cef_handler_navtype_t)type; - - // Notify the handler of a browse request - bool handled = handler->OnBeforeBrowse(browser_, - browser_->UIT_GetCefFrame(frame), req, navType, - is_redirect); - if (handled) - return WebKit::WebNavigationPolicyIgnore; - } - } - - WebNavigationPolicy result; - if (policy_delegate_enabled_) { - if (policy_delegate_is_permissive_) { - result = WebKit::WebNavigationPolicyCurrentTab; - } else { - result = WebKit::WebNavigationPolicyIgnore; - } - } else { - result = default_policy; - } - return result; -} - -WebURLError BrowserWebViewDelegate::cannotHandleRequestError( - WebFrame* frame, const WebURLRequest& request) { - WebURLError error; - error.domain = WebString::fromUTF8(net::kErrorDomain); - error.reason = net::ERR_ABORTED; - error.unreachableURL = request.url(); - return error; -} - -WebURLError BrowserWebViewDelegate::cancelledError( - WebFrame* frame, const WebURLRequest& request) { - WebURLError error; - error.domain = WebString::fromUTF8(net::kErrorDomain); - error.reason = net::ERR_ABORTED; - error.unreachableURL = request.url(); - return error; -} - -void BrowserWebViewDelegate::didCreateDataSource( - WebFrame* frame, WebDataSource* ds) { - ds->setExtraData(pending_extra_data_.release()); - - if (frame->parent() == 0) { - GURL url = ds->request().url(); - if (!url.is_empty()) - browser_->set_pending_url(url); - } -} - -void BrowserWebViewDelegate::didStartProvisionalLoad(WebFrame* frame) { -} - -void BrowserWebViewDelegate::didReceiveServerRedirectForProvisionalLoad( - WebFrame* frame) { -} - -void BrowserWebViewDelegate::didFailProvisionalLoad( - WebFrame* frame, const WebURLError& error) { - // error codes are defined in net\base\net_error_list.h - - // Don't display an error page if this is simply a cancelled load. Aside - // from being dumb, WebCore doesn't expect it and it will cause a crash. - if (error.reason == net::ERR_ABORTED) - return; - - const WebDataSource* failed_ds = frame->provisionalDataSource(); - BrowserExtraData* extra_data = - static_cast(failed_ds->extraData()); - - if (extra_data && !extra_data->request_committed) { - // Set the pending extra_data for our error page as the same pending_page_id - // to keep the history from getting messed up. - set_pending_extra_data(new BrowserExtraData(extra_data->pending_page_id)); - } - - std::string error_text; - CefString errorStr; - - bool handled = false; - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetLoadHandler(); - if (handler.get()) { - // give the handler an opportunity to generate a custom error message - handled = handler->OnLoadError(browser_, - browser_->UIT_GetCefFrame(frame), - static_cast(error.reason), - std::string(failed_ds->request().url().spec().data()), errorStr); - } - } - - if (handled && !errorStr.empty()) { - error_text = errorStr; - } else { - error_text = base::StringPrintf("Error %d when loading url %s", - error.reason, failed_ds->request().url().spec().data()); - } - - // Make sure we never show errors in view source mode. - frame->enableViewSourceMode(false); - - frame->loadHTMLString( - error_text, GURL("cef-error:"), error.unreachableURL, false); - - // In case loadHTMLString failed before DidCreateDataSource was called. - set_pending_extra_data(NULL); -} - -void BrowserWebViewDelegate::didCommitProvisionalLoad( - WebFrame* frame, bool is_new_navigation) { - bool is_main_frame = (frame->parent() == 0); - if (is_main_frame) { - // Clear the title so we can tell if it wasn't provided by the page. - browser_->UIT_SetTitle(std::wstring()); - } - - UpdateForCommittedLoad(frame, is_new_navigation); - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetLoadHandler(); - if (handler.get()) { - // Notify the handler that loading has started. - handler->OnLoadStart(browser_, browser_->UIT_GetCefFrame(frame)); - } - } - - // Apply zoom settings only on top-level frames. - if (is_main_frame) { - // Restore the zoom value that we have for this URL, if any. - GURL url = frame->document().url(); - double zoomLevel = 0.0; - bool didGetCustomZoom = false; - if (client.get()) { - CefRefPtr handler = client->GetZoomHandler(); - if (handler.get()) { - double newZoomLevel = zoomLevel; - didGetCustomZoom = - handler->OnGetZoomLevel(browser_, url.spec(), newZoomLevel); - if (didGetCustomZoom) - zoomLevel = newZoomLevel; - } - } - if (!didGetCustomZoom) - ZoomMap::GetInstance()->get(url, zoomLevel); - frame->view()->setZoomLevel(false, zoomLevel); - browser_->set_zoom_level(zoomLevel); - } -} - -void BrowserWebViewDelegate::didCreateScriptContext( - WebFrame* frame, v8::Handle context, int extensionGroup, - int worldId) { - CefRefPtr client = browser_->GetClient(); - if (!client.get()) - return; - - CefRefPtr handler = client->GetV8ContextHandler(); - if (!handler.get()) - return; - - v8::HandleScope handle_scope; - v8::Context::Scope scope(context); - - CefRefPtr framePtr(browser_->UIT_GetCefFrame(frame)); - CefRefPtr contextPtr(new CefV8ContextImpl(context)); - - handler->OnContextCreated(browser_, framePtr, contextPtr); -} - -void BrowserWebViewDelegate::willReleaseScriptContext( - WebFrame* frame, v8::Handle context, int worldId) { - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetV8ContextHandler(); - if (handler.get()) { - v8::HandleScope handle_scope; - v8::Context::Scope scope(context); - - CefRefPtr framePtr(browser_->UIT_GetCefFrame(frame)); - CefRefPtr contextPtr(new CefV8ContextImpl(context)); - - handler->OnContextReleased(browser_, framePtr, contextPtr); - } - } - - // Disconnect any handles still associated with the context. - CefV8ReleaseContext(context); -} - -void BrowserWebViewDelegate::didReceiveTitle( - WebFrame* frame, const WebString& title, WebTextDirection direction) { - bool is_main_frame = (frame->parent() == 0); - if (is_main_frame) { - CefString titleStr = string16(title); - browser_->UIT_SetTitle(titleStr); - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetDisplayHandler(); - if (handler.get()) { - // Notify the handler of a page title change - handler->OnTitleChange(browser_, titleStr); - } - } - } -} - -void BrowserWebViewDelegate::didChangeIcon(WebKit::WebFrame* frame, - WebKit::WebIconURL::Type iconType) { - if (iconType == WebKit::WebIconURL::TypeFavicon && frame->parent() == NULL) - OnFaviconURLChange(frame); -} - -void BrowserWebViewDelegate::didFailLoad( - WebFrame* frame, const WebURLError& error) { - LocationChangeDone(frame); -} - -void BrowserWebViewDelegate::didFinishLoad(WebFrame* frame) { - LocationChangeDone(frame); -} - -void BrowserWebViewDelegate::didNavigateWithinPage( - WebFrame* frame, bool is_new_navigation) { - frame->dataSource()->setExtraData(pending_extra_data_.release()); - UpdateForCommittedLoad(frame, is_new_navigation); -} - -void BrowserWebViewDelegate::willSendRequest( - WebFrame* frame, unsigned identifier, WebURLRequest& request, - const WebURLResponse& redirect_response) { - if (!redirect_response.isNull() && block_redirects_) { - // To block the request, we set its URL to an empty one. - request.setURL(WebURL()); - return; - } - - // The requestor ID is used by the resource loader bridge to locate the - // browser that originated the request. - request.setRequestorID(browser_->browser_id()); -} - -void BrowserWebViewDelegate::didChangeContentsSize( - WebFrame* frame, const WebSize& size) { - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetDisplayHandler(); - if (handler.get()) { - handler->OnContentsSizeChange(browser_, browser_->UIT_GetCefFrame(frame), - size.width, size.height); - } - } -} - -void BrowserWebViewDelegate::reportFindInPageMatchCount( - int request_id, int count, bool final_update) { - browser_->UIT_NotifyFindStatus(request_id, count, gfx::Rect(), - -1, // Don't update active match ordinal. - final_update); -} - -void BrowserWebViewDelegate::reportFindInPageSelection( - int request_id, int active_match_ordinal, const WebKit::WebRect& sel) { - browser_->UIT_NotifyFindStatus(request_id, -1, sel, active_match_ordinal, - false); -} - -void BrowserWebViewDelegate::openFileSystem( - WebFrame* frame, - WebKit::WebFileSystemType type, - long long size, // NOLINT(runtime/int) - bool create, - WebFileSystemCallbacks* callbacks) { - BrowserFileSystem* fileSystem = static_cast( - WebKit::webKitPlatformSupport()->fileSystem()); - fileSystem->OpenFileSystem(frame, type, size, create, callbacks); -} - -// Public methods ------------------------------------------------------------ - -BrowserWebViewDelegate::BrowserWebViewDelegate(CefBrowserImpl* browser) - : policy_delegate_enabled_(false), - policy_delegate_is_permissive_(false), - policy_delegate_should_notify_done_(false), - browser_(browser), - page_id_(-1), - last_page_id_updated_(-1), -#if defined(OS_WIN) - destroy_on_drag_end_(false), -#endif - block_redirects_(false), - cookie_jar_(browser) { -} - -BrowserWebViewDelegate::~BrowserWebViewDelegate() { -} - -void BrowserWebViewDelegate::Reset() { - // Do a little placement new dance... - CefBrowserImpl* browser = browser_; - this->~BrowserWebViewDelegate(); - new (this)BrowserWebViewDelegate(browser); // NOLINT(whitespace/parens) -} - -void BrowserWebViewDelegate::SetCustomPolicyDelegate(bool is_custom, - bool is_permissive) { - policy_delegate_enabled_ = is_custom; - policy_delegate_is_permissive_ = is_permissive; -} - -void BrowserWebViewDelegate::WaitForPolicyDelegate() { - policy_delegate_enabled_ = true; - policy_delegate_should_notify_done_ = true; -} - -// Private methods ----------------------------------------------------------- - -bool BrowserWebViewDelegate::OnKeyboardEvent( - const WebKit::WebKeyboardEvent& event, bool isAfterJavaScript) { - CefRefPtr client = browser_->GetClient(); - CefRefPtr handler; - if (client.get()) - handler = client->GetKeyboardHandler(); - if (!handler.get()) - return false; - - CefKeyboardHandler::KeyEventType eventType; - switch (event.type) { - case WebKeyboardEvent::RawKeyDown: - eventType = KEYEVENT_RAWKEYDOWN; - break; - case WebKeyboardEvent::KeyDown: - eventType = KEYEVENT_KEYDOWN; - break; - case WebKeyboardEvent::KeyUp: - eventType = KEYEVENT_KEYUP; - break; - case WebKeyboardEvent::Char: - eventType = KEYEVENT_CHAR; - break; - default: - return false; - } - - return handler->OnKeyEvent(browser_, eventType, event.windowsKeyCode, - event.modifiers, event.isSystemKey?true:false, isAfterJavaScript); -} - -void BrowserWebViewDelegate::ShowStatus(const WebString& text, - cef_handler_statustype_t type) { - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetDisplayHandler(); - if (handler.get()) { - CefString textStr = string16(text); - handler->OnStatusMessage(browser_, textStr, type); - } - } -} - -void BrowserWebViewDelegate::LocationChangeDone(WebFrame* frame) { - CefRefPtr client = browser_->GetClient(); - if (!client.get()) - return; - - bool is_main_frame = (frame->parent() == 0); - if (is_main_frame) { - CefString title = browser_->UIT_GetTitle(); - if (title.empty()) { - // No title was provided by the page, so send a blank string to the - // client. - CefRefPtr handler = client->GetDisplayHandler(); - if (handler.get()) - handler->OnTitleChange(browser_, title); - } - } - - CefRefPtr handler = client->GetLoadHandler(); - if (handler.get()) { - // Notify the handler that loading has ended. - int httpStatusCode = frame->dataSource()->response().httpStatusCode(); - handler->OnLoadEnd(browser_, browser_->UIT_GetCefFrame(frame), - httpStatusCode); - } -} - -WebWidgetHost* BrowserWebViewDelegate::GetWidgetHost() { - if (this == browser_->UIT_GetWebViewDelegate()) - return browser_->UIT_GetWebViewHost(); - if (this == browser_->UIT_GetPopupDelegate()) - return browser_->UIT_GetPopupHost(); - return NULL; -} - -void BrowserWebViewDelegate::UpdateForCommittedLoad(WebFrame* frame, - bool is_new_navigation) { - // Code duplicated from RenderView::DidCommitLoadForFrame. - BrowserExtraData* extra_data = static_cast( - frame->dataSource()->extraData()); - - if (is_new_navigation) { - // New navigation. - UpdateSessionHistory(frame); - page_id_ = next_page_id_++; - } else if (extra_data && extra_data->pending_page_id != -1 && - !extra_data->request_committed) { - // This is a successful session history navigation! - UpdateSessionHistory(frame); - page_id_ = extra_data->pending_page_id; - } - - // Don't update session history multiple times. - if (extra_data) - extra_data->request_committed = true; - - UpdateURL(frame); -} - -void BrowserWebViewDelegate::UpdateURL(WebFrame* frame) { - WebDataSource* ds = frame->dataSource(); - DCHECK(ds); - - const WebURLRequest& request = ds->request(); - BrowserNavigationController* controller = - browser_->UIT_GetNavigationController(); - - if (controller->GetEntryCount() == 0) { - // This is the first navigation for the browser. Indicate that the browser - // now has a document. - browser_->set_has_document(true); - } - - // Type is unused. - scoped_ptr entry(new BrowserNavigationEntry); - - // Bug 654101: the referrer will be empty on https->http transitions. It - // would be nice if we could get the real referrer from somewhere. - entry->SetPageID(page_id_); - if (ds->hasUnreachableURL()) { - entry->SetURL(ds->unreachableURL()); - } else { - entry->SetURL(request.url()); - } - - // Update attributes of the CefFrame if it currently exists. - browser_->UIT_UpdateCefFrame(frame); - - bool is_main_frame = (frame->parent() == 0); - CefRefPtr client = browser_->GetClient(); - - if (is_main_frame && client.get()) { - CefRefPtr handler = client->GetDisplayHandler(); - if (handler.get()) { - // Notify the handler of an address change - std::string url = std::string(entry->GetURL().spec().c_str()); - handler->OnAddressChange(browser_, browser_->UIT_GetCefFrame(frame), url); - } - } - - const WebHistoryItem& history_item = frame->currentHistoryItem(); - if (!history_item.isNull()) - entry->SetContentState(webkit_glue::HistoryItemToString(history_item)); - - bool old_can_go_back = !controller->IsAtStart(); - bool old_can_go_forward = !controller->IsAtEnd(); - controller->DidNavigateToEntry(entry.release()); - bool new_can_go_back = !controller->IsAtStart(); - bool new_can_go_forward = !controller->IsAtEnd(); - - last_page_id_updated_ = std::max(last_page_id_updated_, page_id_); - - if (old_can_go_back != new_can_go_back || - old_can_go_forward != new_can_go_forward) { - browser_->set_nav_state(new_can_go_back, new_can_go_forward); - CefRefPtr handler = client->GetDisplayHandler(); - if (handler.get()) { - // Notify the handler of a navigation state change - handler->OnNavStateChange(browser_, new_can_go_back, new_can_go_forward); - } - } -} - -void BrowserWebViewDelegate::UpdateSessionHistory(WebFrame* frame) { - // If we have a valid page ID at this point, then it corresponds to the page - // we are navigating away from. Otherwise, this is the first navigation, so - // there is no past session history to record. - if (page_id_ == -1) - return; - - BrowserNavigationEntry* entry = - browser_->UIT_GetNavigationController()->GetEntryWithPageID(page_id_); - if (!entry) - return; - - WebView* view = browser_->UIT_GetWebView(); - if (!view) - return; - - const WebHistoryItem& history_item = view->mainFrame()->previousHistoryItem(); - if (history_item.isNull()) - return; - - entry->SetContentState(webkit_glue::HistoryItemToString(history_item)); -} - -bool BrowserWebViewDelegate::OnBeforeMenu( - const WebKit::WebContextMenuData& data, int mouse_x, int mouse_y, - int& edit_flags, int& type_flags) { - // Populate the edit flags values. - edit_flags = data.editFlags; - if (browser_->UIT_CanGoBack()) - edit_flags |= MENU_CAN_GO_BACK; - if (browser_->UIT_CanGoForward()) - edit_flags |= MENU_CAN_GO_FORWARD; - - // Populate the type flags values. - type_flags = MENUTYPE_NONE; - if (!data.pageURL.isEmpty()) - type_flags |= MENUTYPE_PAGE; - if (!data.frameURL.isEmpty()) - type_flags |= MENUTYPE_FRAME; - if (!data.linkURL.isEmpty()) - type_flags |= MENUTYPE_LINK; - if (data.mediaType == WebContextMenuData::MediaTypeImage) - type_flags |= MENUTYPE_IMAGE; - if (!data.selectedText.isEmpty()) - type_flags |= MENUTYPE_SELECTION; - if (data.isEditable) - type_flags |= MENUTYPE_EDITABLE; - if (data.isSpellCheckingEnabled && !data.misspelledWord.isEmpty()) - type_flags |= MENUTYPE_MISSPELLED_WORD; - if (data.mediaType == WebContextMenuData::MediaTypeVideo) - type_flags |= MENUTYPE_VIDEO; - if (data.mediaType == WebContextMenuData::MediaTypeAudio) - type_flags |= MENUTYPE_AUDIO; - - CefRefPtr client = browser_->GetClient(); - CefRefPtr handler; - if (client.get()) - handler = client->GetMenuHandler(); - - if (handler.get()) { - // Gather menu information. - CefMenuInfo menuInfo; - - CefString linkStr(std::string(data.linkURL.spec())); - CefString imageStr(std::string(data.srcURL.spec())); - CefString pageStr(std::string(data.pageURL.spec())); - CefString frameStr(std::string(data.frameURL.spec())); - CefString selectedTextStr(string16(data.selectedText)); - CefString misspelledWordStr(string16(data.misspelledWord)); - CefString securityInfoStr(std::string(data.securityInfo)); - - menuInfo.typeFlags = type_flags; - menuInfo.x = mouse_x; - menuInfo.y = mouse_y; - cef_string_set(linkStr.c_str(), linkStr.length(), &menuInfo.linkUrl, false); - cef_string_set(imageStr.c_str(), imageStr.length(), &menuInfo.imageUrl, - false); - cef_string_set(pageStr.c_str(), pageStr.length(), &menuInfo.pageUrl, false); - cef_string_set(frameStr.c_str(), frameStr.length(), &menuInfo.frameUrl, - false); - cef_string_set(selectedTextStr.c_str(), selectedTextStr.length(), - &menuInfo.selectionText, false); - cef_string_set(misspelledWordStr.c_str(), misspelledWordStr.length(), - &menuInfo.misspelledWord, false); - menuInfo.editFlags = edit_flags; - cef_string_set(securityInfoStr.c_str(), securityInfoStr.length(), - &menuInfo.securityInfo, false); - - // Notify the handler that a context menu is requested. - if (handler->OnBeforeMenu(browser_, menuInfo)) - return true; - } - - return false; -} - -void BrowserWebViewDelegate::OnFaviconURLChange(WebKit::WebFrame* frame) { - WebVector web_icon_urls = - frame->iconURLs(WebKit::WebIconURL::TypeFavicon); - if (web_icon_urls.isEmpty()) - return; - - std::vector icon_urls; - for (size_t i = 0; i < web_icon_urls.size(); ++i) { - if (!web_icon_urls[i].iconURL().isEmpty()) { - const std::string& urlStr = web_icon_urls[i].iconURL().spec(); - icon_urls.push_back(urlStr); - } - } - if (icon_urls.empty()) - return; - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetDisplayHandler(); - if (handler.get()) - handler->OnFaviconURLChange(browser_, icon_urls); - } -} diff --git a/cef1/libcef/browser_webview_delegate.h b/cef1/libcef/browser_webview_delegate.h deleted file mode 100644 index 6a863f655..000000000 --- a/cef1/libcef/browser_webview_delegate.h +++ /dev/null @@ -1,399 +0,0 @@ -// Copyright (c) 2008-2009 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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. - -// BrowserWebViewDelegate class: -// This class implements the WebViewDelegate methods for the test shell. One -// instance is owned by each CefBrowser. - -#ifndef CEF_LIBCEF_BROWSER_WEBVIEW_DELEGATE_H_ -#define CEF_LIBCEF_BROWSER_WEBVIEW_DELEGATE_H_ -#pragma once - -#include -#include -#include - -#include "libcef/browser_navigation_controller.h" -#include "libcef/browser_webcookiejar_impl.h" - -#include "base/basictypes.h" -#include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" -#include "build/build_config.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebFileSystem.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebFileSystemType.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebContextMenuData.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserParams.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrameClient.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPermissionClient.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPrerendererClient.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebViewClient.h" -#include "webkit/glue/webcursor.h" -#include "webkit/plugins/npapi/webplugin_page_delegate.h" - -#if defined(TOOLKIT_GTK) -#include // NOLINT(build/include_order) -#endif - -#if defined(OS_MACOSX) -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenuInfo.h" -#include "libcef/external_popup_menu_mac.h" -#endif - -#if defined(OS_WIN) -class BrowserDragDelegate; -class WebDropTarget; -#endif - -#if defined(OS_LINUX) -class WebDragSource; -class WebDropTarget; -#endif - -class CefBrowserImpl; -class GURL; -class WebWidgetHost; - -namespace base { -class FilePath; -} - -class BrowserWebViewDelegate : public WebKit::WebViewClient, - public WebKit::WebFrameClient, - public WebKit::WebPermissionClient, - public WebKit::WebPrerendererClient, - public webkit::npapi::WebPluginPageDelegate, - public base::SupportsWeakPtr { - public: - // WebKit::WebViewClient - virtual WebKit::WebView* createView( - WebKit::WebFrame* creator, const WebKit::WebURLRequest& request, - const WebKit::WebWindowFeatures& features, const WebKit::WebString& name, - WebKit::WebNavigationPolicy policy) OVERRIDE; - virtual WebKit::WebWidget* createPopupMenu(WebKit::WebPopupType popup_type) - OVERRIDE; - virtual WebKit::WebExternalPopupMenu* createExternalPopupMenu( - const WebKit::WebPopupMenuInfo& info, - WebKit::WebExternalPopupMenuClient* client) OVERRIDE; - virtual void didStopLoading() OVERRIDE; - virtual WebKit::WebStorageNamespace* createSessionStorageNamespace( - unsigned quota) OVERRIDE; - virtual void didAddMessageToConsole( - const WebKit::WebConsoleMessage& message, - const WebKit::WebString& source_name, unsigned source_line) OVERRIDE; - virtual void printPage(WebKit::WebFrame* frame) OVERRIDE; - virtual bool shouldBeginEditing(const WebKit::WebRange& range) OVERRIDE; - virtual bool shouldEndEditing(const WebKit::WebRange& range) OVERRIDE; - virtual bool shouldInsertNode( - const WebKit::WebNode& node, const WebKit::WebRange& range, - WebKit::WebEditingAction action) OVERRIDE; - virtual bool shouldInsertText( - const WebKit::WebString& text, const WebKit::WebRange& range, - WebKit::WebEditingAction action) OVERRIDE; - virtual bool shouldChangeSelectedRange( - const WebKit::WebRange& from, const WebKit::WebRange& to, - WebKit::WebTextAffinity affinity, bool still_selecting) OVERRIDE; - virtual bool shouldDeleteRange(const WebKit::WebRange& range) OVERRIDE; - virtual bool shouldApplyStyle( - const WebKit::WebString& style, const WebKit::WebRange& range) OVERRIDE; - virtual bool handleCurrentKeyboardEvent() OVERRIDE; - virtual bool runFileChooser( - const WebKit::WebFileChooserParams& params, - WebKit::WebFileChooserCompletion* chooser_completion) OVERRIDE; - virtual void runModalAlertDialog( - WebKit::WebFrame* frame, const WebKit::WebString& message) OVERRIDE; - virtual bool runModalConfirmDialog( - WebKit::WebFrame* frame, const WebKit::WebString& message) OVERRIDE; - virtual bool runModalPromptDialog( - WebKit::WebFrame* frame, const WebKit::WebString& message, - const WebKit::WebString& default_value, WebKit::WebString* actual_value) - OVERRIDE; - virtual bool runModalBeforeUnloadDialog( - WebKit::WebFrame* frame, const WebKit::WebString& message) OVERRIDE; - virtual void showContextMenu( - WebKit::WebFrame* frame, const WebKit::WebContextMenuData& data) OVERRIDE; - virtual void setStatusText(const WebKit::WebString& text) OVERRIDE; - virtual void setMouseOverURL(const WebKit::WebURL& url) OVERRIDE; - virtual void setKeyboardFocusURL(const WebKit::WebURL& url) OVERRIDE; - virtual void setToolTipText( - const WebKit::WebString& text, WebKit::WebTextDirection hint) OVERRIDE; - virtual void startDragging( - WebKit::WebFrame* frame, - const WebKit::WebDragData& data, - WebKit::WebDragOperationsMask mask, - const WebKit::WebImage& image, - const WebKit::WebPoint& image_offset) OVERRIDE; - virtual bool acceptsLoadDrops() OVERRIDE; - virtual void focusNext() OVERRIDE; - virtual void focusPrevious() OVERRIDE; - virtual void focusedNodeChanged(const WebKit::WebNode& node) OVERRIDE; - virtual void navigateBackForwardSoon(int offset) OVERRIDE; - virtual int historyBackListCount() OVERRIDE; - virtual int historyForwardListCount() OVERRIDE; - virtual WebKit::WebGeolocationClient* geolocationClient() OVERRIDE; - - // WebKit::WebWidgetClient - virtual void didInvalidateRect(const WebKit::WebRect& rect) OVERRIDE; - virtual void didScrollRect(int dx, int dy, - const WebKit::WebRect& clip_rect) OVERRIDE; - virtual void scheduleAnimation() OVERRIDE; - virtual void didFocus() OVERRIDE; - virtual void didBlur() OVERRIDE; - virtual void didChangeCursor(const WebKit::WebCursorInfo& cursor) OVERRIDE; - virtual void closeWidgetSoon() OVERRIDE; - virtual void show(WebKit::WebNavigationPolicy policy) OVERRIDE; - virtual void runModal() OVERRIDE; - virtual WebKit::WebRect windowRect() OVERRIDE; - virtual void setWindowRect(const WebKit::WebRect& rect) OVERRIDE; - virtual WebKit::WebRect rootWindowRect() OVERRIDE; - virtual WebKit::WebRect windowResizerRect() OVERRIDE; - virtual WebKit::WebScreenInfo screenInfo() OVERRIDE; - - // WebKit::WebFrameClient - virtual WebKit::WebPlugin* createPlugin( - WebKit::WebFrame*, const WebKit::WebPluginParams&) OVERRIDE; - virtual WebKit::WebApplicationCacheHost* createApplicationCacheHost( - WebKit::WebFrame* frame, WebKit::WebApplicationCacheHostClient* client) - OVERRIDE; - virtual WebKit::WebCookieJar* cookieJar(WebKit::WebFrame*) OVERRIDE; - virtual void willClose(WebKit::WebFrame*) OVERRIDE; - virtual void loadURLExternally( - WebKit::WebFrame*, const WebKit::WebURLRequest&, - WebKit::WebNavigationPolicy) OVERRIDE; - virtual WebKit::WebNavigationPolicy decidePolicyForNavigation( - WebKit::WebFrame*, const WebKit::WebURLRequest&, - WebKit::WebNavigationType, const WebKit::WebNode&, - WebKit::WebNavigationPolicy default_policy, bool isRedirect) OVERRIDE; - virtual bool canHandleRequest( - WebKit::WebFrame*, const WebKit::WebURLRequest&) OVERRIDE { return true; } - virtual WebKit::WebURLError cannotHandleRequestError( - WebKit::WebFrame*, const WebKit::WebURLRequest& request) OVERRIDE; - virtual WebKit::WebURLError cancelledError( - WebKit::WebFrame*, const WebKit::WebURLRequest& request) OVERRIDE; - virtual void didCreateDataSource( - WebKit::WebFrame*, WebKit::WebDataSource*) OVERRIDE; - virtual void didStartProvisionalLoad(WebKit::WebFrame*) OVERRIDE; - virtual void didReceiveServerRedirectForProvisionalLoad(WebKit::WebFrame*) - OVERRIDE; - virtual void didFailProvisionalLoad( - WebKit::WebFrame*, const WebKit::WebURLError&) OVERRIDE; - virtual void didCommitProvisionalLoad( - WebKit::WebFrame*, bool is_new_navigation) OVERRIDE; - virtual void didCreateScriptContext( - WebKit::WebFrame*, v8::Handle, int extensionGroup, - int worldId) OVERRIDE; - virtual void willReleaseScriptContext( - WebKit::WebFrame*, v8::Handle, int worldId) OVERRIDE; - virtual void didReceiveTitle( - WebKit::WebFrame*, const WebKit::WebString& title, - WebKit::WebTextDirection direction) OVERRIDE; - virtual void didChangeIcon( - WebKit::WebFrame*, WebKit::WebIconURL::Type) OVERRIDE; - virtual void didFailLoad( - WebKit::WebFrame*, const WebKit::WebURLError&) OVERRIDE; - virtual void didFinishLoad(WebKit::WebFrame*) OVERRIDE; - virtual void didNavigateWithinPage( - WebKit::WebFrame*, bool isNewNavigation) OVERRIDE; - virtual void willSendRequest( - WebKit::WebFrame*, unsigned identifier, WebKit::WebURLRequest&, - const WebKit::WebURLResponse& redirectResponse) OVERRIDE; - virtual void didChangeContentsSize( - WebKit::WebFrame*, const WebKit::WebSize&) OVERRIDE; - virtual void reportFindInPageMatchCount( - int request_id, int count, bool final_update) OVERRIDE; - virtual void reportFindInPageSelection( - int request_id, int active_match_ordinal, const WebKit::WebRect& sel) - OVERRIDE; - virtual void openFileSystem( - WebKit::WebFrame* frame, - WebKit::WebFileSystemType type, - long long size, // NOLINT(runtime/int) - bool create, - WebKit::WebFileSystemCallbacks* callbacks) OVERRIDE; - - // WebKit::WebPermissionClient - virtual bool allowScriptExtension( - WebKit::WebFrame*, - const WebKit::WebString& extensionName, - int extensionGroup) OVERRIDE; - - // WebKit::WebPrerendererClient - virtual void willAddPrerender(WebKit::WebPrerender* prerender) OVERRIDE; - - // webkit_glue::WebPluginPageDelegate - virtual webkit::npapi::WebPluginDelegate* CreatePluginDelegate( - const base::FilePath& file_path, - const std::string& mime_type) OVERRIDE; - virtual WebKit::WebPlugin* CreatePluginReplacement( - const base::FilePath& file_path) OVERRIDE; - virtual void CreatedPluginWindow( - gfx::PluginWindowHandle handle) OVERRIDE; - virtual void WillDestroyPluginWindow( - gfx::PluginWindowHandle handle) OVERRIDE; - virtual void DidMovePlugin( - const webkit::npapi::WebPluginGeometry& move) OVERRIDE; - virtual void DidStartLoadingForPlugin() OVERRIDE {} - virtual void DidStopLoadingForPlugin() OVERRIDE {} - virtual WebKit::WebCookieJar* GetCookieJar() OVERRIDE; - - explicit BrowserWebViewDelegate(CefBrowserImpl* browser); - virtual ~BrowserWebViewDelegate(); - void Reset(); - - // Additional accessors -#if defined(OS_WIN) || defined(OS_LINUX) - // Sets the webview as a drop target. - void RegisterDragDrop(); -#endif -#if defined(OS_WIN) - void RevokeDragDrop(); - - // Called after dragging has finished. - void EndDragging(); - - BrowserDragDelegate* drag_delegate() { return drag_delegate_.get(); } - WebDropTarget* drop_target() { return drop_target_.get(); } - - void set_destroy_on_drag_end(bool val) { destroy_on_drag_end_ = val; } -#endif // defined(OS_WIN) - - void set_pending_extra_data(BrowserExtraData* extra_data) { - pending_extra_data_.reset(extra_data); - } - - void SetCustomPolicyDelegate(bool is_custom, bool is_permissive); - void WaitForPolicyDelegate(); - - void set_block_redirects(bool block_redirects) { - block_redirects_ = block_redirects; - } - bool block_redirects() const { - return block_redirects_; - } - - void SetEditCommand(const std::string& name, const std::string& value) { - edit_command_name_ = name; - edit_command_value_ = value; - } - - void ClearEditCommand() { - edit_command_name_.clear(); - edit_command_value_.clear(); - } - - CefBrowserImpl* GetBrowser() { return browser_; } - -#if defined(OS_MACOSX) - // Called after the external popup menu has been dismissed. - void ClosePopupMenu(); -#endif - -#ifdef OS_LINUX - void HandleContextMenu(int selected_id); -#endif - - bool OnKeyboardEvent(const WebKit::WebKeyboardEvent& event, - bool isAfterJavaScript); - - protected: - // Default handling of JavaScript messages. - void ShowJavaScriptAlert(WebKit::WebFrame* webframe, - const CefString& message); - bool ShowJavaScriptConfirm(WebKit::WebFrame* webframe, - const CefString& message); - bool ShowJavaScriptPrompt(WebKit::WebFrame* webframe, - const CefString& message, - const CefString& default_value, - CefString* result); - - // Called to show the file chooser dialog. - bool ShowFileChooser(std::vector& file_names, - bool multi_select, - const WebKit::WebString& title, - const base::FilePath& default_file, - const std::vector& accept_mime_types); - - // Called to show status messages. - void ShowStatus(const WebKit::WebString& text, cef_handler_statustype_t type); - - // In the Mac code, this is called to trigger the end of a test after the - // page has finished loading. From here, we can generate the dump for the - // test. - void LocationChangeDone(WebKit::WebFrame*); - - WebWidgetHost* GetWidgetHost(); - - void UpdateForCommittedLoad(WebKit::WebFrame* webframe, - bool is_new_navigation); - void UpdateURL(WebKit::WebFrame* frame); - void UpdateSessionHistory(WebKit::WebFrame* frame); - - bool OnBeforeMenu(const WebKit::WebContextMenuData& data, - int mouse_x, - int mouse_y, - int& edit_flags, - int& type_flags); - void OnFaviconURLChange(WebKit::WebFrame* frame); - - private: - // Causes navigation actions just printout the intended navigation instead - // of taking you to the page. This is used for cases like mailto, where you - // don't actually want to open the mail program. - bool policy_delegate_enabled_; - - // Toggles the behavior of the policy delegate. If true, then navigations - // will be allowed. Otherwise, they will be ignored (dropped). - bool policy_delegate_is_permissive_; - - // If true, the policy delegate will signal layout test completion. - bool policy_delegate_should_notify_done_; - - // Non-owning pointer. The delegate is owned by the host. - CefBrowserImpl* browser_; - - // For tracking session history. See RenderView. - int page_id_; - int last_page_id_updated_; - - scoped_ptr pending_extra_data_; - - WebCursor current_cursor_; -#if defined(OS_WIN) - // Classes needed by drag and drop. - scoped_refptr drag_delegate_; - bool destroy_on_drag_end_; -#endif -#if defined(OS_WIN) || defined(OS_LINUX) - scoped_refptr drop_target_; -#endif - -#if defined(OS_LINUX) - // The type of cursor the window is currently using. - // Used for judging whether a new SetCursor call is actually changing the - // cursor. - GdkCursorType cursor_type_; - scoped_refptr drag_source_; -#endif - -#if defined(OS_MACOSX) - // The external popup menu for the currently showing select popup. - scoped_ptr external_popup_menu_; -#endif - - // true if we should block any redirects - bool block_redirects_; - - // Edit command associated to the current keyboard event. - std::string edit_command_name_; - std::string edit_command_value_; - - BrowserWebCookieJarImpl cookie_jar_; - - DISALLOW_COPY_AND_ASSIGN(BrowserWebViewDelegate); -}; - -#endif // CEF_LIBCEF_BROWSER_WEBVIEW_DELEGATE_H_ diff --git a/cef1/libcef/browser_webview_delegate_gtk.cc b/cef1/libcef/browser_webview_delegate_gtk.cc deleted file mode 100644 index 411a43365..000000000 --- a/cef1/libcef/browser_webview_delegate_gtk.cc +++ /dev/null @@ -1,573 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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 "libcef/browser_webview_delegate.h" -#include "libcef/browser_impl.h" -#include "libcef/drag_data_impl.h" -#include "libcef/web_drop_target_gtk.h" -#include "libcef/web_drag_source_gtk.h" - -#include "base/message_loop.h" -#include "base/string_util.h" -#include "net/base/net_errors.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebDragData.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebImage.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebPoint.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebContextMenuData.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenu.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/base/window_open_disposition.h" -#include "ui/gfx/native_widget_types.h" -#include "ui/gfx/gtk_util.h" -#include "ui/gfx/point.h" -#include "webkit/glue/webdropdata.h" -#include "webkit/glue/webpreferences.h" -#include "webkit/glue/webkit_glue.h" -#include "webkit/plugins/npapi/plugin_list.h" -#include "webkit/plugins/npapi/webplugin.h" -#include "webkit/plugins/npapi/webplugin_delegate_impl.h" - -#include // NOLINT(build/include_order) -#include // NOLINT(build/include_order) - - -using webkit::npapi::WebPluginDelegateImpl; -using WebKit::WebContextMenuData; -using WebKit::WebCursorInfo; -using WebKit::WebDragData; -using WebKit::WebDragOperationsMask; -using WebKit::WebExternalPopupMenu; -using WebKit::WebExternalPopupMenuClient; -using WebKit::WebFrame; -using WebKit::WebImage; -using WebKit::WebNavigationPolicy; -using WebKit::WebPoint; -using WebKit::WebPopupMenuInfo; -using WebKit::WebRect; -using WebKit::WebWidget; -using WebKit::WebView; - -namespace { - -enum SelectionClipboardType { - TEXT_HTML, - PLAIN_TEXT, -}; - -GdkAtom GetTextHtmlAtom() { - GdkAtom kTextHtmlGdkAtom = gdk_atom_intern_static_string("text/html"); - return kTextHtmlGdkAtom; -} - -void SelectionClipboardGetContents(GtkClipboard* clipboard, - GtkSelectionData* selection_data, guint info, gpointer data) { - // Ignore formats that we don't know about. - if (info != TEXT_HTML && info != PLAIN_TEXT) - return; - - WebView* webview = static_cast(data); - WebFrame* frame = webview->focusedFrame(); - if (!frame) - frame = webview->mainFrame(); - DCHECK(frame); - - std::string selection; - if (TEXT_HTML == info) - selection = frame->selectionAsMarkup().utf8(); - else - selection = frame->selectionAsText().utf8(); - - if (TEXT_HTML == info) { - gtk_selection_data_set(selection_data, - GetTextHtmlAtom(), - 8 /* bits per data unit, ie, char */, - reinterpret_cast(selection.data()), - selection.length()); - } else { - gtk_selection_data_set_text(selection_data, selection.data(), - selection.length()); - } -} - -void ShowJSAlertDialog(GtkWidget* window, - const gchar* title, - const gchar* message) { - // Create the widgets. - GtkWidget* dialog = gtk_dialog_new_with_buttons( - title, - GTK_WINDOW(window), - GtkDialogFlags(GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL), - GTK_STOCK_OK, - GTK_RESPONSE_NONE, - NULL); - GtkWidget* content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - GtkWidget* label = gtk_label_new(message); - - // Add the label and show everything we've added to the dialog. - gtk_container_add(GTK_CONTAINER(content_area), label); - - gtk_widget_show_all(dialog); - - gtk_dialog_run(GTK_DIALOG(dialog)); - - gtk_widget_destroy(dialog); -} - -bool ShowJSConfirmDialog(GtkWidget* window, - const gchar* title, - const gchar* message) { - // Create the widgets. - GtkWidget* dialog = gtk_dialog_new_with_buttons( - title, - GTK_WINDOW(window), - GtkDialogFlags(GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL), - GTK_STOCK_NO, - GTK_RESPONSE_NO, - GTK_STOCK_YES, - GTK_RESPONSE_YES, - NULL); - GtkWidget* content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - GtkWidget* label = gtk_label_new(message); - - // Add the label and show everything we've added to the dialog. - gtk_container_add(GTK_CONTAINER(content_area), label); - gtk_widget_show_all(dialog); - - gint result = gtk_dialog_run(GTK_DIALOG(dialog)); - - gtk_widget_destroy(dialog); - - return (result == GTK_RESPONSE_YES); -} - -bool ShowJSPromptDialog(GtkWidget* window, - const gchar* title, - const gchar* message, - const gchar* default_val, - std::string* return_val) { - // Create the widgets. - GtkWidget* dialog = gtk_dialog_new_with_buttons( - title, - GTK_WINDOW(window), - GtkDialogFlags(GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL), - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, - GTK_RESPONSE_OK, - NULL); - GtkWidget* content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - GtkWidget* label = gtk_label_new(message); - GtkWidget* entry = gtk_entry_new(); - gtk_entry_set_text(GTK_ENTRY(entry), default_val); - - // Add the label and entry and show everything we've added to the dialog. - gtk_container_add(GTK_CONTAINER(content_area), label); - gtk_container_add(GTK_CONTAINER(content_area), entry); - gtk_widget_show_all(dialog); - - gint result = gtk_dialog_run(GTK_DIALOG(dialog)); - if (result == GTK_RESPONSE_OK) - *return_val = std::string(gtk_entry_get_text(GTK_ENTRY(entry))); - - gtk_widget_destroy(dialog); - - return (result == GTK_RESPONSE_OK); -} - -bool ShowJSFileChooser(GtkWidget* window, base::FilePath* path) { - // Create the widgets. - GtkWidget* dialog = gtk_file_chooser_dialog_new( - "Open File", - GTK_WINDOW(window), - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - NULL); - - gtk_widget_show_all(dialog); - - int result = gtk_dialog_run(GTK_DIALOG(dialog)); - if (result == GTK_RESPONSE_ACCEPT) { - *path = base::FilePath(gtk_file_chooser_get_filename( - GTK_FILE_CHOOSER(dialog))); - } - - gtk_widget_destroy(dialog); - - return (result == GTK_RESPONSE_ACCEPT); -} - -std::string GetDialogLabel(WebKit::WebFrame* webframe, - const std::string& label) { - const GURL& url = webframe->document().url(); - std::string urlStr; - if (!url.is_empty()) - urlStr = url.host(); - std::string labelStr = label; - if (!urlStr.empty()) - labelStr += " - " + urlStr; - return labelStr; -} - -} // namespace - -// WebViewClient --------------------------------------------------------------- - -WebKit::WebExternalPopupMenu* BrowserWebViewDelegate::createExternalPopupMenu( - const WebKit::WebPopupMenuInfo& info, - WebKit::WebExternalPopupMenuClient* client) { - NOTIMPLEMENTED(); - return NULL; -} - -static gboolean MenuItemHandle(GtkWidget* menu_item, gpointer data) { - if (!data) - return FALSE; - - BrowserWebViewDelegate* webViewDelegate = - reinterpret_cast(data); - int id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_item), "menu_id")); - - webViewDelegate->HandleContextMenu(id); - - return FALSE; -} - -static GtkWidget* MenuItemCreate(GtkWidget* parent_menu, const char* name, - int id, bool is_enabled, BrowserWebViewDelegate* webViewDelegate) { - GtkWidget* menu_item = gtk_menu_item_new_with_label(name); - - g_object_set_data(G_OBJECT(menu_item), "menu_id", - reinterpret_cast(id)); - g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(MenuItemHandle), - (gpointer)webViewDelegate); - gtk_menu_shell_append(GTK_MENU_SHELL(parent_menu), menu_item); - gtk_widget_set_sensitive(menu_item, is_enabled); - - gtk_widget_show(menu_item); - - return menu_item; -} - -static GtkWidget* MenuItemCreateSeperator(GtkWidget* parent_menu) { - GtkWidget* menu_item = gtk_menu_item_new(); - - gtk_menu_shell_append(GTK_MENU_SHELL(parent_menu), menu_item); - gtk_widget_show(menu_item); - - return menu_item; -} - -void BrowserWebViewDelegate::showContextMenu(WebKit::WebFrame* frame, - const WebKit::WebContextMenuData& data) { - GtkWidget* menu = NULL; - GdkPoint mouse_pt = { data.mousePosition.x, data.mousePosition.y }; - - int edit_flags = 0; - int type_flags = 0; - - // Make sure events can be pumped while the menu is up. - base::MessageLoop::ScopedNestableTaskAllower allow( - base::MessageLoop::current()); - - // Give the client a chance to handle the menu. - if (OnBeforeMenu(data, mouse_pt.x, mouse_pt.y, edit_flags, type_flags)) - return; - - CefRefPtr client = browser_->GetClient(); - CefRefPtr handler; - if (client.get()) - handler = client->GetMenuHandler(); - - // Build the correct default context menu - if (type_flags & MENUTYPE_EDITABLE) { - menu = gtk_menu_new(); - MenuItemCreate(menu, "Undo", MENU_ID_UNDO, - !!(edit_flags & MENU_CAN_UNDO), this); - MenuItemCreate(menu, "Redo", MENU_ID_REDO, - !!(edit_flags & MENU_CAN_REDO), this); - MenuItemCreate(menu, "Cut", MENU_ID_CUT, - !!(edit_flags & MENU_CAN_CUT), this); - MenuItemCreate(menu, "Copy", MENU_ID_COPY, - !!(edit_flags & MENU_CAN_COPY), this); - MenuItemCreate(menu, "Paste", MENU_ID_PASTE, - !!(edit_flags & MENU_CAN_PASTE), this); - MenuItemCreate(menu, "Delete", MENU_ID_DELETE, - !!(edit_flags & MENU_CAN_DELETE), this); - MenuItemCreateSeperator(menu); - MenuItemCreate(menu, "Select All", MENU_ID_SELECTALL, - !!(edit_flags & MENU_CAN_SELECT_ALL), this); - } else if (type_flags & MENUTYPE_SELECTION) { - menu = gtk_menu_new(); - MenuItemCreate(menu, "Copy", MENU_ID_COPY, - !!(edit_flags & MENU_CAN_COPY), this); - } else if (type_flags & (MENUTYPE_PAGE | MENUTYPE_FRAME)) { - menu = gtk_menu_new(); - MenuItemCreate(menu, "Back", MENU_ID_NAV_BACK, - !!(edit_flags & MENU_CAN_GO_BACK), this); - MenuItemCreate(menu, "Forward", MENU_ID_NAV_FORWARD, - !!(edit_flags & MENU_CAN_GO_FORWARD), this); - MenuItemCreateSeperator(menu); - // TODO(port): Enable the print item when supported. - // MenuItemCreate(menu, "Print", MENU_ID_PRINT, true, this); - MenuItemCreate(menu, "View Source", MENU_ID_VIEWSOURCE, true, this); - } - - if (menu) { - gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, - gtk_get_current_event_time()); - } -} - -// WebWidgetClient ------------------------------------------------------------ - -void BrowserWebViewDelegate::show(WebNavigationPolicy policy) { - WebWidgetHost* host = GetWidgetHost(); - GtkWidget* drawing_area = host->view_handle(); - GtkWidget* window = - gtk_widget_get_parent(gtk_widget_get_parent(drawing_area)); - gtk_widget_show_all(window); -} - -void BrowserWebViewDelegate::didChangeCursor(const WebCursorInfo& cursor_info) { - current_cursor_.InitFromCursorInfo(cursor_info); - GdkCursorType cursor_type = - static_cast(current_cursor_.GetCursorType()); - GdkCursor* gdk_cursor; - if (cursor_type == GDK_CURSOR_IS_PIXMAP) { - // TODO(port): WebKit bug https://bugs.webkit.org/show_bug.cgi?id=16388 is - // that calling gdk_window_set_cursor repeatedly is expensive. We should - // avoid it here where possible. - gdk_cursor = current_cursor_.GetCustomCursor(); - } else { - // Optimize the common case, where the cursor hasn't changed. - // However, we can switch between different pixmaps, so only on the - // non-pixmap branch. - if (cursor_type_ == cursor_type) - return; - if (cursor_type == GDK_LAST_CURSOR) - gdk_cursor = NULL; - else - gdk_cursor = gfx::GetCursor(cursor_type); - } - cursor_type_ = cursor_type; - gdk_window_set_cursor(browser_->UIT_GetWebViewWndHandle()->window, - gdk_cursor); -} - -WebRect BrowserWebViewDelegate::windowRect() { - WebWidgetHost* host = GetWidgetHost(); - GtkWidget* drawing_area = host->view_handle(); - GtkWidget* vbox = gtk_widget_get_parent(drawing_area); - GtkWidget* window = gtk_widget_get_parent(vbox); - - gint x, y; - gtk_window_get_position(GTK_WINDOW(window), &x, &y); - x += vbox->allocation.x + drawing_area->allocation.x; - y += vbox->allocation.y + drawing_area->allocation.y; - - return WebRect(x, y, - drawing_area->allocation.width, - drawing_area->allocation.height); -} - -void BrowserWebViewDelegate::setWindowRect(const WebRect& rect) { - if (this == browser_->UIT_GetWebViewDelegate()) { - // TODO(port): Set the window rectangle. - } else if (this == browser_->UIT_GetPopupDelegate()) { - WebWidgetHost* host = GetWidgetHost(); - GtkWidget* drawing_area = host->view_handle(); - GtkWidget* window = - gtk_widget_get_parent(gtk_widget_get_parent(drawing_area)); - gtk_window_resize(GTK_WINDOW(window), rect.width, rect.height); - gtk_window_move(GTK_WINDOW(window), rect.x, rect.y); - } -} - -WebRect BrowserWebViewDelegate::rootWindowRect() { - if (WebWidgetHost* host = GetWidgetHost()) { - // We are being asked for the x/y and width/height of the entire browser - // window. This means the x/y is the distance from the corner of the - // screen, and the width/height is the size of the entire browser window. - // For example, this is used to implement window.screenX and window.screenY. - GtkWidget* window = gtk_widget_get_ancestor(GTK_WIDGET(host->view_handle()), - GTK_TYPE_WINDOW); - - gint x, y, width, height; - gtk_window_get_position(GTK_WINDOW(window), &x, &y); - gtk_window_get_size(GTK_WINDOW(window), &width, &height); - return WebRect(x, y, width, height); - } - return WebRect(); -} - -WebRect BrowserWebViewDelegate::windowResizerRect() { - // Not necessary on Linux. - return WebRect(); -} - -void BrowserWebViewDelegate::startDragging( - WebFrame* frame, - const WebDragData& data, - WebDragOperationsMask mask, - const WebImage& image, - const WebPoint& image_offset) { - if (browser_->settings().drag_drop_disabled) { - browser_->UIT_GetWebView()->dragSourceSystemDragEnded(); - return; - } - - WebDropData drop_data(data); - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetDragHandler(); - if (handler.get()) { - CefRefPtr data(new CefDragDataImpl(drop_data)); - if (handler->OnDragStart(browser_, data, - static_cast(mask))) { - browser_->UIT_GetWebView()->dragSourceSystemDragEnded(); - return; - } - } - } - drag_source_ = new WebDragSource(browser_); - DCHECK(browser_->last_mouse_down()); - drag_source_->StartDragging(drop_data, mask, browser_->last_mouse_down(), - image.getSkBitmap(), - gfx::Vector2d(image_offset.x, image_offset.y)); -} - -void BrowserWebViewDelegate::runModal() { - NOTIMPLEMENTED(); -} - -// WebPluginPageDelegate ------------------------------------------------------ - -webkit::npapi::WebPluginDelegate* BrowserWebViewDelegate::CreatePluginDelegate( - const base::FilePath& path, - const std::string& mime_type) { - return webkit::npapi::WebPluginDelegateImpl::Create(path, mime_type); -} - -void BrowserWebViewDelegate::CreatedPluginWindow( - gfx::PluginWindowHandle id) { - browser_->UIT_GetWebViewHost()->CreatePluginContainer(id); -} - -void BrowserWebViewDelegate::WillDestroyPluginWindow( - gfx::PluginWindowHandle id) { - browser_->UIT_GetWebViewHost()->DestroyPluginContainer(id); -} - -void BrowserWebViewDelegate::DidMovePlugin( - const webkit::npapi::WebPluginGeometry& move) { - WebWidgetHost* host = GetWidgetHost(); - webkit::npapi::GtkPluginContainerManager* plugin_container_manager = - static_cast(host)->plugin_container_manager(); - plugin_container_manager->MovePluginContainer(move); -} - -void BrowserWebViewDelegate::HandleContextMenu(int selected_id) { - if (selected_id != 0) { - CefRefPtr client = browser_->GetClient(); - CefRefPtr handler; - if (client.get()) - handler = client->GetMenuHandler(); - - // An action was chosen - cef_menu_id_t menuId = static_cast(selected_id); - bool handled = false; - if (handler.get()) { - // Ask the handler if it wants to handle the action - handled = handler->OnMenuAction(browser_, menuId); - } - - if (!handled) { - // Execute the action - browser_->UIT_HandleAction(menuId, browser_->GetFocusedFrame()); - } - } -} - -// Private methods ------------------------------------------------------------ - -void BrowserWebViewDelegate::RegisterDragDrop() { - DCHECK(!drop_target_); - drop_target_ = new WebDropTarget(browser_); -} - -// Protected methods ---------------------------------------------------------- - -void BrowserWebViewDelegate::ShowJavaScriptAlert( - WebKit::WebFrame* webframe, const CefString& message) { - std::string messageStr(message); - std::string labelStr(GetDialogLabel(webframe, "JavaScript Alert")); - - gfx::NativeView view = browser_->UIT_GetMainWndHandle(); - GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(view)); - - ShowJSAlertDialog(window, - static_cast(labelStr.c_str()), - static_cast(messageStr.c_str())); -} - -bool BrowserWebViewDelegate::ShowJavaScriptConfirm( - WebKit::WebFrame* webframe, const CefString& message) { - std::string messageStr(message); - std::string labelStr(GetDialogLabel(webframe, "JavaScript Confirm")); - - gfx::NativeView view = browser_->UIT_GetMainWndHandle(); - GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(view)); - - return ShowJSConfirmDialog( - window, - static_cast(labelStr.c_str()), - static_cast(messageStr.c_str())); -} - -bool BrowserWebViewDelegate::ShowJavaScriptPrompt( - WebKit::WebFrame* webframe, const CefString& message, - const CefString& default_value, CefString* result) { - std::string messageStr(message); - std::string defaultStr(default_value); - std::string labelStr(GetDialogLabel(webframe, "JavaScript Prompt")); - - gfx::NativeView view = browser_->UIT_GetMainWndHandle(); - GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(view)); - - std::string return_val; - bool resp = ShowJSPromptDialog( - window, - static_cast(labelStr.c_str()), - static_cast(messageStr.c_str()), - static_cast(defaultStr.c_str()), - &return_val); - if (resp) - *result = return_val; - - return resp; -} - -bool BrowserWebViewDelegate::ShowFileChooser( - std::vector& file_names, - bool multi_select, - const WebKit::WebString& title, - const base::FilePath& default_file, - const std::vector& accept_mime_types) { - gfx::NativeView view = browser_->UIT_GetMainWndHandle(); - GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(view)); - - base::FilePath file_name; - bool resp = ShowJSFileChooser(window, &file_name); - if (resp) - file_names.push_back(file_name); - - return resp; -} diff --git a/cef1/libcef/browser_webview_delegate_mac.mm b/cef1/libcef/browser_webview_delegate_mac.mm deleted file mode 100644 index 621be697c..000000000 --- a/cef1/libcef/browser_webview_delegate_mac.mm +++ /dev/null @@ -1,610 +0,0 @@ -// Copyright (c) 2008 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 "libcef/browser_webview_delegate.h" -#import "libcef/browser_webview_mac.h" -#include "libcef/browser_impl.h" -#include "libcef/drag_data_impl.h" -#import "include/cef_application_mac.h" - -#import - -#include "base/file_util.h" -#include "base/mac/mac_util.h" -#include "base/strings/sys_string_conversions.h" -#include "base/utf_string_conversions.h" -#include "base/threading/thread_restrictions.h" -#include "skia/ext/skia_utils_mac.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebDragData.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebImage.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebPoint.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebContextMenuData.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenu.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/base/layout.h" -#include "ui/gfx/image/image_skia.h" -#include "ui/gfx/image/image_skia_util_mac.h" -#include "webkit/glue/webcursor.h" -#include "webkit/glue/webdropdata.h" -#include "webkit/plugins/npapi/plugin_list.h" -#include "webkit/plugins/npapi/webplugin_delegate_impl.h" -#include "webkit/glue/webmenurunner_mac.h" - -using webkit::npapi::WebPluginDelegateImpl; -using WebKit::WebContextMenuData; -using WebKit::WebCursorInfo; -using WebKit::WebDragData; -using WebKit::WebDragOperationsMask; -using WebKit::WebExternalPopupMenu; -using WebKit::WebExternalPopupMenuClient; -using WebKit::WebImage; -using WebKit::WebNavigationPolicy; -using WebKit::WebPoint; -using WebKit::WebPopupMenuInfo; -using WebKit::WebRect; -using WebKit::WebWidget; - - -namespace { - -void AddMenuItem(CefRefPtr browser, - CefRefPtr handler, - NSMenu* menu, - id target, - cef_menu_id_t menuId, - const std::string& label, - bool enabled) { - std::string disp_str; - if (handler.get()) { - // Let the handler change the label if desired. - CefString actual_label(label); - handler->GetMenuLabel(browser, menuId, actual_label); - disp_str = actual_label; - } else { - disp_str = label; - } - - NSString* str = base::SysUTF8ToNSString(disp_str); - NSMenuItem* item = - [[[NSMenuItem alloc] initWithTitle:str - action:enabled?@selector(menuItemSelected:):nil - keyEquivalent:@""] autorelease]; - [item setTarget:target]; - [item setTag:menuId]; - [menu addItem:item]; -} - -void AddMenuSeparator(NSMenu* menu) { - NSMenuItem* item = [NSMenuItem separatorItem]; - [menu addItem:item]; -} - -NSString* GetDialogLabel(WebKit::WebFrame* webframe, const std::string& label) { - const GURL& url = webframe->document().url(); - std::string urlStr; - if (!url.is_empty()) - urlStr = url.host(); - string16 labelStr = ASCIIToUTF16(label); - if (!urlStr.empty()) - labelStr += ASCIIToUTF16(" - " + urlStr); - return base::SysUTF16ToNSString(labelStr); -} - -} // namespace - -@interface BrowserMenuDelegate : NSObject { - @private - CefRefPtr browser_; -} - -- (id)initWithBrowser:(CefBrowserImpl*)browser; -- (void)menuItemSelected:(id)sender; -@end - -@implementation BrowserMenuDelegate - -- (id)initWithBrowser:(CefBrowserImpl*)browser { - self = [super init]; - if (self) - browser_ = browser; - return self; - -} - -// Called when a context menu item is selected by the user. -- (void)menuItemSelected:(id)sender { - cef_menu_id_t menuId = static_cast([sender tag]); - bool handled = false; - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetMenuHandler(); - if (handler.get()) { - // Ask the handler if it wants to handle the action. - handled = handler->OnMenuAction(browser_.get(), menuId); - } - } - - if(!handled) { - // Execute the action. - browser_->UIT_HandleAction(menuId, browser_->GetFocusedFrame()); - } -} - -@end - -// WebViewClient -------------------------------------------------------------- - -WebExternalPopupMenu* BrowserWebViewDelegate::createExternalPopupMenu( - const WebPopupMenuInfo& info, - WebExternalPopupMenuClient* client) { - DCHECK(!external_popup_menu_.get()); - external_popup_menu_.reset(new ExternalPopupMenu(this, info, client)); - return external_popup_menu_.get(); -} - -void BrowserWebViewDelegate::ClosePopupMenu() { - if (external_popup_menu_ == NULL) { - NOTREACHED(); - return; - } - external_popup_menu_.reset(); -} - -void BrowserWebViewDelegate::showContextMenu( - WebKit::WebFrame* frame, const WebKit::WebContextMenuData& data) { - WebWidgetHost* host = GetWidgetHost(); - if (!host) - return; - - NSView *view = browser_->UIT_GetMainWndHandle(); - if (!view) - return; - - NSWindow* window = [view window]; - - int screenX = -1; - int screenY = -1; - NSPoint mouse_pt = {data.mousePosition.x, data.mousePosition.y}; - if (!browser_->IsWindowRenderingDisabled()) { - mouse_pt = [window mouseLocationOutsideOfEventStream]; - NSPoint screen_pt = [window convertBaseToScreen:mouse_pt]; - screenX = screen_pt.x; - screenY = screen_pt.y; - } - - int edit_flags = 0; - int type_flags = 0; - NSMenu* menu = nil; - - // Make sure events can be pumped while the menu is up. - base::MessageLoop::ScopedNestableTaskAllower allow - base::MessageLoop::current()); - - // Give the client a chance to handle the menu. - if (OnBeforeMenu(data, mouse_pt.x, mouse_pt.y, edit_flags, type_flags)) - return; - - CefRefPtr client = browser_->GetClient(); - CefRefPtr handler; - if (client.get()) - handler = client->GetMenuHandler(); - - if (client.get() && browser_->IsWindowRenderingDisabled()) { - // Retrieve the screen coordinates. - CefRefPtr render_handler = client->GetRenderHandler(); - if (!render_handler.get() || - !render_handler->GetScreenPoint(browser_, mouse_pt.x, mouse_pt.y, - screenX, screenY)) { - return; - } - } - - BrowserMenuDelegate* delegate = - [[[BrowserMenuDelegate alloc] initWithBrowser:browser_] autorelease]; - - // Build the correct default context menu - if (type_flags & MENUTYPE_EDITABLE) { - menu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - AddMenuItem(browser_, handler, menu, delegate, MENU_ID_UNDO, "Undo", - !!(edit_flags & MENU_CAN_UNDO)); - AddMenuItem(browser_, handler, menu, delegate, MENU_ID_REDO, "Redo", - !!(edit_flags & MENU_CAN_REDO)); - AddMenuSeparator(menu); - AddMenuItem(browser_, handler, menu, delegate, MENU_ID_CUT, "Cut", - !!(edit_flags & MENU_CAN_CUT)); - AddMenuItem(browser_, handler, menu, delegate, MENU_ID_COPY, "Copy", - !!(edit_flags & MENU_CAN_COPY)); - AddMenuItem(browser_, handler, menu, delegate, MENU_ID_PASTE, "Paste", - !!(edit_flags & MENU_CAN_PASTE)); - AddMenuItem(browser_, handler, menu, delegate, MENU_ID_DELETE, "Delete", - !!(edit_flags & MENU_CAN_DELETE)); - AddMenuSeparator(menu); - AddMenuItem(browser_, handler, menu, delegate, MENU_ID_SELECTALL, - "Select All", !!(edit_flags & MENU_CAN_SELECT_ALL)); - } else if(type_flags & MENUTYPE_SELECTION) { - menu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - AddMenuItem(browser_, handler, menu, delegate, MENU_ID_COPY, "Copy", - !!(edit_flags & MENU_CAN_COPY)); - } else if(type_flags & (MENUTYPE_PAGE | MENUTYPE_FRAME)) { - menu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - AddMenuItem(browser_, handler, menu, delegate, MENU_ID_NAV_BACK, "Back", - !!(edit_flags & MENU_CAN_GO_BACK)); - AddMenuItem(browser_, handler, menu, delegate, MENU_ID_NAV_FORWARD, - "Forward", !!(edit_flags & MENU_CAN_GO_FORWARD)); - // TODO(port): Enable the below menu items when supported. - //AddMenuSeparator(menu); - //AddMenuItem(browser_, handler, menu, delegate, MENU_ID_PRINT, "Print", - // true); - //AddMenuItem(browser_, handler, menu, delegate, MENU_ID_VIEWSOURCE, - // "View Source", true); - } - - if (!menu) - return; - - // Synthesize an event for the click, as there is no certainty that - // [NSApp currentEvent] will return a valid event. - NSPoint screen_pt = {screenX, screenY}; - NSPoint window_pt = [window convertScreenToBase:screen_pt]; - - NSEvent* currentEvent = [NSApp currentEvent]; - NSTimeInterval eventTime = [currentEvent timestamp]; - NSEvent* clickEvent = [NSEvent mouseEventWithType:NSRightMouseDown - location:window_pt - modifierFlags:NSRightMouseDownMask - timestamp:eventTime - windowNumber:[window windowNumber] - context:nil - eventNumber:0 - clickCount:1 - pressure:1.0]; - - - // Menu selection events go to the BrowserMenuDelegate. - [menu setDelegate:delegate]; - - // Show the menu. - [NSMenu popUpContextMenu:menu - withEvent:clickEvent - forView:view]; -} - -// WebWidgetClient ------------------------------------------------------------ - -void BrowserWebViewDelegate::show(WebNavigationPolicy policy) { - DCHECK(this != browser_->UIT_GetPopupDelegate()); -} - -void BrowserWebViewDelegate::didChangeCursor(const WebCursorInfo& cursor_info) { - NSCursor* ns_cursor = WebCursor(cursor_info).GetNativeCursor(); - - if (!browser_->IsWindowRenderingDisabled()) { - [ns_cursor set]; - } else { - // Notify the handler of cursor change. - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetRenderHandler(); - if (handler.get()) - handler->OnCursorChange(browser_, ns_cursor); - } - } -} - -WebRect BrowserWebViewDelegate::windowRect() { - if (WebWidgetHost* host = GetWidgetHost()) { - if (!browser_->IsWindowRenderingDisabled()) { - NSView *view = host->view_handle(); - NSRect rect = [view frame]; - return gfx::Rect(NSRectToCGRect(rect)); - } else { - // Retrieve the view rectangle from the handler. - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetRenderHandler(); - if (handler.get()) { - CefRect rect(0, 0, 0, 0); - if (handler->GetViewRect(browser_, rect)) - return WebRect(rect.x, rect.y, rect.width, rect.height); - } - } - } - } - return WebRect(); -} - -void BrowserWebViewDelegate::setWindowRect(const WebRect& rect) { - if (this == browser_->UIT_GetWebViewDelegate()) { - // TODO(port): Set the window rectangle. - } else if (this == browser_->UIT_GetPopupDelegate()) { - NOTREACHED(); - } -} - -WebRect BrowserWebViewDelegate::rootWindowRect() { - if (WebWidgetHost* host = GetWidgetHost()) { - NSView *view = host->view_handle(); - NSRect rect = [[[view window] contentView] frame]; - return gfx::Rect(NSRectToCGRect(rect)); - } - return WebRect(); -} - -@interface NSWindow(OSInternals) -- (NSRect)_growBoxRect; -@end - -WebRect BrowserWebViewDelegate::windowResizerRect() { - NSRect resize_rect = NSMakeRect(0, 0, 0, 0); - WebWidgetHost* host = GetWidgetHost(); - if (host) { - NSView *view = host->view_handle(); - NSWindow* window = [view window]; - if (window == nil) - return gfx::Rect(); - - resize_rect = [window _growBoxRect]; - // The scrollbar assumes that the resizer goes all the way down to the - // bottom corner, so we ignore any y offset to the rect itself and use the - // entire bottom corner. - resize_rect.origin.y = 0; - // Convert to view coordinates from window coordinates. - resize_rect = [view convertRect:resize_rect fromView:nil]; - // Flip the rect in view coordinates - resize_rect.origin.y = - [view frame].size.height - resize_rect.origin.y - - resize_rect.size.height; - } - return gfx::Rect(NSRectToCGRect(resize_rect)); -} - -void BrowserWebViewDelegate::startDragging( - WebKit::WebFrame* frame, - const WebDragData& data, - WebDragOperationsMask mask, - const WebImage& image, - const WebPoint& image_offset) { - if (browser_->settings().drag_drop_disabled || - browser_->IsWindowRenderingDisabled()) { - browser_->UIT_GetWebView()->dragSourceSystemDragEnded(); - return; - } - - WebWidgetHost* host = GetWidgetHost(); - if (!host) - return; - - BrowserWebView *view = static_cast(host->view_handle()); - if (!view) - return; - - WebDropData drop_data(data); - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetDragHandler(); - if (handler.get()) { - CefRefPtr data(new CefDragDataImpl(drop_data)); - if (handler->OnDragStart(browser_, data, - static_cast(mask))) { - browser_->UIT_GetWebView()->dragSourceSystemDragEnded(); - return; - } - } - } - - // By allowing nested tasks, the code below also allows Close(), - // which would deallocate |this|. The same problem can occur while - // processing -sendEvent:, so Close() is deferred in that case. - // Drags from web content do not come via -sendEvent:, this sets the - // same flag -sendEvent: would. - CefScopedSendingEvent sendingEventScoper; - - // The drag invokes a nested event loop, arrange to continue - // processing events. - base::MessageLoop::ScopedNestableTaskAllower allow( - base::MessageLoop::current()); - - NSImage* ns_image = nil; - if (!image.isNull()) { - ui::ScaleFactor scale_factor = - ui::GetScaleFactorForNativeView(host->view_handle()); - gfx::ImageSkia image_skia( - gfx::ImageSkiaRep(image.getSkBitmap(), scale_factor)); - ns_image = gfx::NSImageFromImageSkia(image_skia); - } - NSPoint offset = NSPointFromCGPoint(gfx::Point(image_offset).ToCGPoint()); - - // Keep a reference to the NSView so that it won't be destroyed until after - // the drag operation has completed. - [view retain]; - - [view startDragWithDropData:drop_data - dragOperationMask:static_cast(mask) - image:ns_image - offset:offset]; - - [view release]; -} - -void BrowserWebViewDelegate::runModal() { - NOTIMPLEMENTED(); -} - -// WebPluginPageDelegate ------------------------------------------------------ - -webkit::npapi::WebPluginDelegate* BrowserWebViewDelegate::CreatePluginDelegate( - const base::FilePath& path, - const std::string& mime_type) { - WebWidgetHost *host = GetWidgetHost(); - if (!host) - return NULL; - - WebPluginDelegateImpl* delegate = WebPluginDelegateImpl::Create(path, mime_type); - if (delegate) - delegate->SetNoBufferContext(); - return delegate; -} - -void BrowserWebViewDelegate::CreatedPluginWindow( - gfx::PluginWindowHandle handle) { - if (browser_->IsWindowRenderingDisabled()) { - WebViewHost* host = browser_->UIT_GetWebViewHost(); - if (host) - host->AddWindowedPlugin(handle); - } -} - -void BrowserWebViewDelegate::WillDestroyPluginWindow( - gfx::PluginWindowHandle handle) { - if (browser_->IsWindowRenderingDisabled()) { - WebViewHost* host = browser_->UIT_GetWebViewHost(); - if (host) - host->RemoveWindowedPlugin(handle); - } -} - -void BrowserWebViewDelegate::DidMovePlugin( - const webkit::npapi::WebPluginGeometry& move) { - if (browser_->IsWindowRenderingDisabled()) { - WebViewHost* host = browser_->UIT_GetWebViewHost(); - if (host) { - host->MoveWindowedPlugin(move); - } - } -} - -// Protected methods ---------------------------------------------------------- - -void BrowserWebViewDelegate::ShowJavaScriptAlert( - WebKit::WebFrame* webframe, const CefString& message) { - NSString* label = GetDialogLabel(webframe, "JavaScript Alert"); - std::string messageStr(message); - NSString* text = [NSString stringWithUTF8String:messageStr.c_str()]; - - NSAlert* alert = [NSAlert alertWithMessageText:label - defaultButton:@"OK" - alternateButton:nil - otherButton:nil - informativeTextWithFormat:text]; - [alert runModal]; -} - -bool BrowserWebViewDelegate::ShowJavaScriptConfirm( - WebKit::WebFrame* webframe, const CefString& message) { - NSString* label = GetDialogLabel(webframe, "JavaScript Confirm"); - std::string messageStr(message); - NSString* text = [NSString stringWithUTF8String:messageStr.c_str()]; - - NSAlert *alert = [NSAlert alertWithMessageText:label - defaultButton:@"OK" - alternateButton:@"Cancel" - otherButton:nil - informativeTextWithFormat:text]; - - NSInteger r = [alert runModal]; - - return (r == NSAlertDefaultReturn); -} - -bool BrowserWebViewDelegate::ShowJavaScriptPrompt( - WebKit::WebFrame* webframe, const CefString& message, - const CefString& default_value, CefString* result) { - NSString* label = GetDialogLabel(webframe, "JavaScript Prompt"); - - NSAlert *alert = - [NSAlert alertWithMessageText:label - defaultButton:@"OK" - alternateButton:@"Cancel" - otherButton:nil - informativeTextWithFormat:@""]; - - NSTextField *input = - [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 300, 22)]; - [[input cell] setLineBreakMode:NSLineBreakByTruncatingTail]; - std::string default_valueStr(default_value); - [input setStringValue: - [NSString stringWithUTF8String:default_valueStr.c_str()]]; - [alert setAccessoryView:input]; - [input release]; - - std::string messageStr(message); - [alert setInformativeText:[NSString stringWithUTF8String:messageStr.c_str()]]; - - NSInteger r = [alert runModal]; - if (r == NSAlertDefaultReturn) { - [input validateEditing]; - *result = base::SysNSStringToUTF8([input stringValue]); - } - - return (r == NSAlertDefaultReturn); -} - -// Called to show the file chooser dialog. -bool BrowserWebViewDelegate::ShowFileChooser( - std::vector& file_names, - bool multi_select, - const WebKit::WebString& title, - const base::FilePath& default_file, - const std::vector& accept_mime_types) { - NSOpenPanel* dialog = [NSOpenPanel openPanel]; - if (!title.isNull()) - [dialog setTitle:base::SysUTF16ToNSString(title)]; - - NSString* default_dir = nil; - NSString* default_filename = nil; - if (!default_file.empty()) { - // The file dialog is going to do a ton of stats anyway. Not much - // point in eliminating this one. - base::ThreadRestrictions::ScopedAllowIO allow_io; - if (file_util::DirectoryExists(default_file)) { - default_dir = base::SysUTF8ToNSString(default_file.value()); - } else { - default_dir = base::SysUTF8ToNSString(default_file.DirName().value()); - default_filename = - base::SysUTF8ToNSString(default_file.BaseName().value()); - } - } - - [dialog setAllowsOtherFileTypes:YES]; - [dialog setAllowsMultipleSelection:multi_select]; - [dialog setCanChooseFiles:YES]; - [dialog setCanChooseDirectories:NO]; - - // [NSOpenPanel runModalForDirectory:file:] was deprecated on OS-X 10.7. - NSInteger result; - if ([NSOpenPanel respondsToSelector:@selector(runModalForDirectory:file:)]) { - result = (NSInteger) [dialog performSelector:@selector(runModalForDirectory:file:) - withObject:default_dir - withObject:default_filename]; - } else { - if (default_dir) - [dialog setDirectoryURL:[NSURL URLWithString:default_dir]]; - if (default_filename) - [dialog setNameFieldStringValue:default_filename]; - result = [dialog runModal]; - } - - if (result == NSFileHandlingPanelCancelButton) - return false; - - NSArray *urls = [dialog URLs]; - int i, count = [urls count]; - for (i=0; i -#include -#include - -#include "libcef/browser_drag_delegate_win.h" -#include "libcef/browser_navigation_controller.h" -#include "libcef/browser_impl.h" -#include "libcef/cef_context.h" -#include "libcef/drag_data_impl.h" -#include "libcef/web_drop_target_win.h" -#include "libcef_dll/resource.h" - -#include "base/i18n/case_conversion.h" -#include "base/message_loop.h" -#include "base/path_service.h" -#include "base/string_util.h" -#include "base/utf_string_conversions.h" -#include "base/win/registry.h" -#include "net/base/mime_util.h" -#include "net/base/net_errors.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebDragData.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebImage.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebPoint.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebContextMenuData.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/window_open_disposition.h" -#include "ui/gfx/gdi_util.h" -#include "ui/gfx/native_widget_types.h" -#include "ui/gfx/point.h" -#include "webkit/glue/webdropdata.h" -#include "webkit/glue/webpreferences.h" -#include "webkit/glue/webkit_glue.h" -#include "webkit/plugins/npapi/plugin_list.h" -#include "webkit/plugins/npapi/webplugin.h" -#include "webkit/plugins/npapi/webplugin_delegate_impl.h" - -using webkit::npapi::WebPluginDelegateImpl; -using WebKit::WebContextMenuData; -using WebKit::WebCursorInfo; -using WebKit::WebDragData; -using WebKit::WebDragOperationsMask; -using WebKit::WebExternalPopupMenu; -using WebKit::WebExternalPopupMenuClient; -using WebKit::WebFrame; -using WebKit::WebImage; -using WebKit::WebNavigationPolicy; -using WebKit::WebPoint; -using WebKit::WebPopupMenuInfo; -using WebKit::WebRect; -using WebKit::WebWidget; - -namespace { - -static const wchar_t kPluginWindowClassName[] = L"WebPluginHost"; - -// From ui/base/dialogs/select_file_dialog_win.cc. - -// Get the file type description from the registry. This will be "Text Document" -// for .txt files, "JPEG Image" for .jpg files, etc. If the registry doesn't -// have an entry for the file type, we return false, true if the description was -// found. 'file_ext' must be in form ".txt". -static bool GetRegistryDescriptionFromExtension(const std::wstring& file_ext, - std::wstring* reg_description) { - DCHECK(reg_description); - base::win::RegKey reg_ext(HKEY_CLASSES_ROOT, file_ext.c_str(), KEY_READ); - std::wstring reg_app; - if (reg_ext.ReadValue(NULL, ®_app) == ERROR_SUCCESS && !reg_app.empty()) { - base::win::RegKey reg_link(HKEY_CLASSES_ROOT, reg_app.c_str(), KEY_READ); - if (reg_link.ReadValue(NULL, reg_description) == ERROR_SUCCESS) - return true; - } - return false; -} - -// Set up a filter for a Save/Open dialog, which will consist of |file_ext| file -// extensions (internally separated by semicolons), |ext_desc| as the text -// descriptions of the |file_ext| types (optional), and (optionally) the default -// 'All Files' view. The purpose of the filter is to show only files of a -// particular type in a Windows Save/Open dialog box. The resulting filter is -// returned. The filters created here are: -// 1. only files that have 'file_ext' as their extension -// 2. all files (only added if 'include_all_files' is true) -// Example: -// file_ext: { "*.txt", "*.htm;*.html" } -// ext_desc: { "Text Document" } -// returned: "Text Document\0*.txt\0HTML Document\0*.htm;*.html\0" -// "All Files\0*.*\0\0" (in one big string) -// If a description is not provided for a file extension, it will be retrieved -// from the registry. If the file extension does not exist in the registry, it -// will be omitted from the filter, as it is likely a bogus extension. -std::wstring FormatFilterForExtensions( - const std::vector& file_ext, - const std::vector& ext_desc, - bool include_all_files) { - const std::wstring all_ext = L"*.*"; - const std::wstring all_desc = - std::wstring(L"All Files") + - L" (" + all_ext + L")"; - - DCHECK(file_ext.size() >= ext_desc.size()); - - if (file_ext.empty()) - include_all_files = true; - - std::wstring result; - - if (file_ext.size() > 1) { - std::wstring extensions = JoinString(file_ext, L';'); - std::wstring all_supported_types = L"All Supported Types (" + - extensions + L")"; - - result.append(all_supported_types.c_str(), all_supported_types.size() + 1); - result.append(extensions.c_str(), extensions.size() + 1); - } - - for (size_t i = 0; i < file_ext.size(); ++i) { - std::wstring ext = file_ext[i]; - std::wstring desc; - if (i < ext_desc.size()) - desc = ext_desc[i]; - - if (ext.empty()) { - // Force something reasonable to appear in the dialog box if there is no - // extension provided. - include_all_files = true; - continue; - } - - if (desc.empty()) { - DCHECK(ext.find(L'.') != std::wstring::npos); - std::wstring first_extension = ext.substr(ext.find(L'.')); - size_t first_separator_index = first_extension.find(L';'); - if (first_separator_index != std::wstring::npos) - first_extension = first_extension.substr(0, first_separator_index); - - // Find the extension name without the preceeding '.' character. - std::wstring ext_name = first_extension; - size_t ext_index = ext_name.find_first_not_of(L'.'); - if (ext_index != std::wstring::npos) - ext_name = ext_name.substr(ext_index); - - if (!GetRegistryDescriptionFromExtension(first_extension, &desc)) { - // The extension doesn't exist in the registry. Create a description - // based on the unknown extension type (i.e. if the extension is .qqq, - // the we create a description "QQQ File (.qqq)"). - include_all_files = true; - std::vector replacements; - replacements.push_back(base::i18n::ToUpper(WideToUTF16(ext_name))); - replacements.push_back(ext_name); - desc = ReplaceStringPlaceholders( - L"$1 File (.$2)", - replacements, - NULL); - } - } - - if (!desc.empty()) - desc += L" (" + ext + L")"; - else - desc = ext; - - result.append(desc.c_str(), desc.size() + 1); // Append NULL too. - result.append(ext.c_str(), ext.size() + 1); - } - - if (include_all_files) { - result.append(all_desc.c_str(), all_desc.size() + 1); - result.append(all_ext.c_str(), all_ext.size() + 1); - } - - result.append(1, '\0'); // Double NULL required. - return result; -} - -std::wstring GetDescriptionFromMimeType(const std::string& mime_type) { - // Check for wild card mime types and return an appropriate description. - static const struct { - const char* mime_type; - std::wstring full_string; - } kWildCardMimeTypes[] = { - { "audio", L"Audio Files" }, - { "image", L"Image Files" }, - { "text", L"Text Files" }, - { "video", L"Video Files" }, - }; - - for (size_t i = 0; i < arraysize(kWildCardMimeTypes); ++i) { - if (mime_type == std::string(kWildCardMimeTypes[i].mime_type) + "/*") - return std::wstring(kWildCardMimeTypes[i].full_string); - } - - return std::wstring(); -} - -std::wstring GetFilterStringFromAcceptTypes( - const std::vector& accept_types) { - std::vector extensions; - std::vector descriptions; - - for (size_t i = 0; i < accept_types.size(); ++i) { - std::string ascii_type = accept_types[i]; - if (ascii_type.length()) { - // Just treat as extension if contains '.' as the first character. - if (ascii_type[0] == '.') { - extensions.push_back(L"*" + ASCIIToWide(ascii_type)); - descriptions.push_back(std::wstring()); - } else { - // Otherwise convert mime type to one or more extensions. - std::vector ext; - std::wstring ext_str; - net::GetExtensionsForMimeType(ascii_type, &ext); - if (ext.size() > 0) { - for (size_t x = 0; x < ext.size(); ++x) { - if (x != 0) - ext_str += L";"; - ext_str += L"*." + ext[x]; - } - extensions.push_back(ext_str); - descriptions.push_back(GetDescriptionFromMimeType(ascii_type)); - } - } - } - } - - return FormatFilterForExtensions(extensions, descriptions, true); -} - -void AddMenuItem(CefRefPtr browser, - CefRefPtr handler, - HMENU menu, - cef_menu_id_t menuId, - const wchar_t* label, - bool enabled, - std::list& label_list) { - CefString actual_label(label); - if (handler.get()) { - // Let the handler change the label if desired, - handler->GetMenuLabel(browser, menuId, actual_label); - } - - // Store the label in a list to simplify memory management. - label_list.push_back(actual_label); - - MENUITEMINFO mii; - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING; - mii.fType = MFT_STRING; - if (!enabled) { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_GRAYED; - } - mii.wID = menuId; - mii.dwTypeData = const_cast(label_list.back().c_str()); - - InsertMenuItem(menu, -1, TRUE, &mii); -} - -void AddMenuSeparator(HMENU menu) { - MENUITEMINFO mii; - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_FTYPE; - mii.fType = MFT_SEPARATOR; - - InsertMenuItem(menu, -1, TRUE, &mii); -} - -std::wstring GetDialogLabel(WebKit::WebFrame* webframe, - const std::string& label) { - const GURL& url = webframe->document().url(); - std::string urlStr; - if (!url.is_empty()) - urlStr = url.host(); - std::string labelStr = label; - if (!urlStr.empty()) - labelStr += " - " + urlStr; - return UTF8ToWide(labelStr); -} - -struct DialogConfig { - std::wstring label; - std::wstring message; - std::wstring default_value; - std::wstring result; -}; - -INT_PTR CALLBACK DialogProc(HWND dialog, - UINT message, - WPARAM wparam, - LPARAM lparam) { - switch (message) { - case WM_INITDIALOG: { - SetWindowLongPtr(dialog, DWL_USER, static_cast(lparam)); - DialogConfig* config = reinterpret_cast(lparam); - SetWindowText(dialog, config->label.c_str()); - SetDlgItemText(dialog, IDC_DIALOGTEXT, config->message.c_str()); - SetDlgItemText(dialog, IDC_PROMPTEDIT, config->default_value.c_str()); - break; - } - case WM_CLOSE: { - DialogConfig* config = reinterpret_cast( - GetWindowLongPtr(dialog, DWL_USER)); - if (config) - EndDialog(dialog, IDCANCEL); - break; - } - case WM_COMMAND: { - DialogConfig* config = reinterpret_cast( - GetWindowLongPtr(dialog, DWL_USER)); - bool finish = false; - switch (LOWORD(wparam)) { - case IDOK: { - finish = true; - size_t length = - GetWindowTextLength(GetDlgItem(dialog, IDC_PROMPTEDIT)) + 1; - if (length > 1) { - GetDlgItemText(dialog, IDC_PROMPTEDIT, - WriteInto(&config->result, length), length); - } - break; - } - case IDCANCEL: - finish = true; - break; - } - if (finish) - EndDialog(dialog, LOWORD(wparam)); - break; - } - } - - return DefWindowProc(dialog, message, wparam, lparam); -} - -} // namespace - -// WebViewClient -------------------------------------------------------------- - -WebExternalPopupMenu* BrowserWebViewDelegate::createExternalPopupMenu( - const WebPopupMenuInfo& info, - WebExternalPopupMenuClient* client) { - NOTREACHED(); - return NULL; -} - -// WebWidgetClient ------------------------------------------------------------ - -void BrowserWebViewDelegate::show(WebNavigationPolicy) { - if (this == browser_->UIT_GetWebViewDelegate()) { - if (!browser_->IsWindowRenderingDisabled()) { - // Restore the window and bring it to the top if the window is currently - // visible. - HWND root = GetAncestor(browser_->UIT_GetMainWndHandle(), GA_ROOT); - if (IsWindowVisible(root)) { - ShowWindow(root, SW_SHOWNORMAL); - SetWindowPos(root, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); - } - } - } else if (this == browser_->UIT_GetPopupDelegate()) { - if (!browser_->IsWindowRenderingDisabled()) { - // Show popup widgets without activation. - ShowWindow(browser_->UIT_GetPopupWndHandle(), SW_SHOWNA); - } else { - // Notify the handler of popup visibility change. - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetRenderHandler(); - if (handler.get()) - handler->OnPopupShow(browser_, true); - } - } - } -} - -void BrowserWebViewDelegate::didChangeCursor(const WebCursorInfo& cursor_info) { - if (WebWidgetHost* host = GetWidgetHost()) { - current_cursor_.InitFromCursorInfo(cursor_info); - HMODULE hModule = ::GetModuleHandle(L"libcef.dll"); - if (!hModule) - hModule = ::GetModuleHandle(NULL); - HCURSOR hCursor = current_cursor_.GetCursor(hModule); - - if (!browser_->IsWindowRenderingDisabled()) { - host->SetCursor(hCursor); - } else { - // Notify the handler of cursor change. - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetRenderHandler(); - if (handler.get()) - handler->OnCursorChange(browser_, hCursor); - } - } - } -} - -WebRect BrowserWebViewDelegate::windowRect() { - if (WebWidgetHost* host = GetWidgetHost()) { - if (!browser_->IsWindowRenderingDisabled()) { - RECT rect; - ::GetWindowRect(host->view_handle(), &rect); - return gfx::Rect(rect); - } else { - // Retrieve the view rectangle from the handler. - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetRenderHandler(); - if (handler.get()) { - CefRect rect(0, 0, 0, 0); - if (handler->GetViewRect(browser_, rect)) - return WebRect(rect.x, rect.y, rect.width, rect.height); - } - } - } - } - return WebRect(); -} - -void BrowserWebViewDelegate::setWindowRect(const WebRect& rect) { - if (this == browser_->UIT_GetWebViewDelegate()) { - // ignored - } else if (this == browser_->UIT_GetPopupDelegate()) { - if (!browser_->IsWindowRenderingDisabled()) { - MoveWindow(browser_->UIT_GetPopupWndHandle(), rect.x, rect.y, rect.width, - rect.height, FALSE); - } else { - browser_->set_popup_rect(rect); - browser_->UIT_GetPopupHost()->SetSize(rect.width, rect.height); - - // Notify the handler of popup size change. - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetRenderHandler(); - if (handler.get()) { - handler->OnPopupSize(browser_, - CefRect(rect.x, rect.y, rect.width, rect.height)); - } - } - } - } -} - -WebRect BrowserWebViewDelegate::rootWindowRect() { - if (WebWidgetHost* host = GetWidgetHost()) { - RECT rect; - HWND root_window = ::GetAncestor(host->view_handle(), GA_ROOT); - ::GetWindowRect(root_window, &rect); - return gfx::Rect(rect); - } - return WebRect(); -} - -WebRect BrowserWebViewDelegate::windowResizerRect() { - // Not necessary on Windows. - return WebRect(); -} - -void BrowserWebViewDelegate::startDragging( - WebFrame* frame, - const WebDragData& data, - WebDragOperationsMask mask, - const WebImage& image, - const WebPoint& image_offset) { - // Dragging is not supported when window rendering is disabled. - if (browser_->settings().drag_drop_disabled || - browser_->IsWindowRenderingDisabled()) { - EndDragging(); - return; - } - - WebDropData drop_data(data); - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetDragHandler(); - if (handler.get()) { - CefRefPtr data(new CefDragDataImpl(drop_data)); - if (handler->OnDragStart(browser_, data, - static_cast(mask))) { - EndDragging(); - return; - } - } - } - - drag_delegate_ = new BrowserDragDelegate(this); - gfx::ImageSkia image_skia = - gfx::ImageSkia(gfx::ImageSkiaRep(image.getSkBitmap(), - ui::SCALE_FACTOR_100P)); - drag_delegate_->StartDragging(drop_data, mask, image_skia, - gfx::Point(image_offset).OffsetFromOrigin()); -} - -void BrowserWebViewDelegate::runModal() { - WebWidgetHost* host = GetWidgetHost(); - if (!host) - return; - - show(WebKit::WebNavigationPolicyNewWindow); - - browser_->UIT_SetIsModal(true); - - CefRefPtr client = browser_->GetClient(); - CefRefPtr handler; - - if (client.get()) - handler = client->GetLifeSpanHandler(); - - bool handled(false); - - if (handler.get()) { - // Let the client override the modal message loop. - handled = handler->RunModal(browser_); - } - - if (!handled) { - HWND child = ::GetAncestor(browser_->UIT_GetMainWndHandle(), GA_ROOT); - HWND owner = ::GetAncestor(browser_->opener_window(), GA_ROOT); - - if (child && owner) { - // Set the owner so that Windows keeps this window above the owner. - ::SetWindowLong(child, GWL_HWNDPARENT, (LONG)owner); - // Disable the owner if it is enabled so that you can't interact with it. - // while this child window is open. - if (::IsWindowEnabled(owner)) { - ::EnableWindow(owner, FALSE); - browser_->set_opener_was_disabled_by_modal_loop(true); - } - DWORD dwStyle = ::GetWindowLong(child, GWL_STYLE); - DWORD dwNewStyle = dwStyle | WS_POPUP; - if (dwStyle != dwNewStyle) - ::SetWindowLong(child, GWL_STYLE, dwNewStyle); - } - - // Tell the browser to exit this message loop when this window closes. - browser_->set_internal_modal_message_loop_is_active(true); - - // Start a new message loop here and return when this window closes. - base::MessageLoop* message_loop = base::MessageLoop::current(); - bool old_state = message_loop->NestableTasksAllowed(); - message_loop->SetNestableTasksAllowed(true); - message_loop->Run(); - message_loop->SetNestableTasksAllowed(old_state); - } -} - -// WebPluginPageDelegate ------------------------------------------------------ - -webkit::npapi::WebPluginDelegate* BrowserWebViewDelegate::CreatePluginDelegate( - const base::FilePath& file_path, - const std::string& mime_type) { - WebViewHost* host = browser_->UIT_GetWebViewHost(); - if (!host) - return NULL; - - return WebPluginDelegateImpl::Create(file_path, mime_type); -} - -void BrowserWebViewDelegate::CreatedPluginWindow( - gfx::PluginWindowHandle handle) { - if (!browser_->IsWindowRenderingDisabled()) { - // Parent the plugin container to the existing browser window. - HWND parent = browser_->UIT_GetWebViewHost()->view_handle(); - DCHECK(parent != NULL); - SetParent(handle, parent); - } else { - static bool registered_class = false; - if (!registered_class) { - WNDCLASSEX wcex = {0}; - wcex.cbSize = sizeof(wcex); - wcex.style = CS_DBLCLKS; - wcex.lpfnWndProc = DefWindowProc; - wcex.hInstance = GetModuleHandle(NULL); - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.lpszClassName = kPluginWindowClassName; - RegisterClassEx(&wcex); - registered_class = true; - } - - // Parent windowed plugin containers to a hidden window. - HWND parent = CreateWindow(kPluginWindowClassName, NULL, - WS_OVERLAPPED|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, - 0, 0, 0, 0, NULL, NULL, - GetModuleHandle(NULL), NULL); - DCHECK(parent != NULL); - SetParent(handle, parent); - - WebViewHost* host = browser_->UIT_GetWebViewHost(); - if (host) - host->AddWindowedPlugin(handle); - } -} - -void BrowserWebViewDelegate::WillDestroyPluginWindow( - gfx::PluginWindowHandle handle) { - if (browser_->IsWindowRenderingDisabled()) { - WebViewHost* host = browser_->UIT_GetWebViewHost(); - if (host) - host->RemoveWindowedPlugin(handle); - - // Destroy the hidden parent window. - DestroyWindow(GetParent(handle)); - } -} - -void BrowserWebViewDelegate::DidMovePlugin( - const webkit::npapi::WebPluginGeometry& move) { - UINT flags = 0; - - if (move.rects_valid) { - HRGN hrgn = ::CreateRectRgn(move.clip_rect.x(), - move.clip_rect.y(), - move.clip_rect.right(), - move.clip_rect.bottom()); - gfx::SubtractRectanglesFromRegion(hrgn, move.cutout_rects); - - // Note: System will own the hrgn after we call SetWindowRgn, - // so we don't need to call DeleteObject(hrgn) - ::SetWindowRgn(move.window, hrgn, FALSE); - } else { - flags |= (SWP_NOSIZE | SWP_NOMOVE); - } - - if (move.visible) - flags |= SWP_SHOWWINDOW; - else - flags |= SWP_HIDEWINDOW; - - ::SetWindowPos(move.window, - NULL, - move.window_rect.x(), - move.window_rect.y(), - move.window_rect.width(), - move.window_rect.height(), - flags); - - if (browser_->IsWindowRenderingDisabled()) { - WebViewHost* host = browser_->UIT_GetWebViewHost(); - if (host) { - host->MoveWindowedPlugin(move); - } - } -} - -void BrowserWebViewDelegate::showContextMenu( - WebFrame* frame, const WebContextMenuData& data) { - int screenX = -1, screenY = -1; - - POINT mouse_pt = {data.mousePosition.x, data.mousePosition.y}; - if (!browser_->IsWindowRenderingDisabled()) { - // Perform the conversion to screen coordinates only if window rendering is - // enabled. - MapWindowPoints(browser_->UIT_GetWebViewWndHandle(), HWND_DESKTOP, - &mouse_pt, 1); - screenX = mouse_pt.x; - screenY = mouse_pt.y; - } - - int edit_flags = 0; - int type_flags = 0; - HMENU menu = NULL; - std::list label_list; - - // Make sure events can be pumped while the menu is up. - base::MessageLoop::ScopedNestableTaskAllower allow( - base::MessageLoop::current()); - - // Give the client a chance to handle the menu. - if (OnBeforeMenu(data, mouse_pt.x, mouse_pt.y, edit_flags, type_flags)) - return; - - CefRefPtr client = browser_->GetClient(); - CefRefPtr handler; - if (client.get()) - handler = client->GetMenuHandler(); - - if (client.get() && browser_->IsWindowRenderingDisabled()) { - // Retrieve the screen coordinates. - CefRefPtr render_handler = client->GetRenderHandler(); - if (!render_handler.get() || - !render_handler->GetScreenPoint(browser_, mouse_pt.x, mouse_pt.y, - screenX, screenY)) { - return; - } - } - - // Build the correct default context menu - if (type_flags & MENUTYPE_EDITABLE) { - menu = CreatePopupMenu(); - AddMenuItem(browser_, handler, menu, MENU_ID_UNDO, L"Undo", - !!(edit_flags & MENU_CAN_UNDO), label_list); - AddMenuItem(browser_, handler, menu, MENU_ID_REDO, L"Redo", - !!(edit_flags & MENU_CAN_REDO), label_list); - AddMenuSeparator(menu); - AddMenuItem(browser_, handler, menu, MENU_ID_CUT, L"Cut", - !!(edit_flags & MENU_CAN_CUT), label_list); - AddMenuItem(browser_, handler, menu, MENU_ID_COPY, L"Copy", - !!(edit_flags & MENU_CAN_COPY), label_list); - AddMenuItem(browser_, handler, menu, MENU_ID_PASTE, L"Paste", - !!(edit_flags & MENU_CAN_PASTE), label_list); - AddMenuItem(browser_, handler, menu, MENU_ID_DELETE, L"Delete", - !!(edit_flags & MENU_CAN_DELETE), label_list); - AddMenuSeparator(menu); - AddMenuItem(browser_, handler, menu, MENU_ID_SELECTALL, L"Select All", - !!(edit_flags & MENU_CAN_SELECT_ALL), label_list); - } else if (type_flags & MENUTYPE_SELECTION) { - menu = CreatePopupMenu(); - AddMenuItem(browser_, handler, menu, MENU_ID_COPY, L"Copy", - !!(edit_flags & MENU_CAN_COPY), label_list); - } else if (type_flags & (MENUTYPE_PAGE | MENUTYPE_FRAME)) { - menu = CreatePopupMenu(); - AddMenuItem(browser_, handler, menu, MENU_ID_NAV_BACK, L"Back", - !!(edit_flags & MENU_CAN_GO_BACK), label_list); - AddMenuItem(browser_, handler, menu, MENU_ID_NAV_FORWARD, L"Forward", - !!(edit_flags & MENU_CAN_GO_FORWARD), label_list); - AddMenuSeparator(menu); - AddMenuItem(browser_, handler, menu, MENU_ID_PRINT, L"Print", - true, label_list); - AddMenuItem(browser_, handler, menu, MENU_ID_VIEWSOURCE, L"View Source", - true, label_list); - } - - if (!menu) - return; - - base::MessageLoop::current()->set_os_modal_loop(true); - - // Show the context menu - int selected_id = TrackPopupMenu(menu, - TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD | TPM_RECURSE, - screenX, screenY, 0, browser_->UIT_GetMainWndHandle(), NULL); - - base::MessageLoop::current()->set_os_modal_loop(false); - - if (selected_id != 0) { - // An action was chosen - cef_menu_id_t menuId = static_cast(selected_id); - bool handled = false; - if (handler.get()) { - // Ask the handler if it wants to handle the action - handled = handler->OnMenuAction(browser_, menuId); - } - - if (!handled) { - // Execute the action - browser_->UIT_HandleAction(menuId, browser_->GetFocusedFrame()); - } - } - - DestroyMenu(menu); -} - -// Private methods ------------------------------------------------------------ - -void BrowserWebViewDelegate::RegisterDragDrop() { - DCHECK(!drop_target_); - drop_target_ = new WebDropTarget(browser_); -} - -void BrowserWebViewDelegate::RevokeDragDrop() { - if (drop_target_.get()) - ::RevokeDragDrop(browser_->UIT_GetWebViewWndHandle()); -} - -void BrowserWebViewDelegate::EndDragging() { - if (browser_->UIT_GetWebView()) - browser_->UIT_GetWebView()->dragSourceSystemDragEnded(); - drag_delegate_ = NULL; - - if (destroy_on_drag_end_) - browser_->UIT_DestroyBrowser(); -} - -void BrowserWebViewDelegate::ShowJavaScriptAlert(WebFrame* webframe, - const CefString& message) { - std::wstring messageStr = message; - std::wstring titleStr = GetDialogLabel(webframe, "JavaScript Alert"); - MessageBox(browser_->UIT_GetMainWndHandle(), messageStr.c_str(), - titleStr.c_str(), MB_OK | MB_ICONWARNING); -} - -bool BrowserWebViewDelegate::ShowJavaScriptConfirm(WebFrame* webframe, - const CefString& message) { - std::wstring messageStr = message; - std::wstring titleStr = GetDialogLabel(webframe, "JavaScript Confirm"); - int rv = MessageBox(browser_->UIT_GetMainWndHandle(), messageStr.c_str(), - titleStr.c_str(), MB_YESNO | MB_ICONQUESTION); - return (rv == IDYES); -} - -bool BrowserWebViewDelegate::ShowJavaScriptPrompt(WebFrame* webframe, - const CefString& message, - const CefString& default_value, - CefString* result) { - base::FilePath file_path; - HMODULE hModule = NULL; - - // Try to load the dialog from the DLL. - if (PathService::Get(base::FILE_MODULE, &file_path)) - hModule = ::GetModuleHandle(file_path.value().c_str()); - if (!hModule) - hModule = ::GetModuleHandle(NULL); - DCHECK(hModule); - - DialogConfig config; - config.label = GetDialogLabel(webframe, "JavaScript Prompt"); - config.message = message; - config.default_value = default_value; - - HWND parent = GetAncestor(browser_->GetWindowHandle(), GA_ROOT); - - // Show the modal dialog. - int rv = DialogBoxParam(hModule, - MAKEINTRESOURCE(IDD_PROMPT), - parent, - DialogProc, - reinterpret_cast(&config)); - if (rv == IDOK) - *result = config.result; - - // Return focus to the parent window. - if (IsWindow(parent)) - SetFocus(parent); - - return (rv == IDOK); -} - -namespace { - -// from chrome/browser/views/shell_dialogs_win.cc - -bool RunOpenFileDialog(const std::wstring& filter, HWND owner, - base::FilePath* path) { - OPENFILENAME ofn; - - // We must do this otherwise the ofn's FlagsEx may be initialized to random - // junk in release builds which can cause the Places Bar not to show up! - ZeroMemory(&ofn, sizeof(ofn)); - ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = owner; - - wchar_t filename[MAX_PATH]; - base::wcslcpy(filename, path->value().c_str(), arraysize(filename)); - - ofn.lpstrFile = filename; - ofn.nMaxFile = MAX_PATH; - - // We use OFN_NOCHANGEDIR so that the user can rename or delete the directory - // without having to close Chrome first. - ofn.Flags = OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; - - if (!filter.empty()) { - ofn.lpstrFilter = filter.c_str(); - } - bool success = !!GetOpenFileName(&ofn); - if (success) - *path = base::FilePath(filename); - return success; -} - -bool RunOpenMultiFileDialog(const std::wstring& filter, HWND owner, - std::vector* paths) { - OPENFILENAME ofn; - - // We must do this otherwise the ofn's FlagsEx may be initialized to random - // junk in release builds which can cause the Places Bar not to show up! - ZeroMemory(&ofn, sizeof(ofn)); - ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = owner; - - scoped_array filename(new wchar_t[UNICODE_STRING_MAX_CHARS]); - filename[0] = 0; - - ofn.lpstrFile = filename.get(); - ofn.nMaxFile = UNICODE_STRING_MAX_CHARS; - - // We use OFN_NOCHANGEDIR so that the user can rename or delete the directory - // without having to close Chrome first. - ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER - | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT; - - if (!filter.empty()) { - ofn.lpstrFilter = filter.c_str(); - } - bool success = !!GetOpenFileName(&ofn); - - if (success) { - std::vector files; - const wchar_t* selection = ofn.lpstrFile; - while (*selection) { // Empty string indicates end of list. - files.push_back(base::FilePath(selection)); - // Skip over filename and null-terminator. - selection += files.back().value().length() + 1; - } - if (files.empty()) { - success = false; - } else if (files.size() == 1) { - // When there is one file, it contains the path and filename. - paths->swap(files); - } else { - // Otherwise, the first string is the path, and the remainder are - // filenames. - std::vector::iterator path = files.begin(); - for (std::vector::iterator file = path + 1; - file != files.end(); ++file) { - paths->push_back(path->Append(*file)); - } - } - } - return success; -} - -} // namespace - -bool BrowserWebViewDelegate::ShowFileChooser( - std::vector& file_names, - bool multi_select, - const WebKit::WebString& title, - const base::FilePath& default_file, - const std::vector& accept_mime_types) { - bool result = false; - const std::wstring& filter = - GetFilterStringFromAcceptTypes(accept_mime_types); - - if (multi_select) { - result = RunOpenMultiFileDialog(filter, browser_->UIT_GetMainWndHandle(), - &file_names); - } else { - base::FilePath file_name; - result = RunOpenFileDialog(filter, browser_->UIT_GetMainWndHandle(), - &file_name); - if (result) - file_names.push_back(file_name); - } - - return result; -} diff --git a/cef1/libcef/browser_webview_mac.h b/cef1/libcef/browser_webview_mac.h deleted file mode 100644 index c11e05b17..000000000 --- a/cef1/libcef/browser_webview_mac.h +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2008 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. - -#ifndef CEF_LIBCEF_BROWSER_WEBVIEW_MAC_H_ -#define CEF_LIBCEF_BROWSER_WEBVIEW_MAC_H_ -#pragma once - -#import -#import "base/mac/cocoa_protocols.h" -#include "base/string16.h" -#include "base/memory/scoped_nsobject.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositionUnderline.h" -#include -#import "libcef/browser_tooltip_mac.h" - -class CefBrowserImpl; -@class WebDragSource; -@class WebDropTarget; -struct WebDropData; - -// A view to wrap the WebCore view and help it live in a Cocoa world. The -// (rough) equivalent of Apple's WebView. - -@interface BrowserWebView : NSView { - @private - CefBrowserImpl* browser_; // weak - NSTrackingArea* trackingArea_; - bool is_in_setfocus_; - - scoped_nsobject dragSource_; - scoped_nsobject dropTarget_; - - // Represents the input-method attributes supported by this object. - scoped_nsobject validAttributesForMarkedText_; - - // Indicates if we are currently handling a key down event. - BOOL handlingKeyDown_; - - // Indicates if there is any marked text. - BOOL hasMarkedText_; - - // Indicates if unmarkText is called or not when handling a keyboard - // event. - BOOL unmarkTextCalled_; - - // The range of current marked text inside the whole content of the DOM node - // being edited. - // TODO(suzhe): This is currently a fake value, as we do not support accessing - // the whole content yet. - NSRange markedRange_; - - // The selected range, cached from a message sent by the renderer. - NSRange selectedRange_; - - // Text to be inserted which was generated by handling a key down event. - string16 textToBeInserted_; - - // Marked text which was generated by handling a key down event. - string16 markedText_; - - // Underline information of the |markedText_|. - std::vector underlines_; - - // These are part of the magic tooltip code from WebKit's WebHTMLView: - id trackingRectOwner_; // (not retained) - void* trackingRectUserData_; - NSTrackingRectTag lastToolTipTag_; - scoped_nsobject toolTip_; -} - -- (void)mouseDown:(NSEvent *)theEvent; -- (void)rightMouseDown:(NSEvent *)theEvent; -- (void)otherMouseDown:(NSEvent *)theEvent; -- (void)mouseUp:(NSEvent *)theEvent; -- (void)rightMouseUp:(NSEvent *)theEvent; -- (void)otherMouseUp:(NSEvent *)theEvent; -- (void)mouseMoved:(NSEvent *)theEvent; -- (void)mouseDragged:(NSEvent *)theEvent; -- (void)scrollWheel:(NSEvent *)theEvent; -- (void)rightMouseDragged:(NSEvent *)theEvent; -- (void)otherMouseDragged:(NSEvent *)theEvent; -- (void)mouseEntered:(NSEvent *)theEvent; -- (void)mouseExited:(NSEvent *)theEvent; -- (void)keyDown:(NSEvent *)theEvent; -- (void)keyUp:(NSEvent *)theEvent; -- (BOOL)isOpaque; -- (void)setFrame:(NSRect)frameRect; - -// Forward the keyboard event to the editor -- (void)forwardKeyEventToEditor: (NSEvent *)theEvent; - -// Register this WebView as a drag/drop target. -- (void)registerDragDrop; - -// Called from BrowserWebViewDelegate::startDragging() to initiate dragging. -- (void)startDragWithDropData:(const WebDropData&)dropData - dragOperationMask:(NSDragOperation)operationMask - image:(NSImage*)image - offset:(NSPoint)offset; - -@property (nonatomic, assign) CefBrowserImpl* browser; -@property (nonatomic, assign) bool in_setfocus; - -@end - -#endif // CEF_LIBCEF_BROWSER_WEBVIEW_MAC_H_ diff --git a/cef1/libcef/browser_webview_mac.mm b/cef1/libcef/browser_webview_mac.mm deleted file mode 100644 index 493c9e3d7..000000000 --- a/cef1/libcef/browser_webview_mac.mm +++ /dev/null @@ -1,852 +0,0 @@ -// Copyright (c) 2008 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 - -#import "libcef/browser_webview_mac.h" -#import "libcef/browser_impl.h" -#import "libcef/cef_context.h" -#import "libcef/web_drag_source_mac.h" -#import "libcef/web_drop_target_mac.h" -#import "libcef/webwidget_host.h" - -#import "base/memory/scoped_ptr.h" -#import "base/string_util.h" -#import "base/strings/sys_string_conversions.h" -#import "third_party/WebKit/Source/WebKit/chromium/public/mac/WebInputEventFactory.h" -#import "third_party/WebKit/Source/WebKit/chromium/public/mac/WebSubstringUtil.h" -#import "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#import "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#import "third_party/mozilla/NSPasteboard+Utils.h" -#import "third_party/skia/include/core/SkRegion.h" -#import "ui/gfx/rect.h" - -using WebKit::WebColor; -using WebKit::WebCompositionUnderline; -using WebKit::WebInputEvent; -using WebKit::WebInputEventFactory; -using WebKit::WebKeyboardEvent; -using WebKit::WebPoint; -using WebKit::WebRect; -using WebKit::WebString; -using WebKit::WebSubstringUtil; - -// This code is copied from -// content/browser/renderer_host/render_widget_host_mac -namespace { -WebColor WebColorFromNSColor(NSColor *color) { - CGFloat r, g, b, a; - [color getRed:&r green:&g blue:&b alpha:&a]; - - return - std::max(0, std::min(static_cast(lroundf(255.0f * a)), 255)) << 24 | - std::max(0, std::min(static_cast(lroundf(255.0f * r)), 255)) << 16 | - std::max(0, std::min(static_cast(lroundf(255.0f * g)), 255)) << 8 | - std::max(0, std::min(static_cast(lroundf(255.0f * b)), 255)); -} - -// Extract underline information from an attributed string. Mostly copied from -// third_party/WebKit/Source/WebKit/mac/WebView/WebHTMLView.mm -void ExtractUnderlines( - NSAttributedString* string, - std::vector* underlines) { - int length = [[string string] length]; - int i = 0; - while (i < length) { - NSRange range; - NSDictionary* attrs = [string attributesAtIndex:i - longestEffectiveRange:&range - inRange:NSMakeRange(i, length - i)]; - if (NSNumber *style = [attrs objectForKey:NSUnderlineStyleAttributeName]) { - WebColor color = SK_ColorBLACK; - if (NSColor *colorAttr = - [attrs objectForKey:NSUnderlineColorAttributeName]) { - color = WebColorFromNSColor( - [colorAttr colorUsingColorSpaceName:NSDeviceRGBColorSpace]); - } - underlines->push_back(WebCompositionUnderline( - range.location, NSMaxRange(range), color, [style intValue] > 1)); - } - i = range.location + range.length; - } -} -} // namespace - -@implementation BrowserWebView - -@synthesize browser = browser_; -@synthesize in_setfocus = is_in_setfocus_; - -- (id)initWithFrame:(NSRect)frame { - self = [super initWithFrame:frame]; - if (self) { - trackingArea_ = - [[NSTrackingArea alloc] initWithRect:frame - options:NSTrackingMouseMoved | - NSTrackingMouseEnteredAndExited | - NSTrackingActiveInActiveApp | - NSTrackingInVisibleRect - owner:self - userInfo:nil]; - [self addTrackingArea:trackingArea_]; - } - return self; -} - -- (void) dealloc { - if (browser_) - browser_->UIT_DestroyBrowser(); - - [self removeTrackingArea:trackingArea_]; - [trackingArea_ release]; - - [super dealloc]; -} - -- (void)drawRect:(NSRect)rect { -#ifndef NDEBUG - CGContextRef context = reinterpret_cast( - [[NSGraphicsContext currentContext] graphicsPort]); - CGContextSetRGBFillColor(context, 1, 0, 1, 1); - CGContextFillRect(context, NSRectToCGRect(rect)); -#endif - - if (browser_ && browser_->UIT_GetWebView()) { - NSInteger count; - const NSRect *rects; - [self getRectsBeingDrawn:&rects count:&count]; - - SkRegion update_rgn; - for (int i = 0; i < count; i++) { - const NSRect r = rects[i]; - const float min_x = NSMinX(r); - const float max_x = NSMaxX(r); - const float min_y = NSHeight([self bounds]) - NSMaxY(r); - const float max_y = NSHeight([self bounds]) - NSMinY(r); - update_rgn.op(min_x, min_y, max_x, max_y, SkRegion::kUnion_Op); - } - - browser_->UIT_GetWebViewHost()->Paint(update_rgn); - } -} - -- (void)mouseDown:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->MouseEvent(theEvent); -} - -- (void)rightMouseDown:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->MouseEvent(theEvent); -} - -- (void)otherMouseDown:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->MouseEvent(theEvent); -} - -- (void)mouseUp:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->MouseEvent(theEvent); -} - -- (void)rightMouseUp:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->MouseEvent(theEvent); -} - -- (void)otherMouseUp:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->MouseEvent(theEvent); -} - -- (void)mouseMoved:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->MouseEvent(theEvent); -} - -- (void)mouseDragged:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->MouseEvent(theEvent); -} - -- (void)scrollWheel:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->WheelEvent(theEvent); -} - -- (void)rightMouseDragged:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->MouseEvent(theEvent); -} - -- (void)otherMouseDragged:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->MouseEvent(theEvent); -} - -- (void)mouseEntered:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->MouseEvent(theEvent); -} - -- (void)mouseExited:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->MouseEvent(theEvent); -} - -// This code is mostly copied and adapted from -// content/browser/renderer_host/render_widget_host_mac -- (void)keyDown:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->KeyEvent(theEvent); - - // Records the current marked text state, so that we can know if the marked - // text was deleted or not after handling the key down event. - BOOL oldHasMarkedText = hasMarkedText_; - - // We check if the marked text has one or less characters and a delete key is - // pressed. In such cases, we want to cancel IME composition and delete the - // marked character, so we dispatch the event directly to WebKit. - if (hasMarkedText_ && underlines_.size() <= 1) { - // Check for backspace or delete. - if ([theEvent keyCode] == 0x33 || [theEvent keyCode] == 0x75) - [self forwardKeyEventToEditor: theEvent]; - } - - textToBeInserted_.clear(); - markedText_.clear(); - underlines_.clear(); - unmarkTextCalled_ = NO; - - handlingKeyDown_ = YES; - [self interpretKeyEvents:[NSArray arrayWithObject:theEvent]]; - handlingKeyDown_ = NO; - - // Only send a corresponding key press event if there is no marked text. - // We also handle keys like backspace or delete, where the length - // of the text to be inserted is 0. - if (!hasMarkedText_ && !oldHasMarkedText && - !textToBeInserted_.length() <= 1) { - if (textToBeInserted_.length() == 1) { - // If a single character was inserted, then we just send it as a keypress - // event. - WebKeyboardEvent keyboard_event( - WebInputEventFactory::keyboardEvent(theEvent)); - keyboard_event.type = WebInputEvent::Char; - keyboard_event.text[0] = textToBeInserted_[0]; - keyboard_event.text[1] = 0; - browser_->UIT_GetWebView()->handleInputEvent(keyboard_event); - } else { - [self forwardKeyEventToEditor: theEvent]; - } - } - - // Calling KeyEvent() could have destroyed the widget. - // We perform a sanity check and return if the widget is NULL. - if (!browser_ || !browser_->UIT_GetWebView()) - return; - - BOOL textInserted = NO; - if (textToBeInserted_.length() > - ((hasMarkedText_ || oldHasMarkedText) ? 0u : 1u)) { - browser_->UIT_GetWebView()->confirmComposition(textToBeInserted_); - textInserted = YES; - } - - if (hasMarkedText_ && markedText_.length()) { - browser_->UIT_GetWebView()->setComposition(markedText_, underlines_, - selectedRange_.location, - NSMaxRange(selectedRange_)); - } else if (oldHasMarkedText && !hasMarkedText_ && !textInserted) { - if (unmarkTextCalled_) { - browser_->UIT_GetWebView()->confirmComposition(); - } else { - // Simulating a cancelComposition - browser_->UIT_GetWebView()->setComposition(EmptyString16(), underlines_, - 0, 0); - } - } -} - -- (void)forwardKeyEventToEditor: (NSEvent *)theEvent { - if ([theEvent type] != NSKeyDown) - return; - - if ([theEvent modifierFlags] & (NSNumericPadKeyMask | NSFunctionKeyMask)) { - // Don't send a Char event for non-char keys like arrows, function keys and - // clear. - switch ([theEvent keyCode]) { - case 81: // = - case 75: // / - case 67: // * - case 78: // - - case 69: // + - case 76: // Enter - case 65: // . - case 82: // 0 - case 83: // 1 - case 84: // 2 - case 85: // 3 - case 86: // 4 - case 87: // 5 - case 88: // 6 - case 89: // 7 - case 91: // 8 - case 92: // 9 - break; - default: - return; - } - } - - if (browser_ && browser_->UIT_GetWebView()) { - WebKeyboardEvent keyboard_event( - WebInputEventFactory::keyboardEvent(theEvent)); - keyboard_event.type = WebInputEvent::Char; - browser_->UIT_GetWebViewHost()->SetLastKeyEvent(keyboard_event); - browser_->UIT_GetWebView()->handleInputEvent(keyboard_event); - } -} - -- (void)keyUp:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->KeyEvent(theEvent); -} - -- (void)flagsChanged:(NSEvent *)theEvent { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebViewHost()->KeyEvent(theEvent); -} - -- (BOOL)isOpaque { - return YES; -} - -- (BOOL)canBecomeKeyView { - return browser_ && browser_->UIT_GetWebView(); -} - -- (BOOL)acceptsFirstResponder { - return browser_ && browser_->UIT_GetWebView(); -} - -- (BOOL)becomeFirstResponder { - if (browser_ && browser_->UIT_GetWebView()) { - if (!is_in_setfocus_) { - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetFocusHandler(); - if (handler.get() && - handler->OnSetFocus(browser_, FOCUS_SOURCE_SYSTEM)) { - return NO; - } - } - } - - browser_->UIT_GetWebViewHost()->SetFocus(YES); - return [super becomeFirstResponder]; - } - - return NO; -} - -- (BOOL)resignFirstResponder { - if (browser_ && browser_->UIT_GetWebView()) { - browser_->UIT_GetWebViewHost()->SetFocus(NO); - return [super resignFirstResponder]; - } - - return NO; -} - -- (void)setFrame:(NSRect)frameRect { - [super setFrame:frameRect]; - if (browser_ && browser_->UIT_GetWebView()) { - const NSRect bounds = [self bounds]; - browser_->UIT_GetWebViewHost()->SetSize(bounds.size.width, - bounds.size.height); - } -} - -- (void)undo:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->Undo(); -} - -- (void)redo:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->Redo(); -} - -- (void)cut:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->Cut(); -} - -- (void)copy:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->Copy(); -} - -- (void)paste:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->Paste(); -} - -- (void)delete:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->Delete(); -} - -- (void)selectAll:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->SelectAll(); -} - -- (void)registerDragDrop { - dropTarget_.reset([[WebDropTarget alloc] initWithWebView:self]); - - // Register the view to handle the appropriate drag types. - NSArray* types = [NSArray arrayWithObjects:NSStringPboardType, - NSHTMLPboardType, NSURLPboardType, nil]; - [self registerForDraggedTypes:types]; -} - -- (void)startDragWithDropData:(const WebDropData&)dropData - dragOperationMask:(NSDragOperation)operationMask - image:(NSImage*)image - offset:(NSPoint)offset { - dragSource_.reset([[WebDragSource alloc] - initWithWebView:self - dropData:&dropData - image:image - offset:offset - pasteboard:[NSPasteboard pasteboardWithName:NSDragPboard] - dragOperationMask:operationMask]); - [dragSource_ startDrag]; -} - -// NSPasteboardOwner methods - -- (void)pasteboard:(NSPasteboard*)sender provideDataForType:(NSString*)type { - [dragSource_ lazyWriteToPasteboard:sender - forType:type]; -} - -// NSDraggingSource methods - -// Returns what kind of drag operations are available. This is a required -// method for NSDraggingSource. -- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal { - if (dragSource_.get()) - return [dragSource_ draggingSourceOperationMaskForLocal:isLocal]; - // No web drag source - this is the case for dragging a file from the - // downloads manager. Default to copy operation. Note: It is desirable to - // allow the user to either move or copy, but this requires additional - // plumbing to update the download item's path once its moved. - return NSDragOperationCopy; -} - -// Called when a drag initiated in our view ends. -- (void)draggedImage:(NSImage*)anImage - endedAt:(NSPoint)screenPoint - operation:(NSDragOperation)operation { - [dragSource_ endDragAt:screenPoint operation:operation]; - - // Might as well throw out this object now. - dragSource_.reset(); -} - -// Called when a drag initiated in our view moves. -- (void)draggedImage:(NSImage*)draggedImage movedTo:(NSPoint)screenPoint { - [dragSource_ moveDragTo:screenPoint]; -} - -// Called when we're informed where a file should be dropped. -- (NSArray*)namesOfPromisedFilesDroppedAtDestination:(NSURL*)dropDest { - if (![dropDest isFileURL]) - return nil; - - NSString* file_name = [dragSource_ dragPromisedFileTo:[dropDest path]]; - if (!file_name) - return nil; - - return [NSArray arrayWithObject:file_name]; -} - -// NSDraggingDestination methods - -- (NSDragOperation)draggingEntered:(id)sender { - return [dropTarget_ draggingEntered:sender view:self]; -} - -- (void)draggingExited:(id)sender { - [dropTarget_ draggingExited:sender]; -} - -- (NSDragOperation)draggingUpdated:(id)sender { - return [dropTarget_ draggingUpdated:sender view:self]; -} - -- (BOOL)performDragOperation:(id)sender { - return [dropTarget_ performDragOperation:sender view:self]; -} - -// NSTextInputClient methods - -// This code is mostly copied and adapted from -// content/browser/renderer_host/render_widget_host_mac -extern "C" { - extern NSString *NSTextInputReplacementRangeAttributeName; -} - -- (NSArray *)validAttributesForMarkedText { - if (!validAttributesForMarkedText_) { - validAttributesForMarkedText_.reset([[NSArray alloc] initWithObjects: - NSUnderlineStyleAttributeName, - NSUnderlineColorAttributeName, - NSMarkedClauseSegmentAttributeName, - NSTextInputReplacementRangeAttributeName, - nil]); - } - return validAttributesForMarkedText_.get(); -} - -- (NSUInteger)characterIndexForPoint:(NSPoint)thePoint { - DCHECK([self window]); - // |thePoint| is in screen coordinates, but needs to be converted to WebKit - // coordinates (upper left origin). Scroll offsets will be taken care of in - // the renderer. - thePoint = [[self window] convertScreenToBase:thePoint]; - thePoint = [self convertPoint:thePoint fromView:nil]; - thePoint.y = NSHeight([self frame]) - thePoint.y; - - WebPoint point(thePoint.x, thePoint.y); - return (NSUInteger)browser_->UIT_GetWebView()->focusedFrame()-> - characterIndexForPoint(point); -} - -- (NSRect)firstRectForCharacterRange:(NSRange)theRange - actualRange:(NSRangePointer) actualRange { - if (actualRange) - *actualRange = theRange; - - if (!browser_ || !browser_->UIT_GetWebView() || - !browser_->UIT_GetWebView()->focusedFrame()) { - return NSMakeRect(0, 0, 0, 0); - } - - WebRect webRect; - browser_->UIT_GetWebView()->focusedFrame()->firstRectForCharacterRange( - theRange.location, theRange.length, webRect); - NSRect rect = NSMakeRect(webRect.x, webRect.y, webRect.width, webRect.height); - - // The returned rectangle is in WebKit coordinates (upper left origin), so - // flip the coordinate system and then convert it into screen coordinates for - // return. - NSRect viewFrame = [self frame]; - rect.origin.y = NSHeight(viewFrame) - rect.origin.y; - rect.origin.y -= rect.size.height; - rect = [self convertRectToBase:rect]; - rect.origin = [[self window] convertBaseToScreen:rect.origin]; - return rect; -} - -- (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)theRange - actualRange:(NSRangePointer) actualRange { - if (actualRange) - *actualRange = theRange; - - if (!browser_ || !browser_->UIT_GetWebView() || - !browser_->UIT_GetWebView()->focusedFrame()) { - return nil; - } - - return WebSubstringUtil::attributedSubstringInRange( - browser_->UIT_GetWebView()->focusedFrame(), - theRange.location, - theRange.length); -} - -- (void)doCommandBySelector:(SEL)selector { -} - -- (NSRange)markedRange { - return hasMarkedText_ ? markedRange_ : NSMakeRange(NSNotFound, 0); -} - -- (NSRange)selectedRange { - return selectedRange_; -} - -- (NSInteger)conversationIdentifier { - return reinterpret_cast(self); -} - -- (BOOL)hasMarkedText { - return hasMarkedText_; -} - -- (void)unmarkText { - hasMarkedText_ = NO; - markedText_.clear(); - underlines_.clear(); - - if (!handlingKeyDown_) { - if (browser_ && browser_->UIT_GetWebView()) - browser_->UIT_GetWebView()->confirmComposition(); - } else { - unmarkTextCalled_ = YES; - } -} - -- (void)setMarkedText:(id)string selectedRange:(NSRange)newSelRange - replacementRange: (NSRange) replacementRange { - // An input method updates the composition string. - // We send the given text and range to the renderer so it can update the - // composition node of WebKit. - BOOL isAttributedString = [string isKindOfClass:[NSAttributedString class]]; - NSString* im_text = isAttributedString ? [string string] : string; - int length = [im_text length]; - - // |markedRange_| will get set on a callback from ImeSetComposition(). - selectedRange_ = newSelRange; - markedText_ = base::SysNSStringToUTF16(im_text); - hasMarkedText_ = (length > 0); - - underlines_.clear(); - if (isAttributedString) { - ExtractUnderlines(string, &underlines_); - } else { - // Use a thin black underline by default. - underlines_.push_back( - WebCompositionUnderline(0, length, SK_ColorBLACK, false)); - } - - // If we are handling a key down event, then SetComposition() will be - // called in keyEvent: method. - // Input methods of Mac use setMarkedText calls with an empty text to cancel - // an ongoing composition. So, we should check whether or not the given text - // is empty to update the input method state. (Our input method backend can - // automatically cancels an ongoing composition when we send an empty text. - // So, it is OK to send an empty text to the renderer.) - if (!handlingKeyDown_) { - if (browser_ && browser_->UIT_GetWebView()) { - const WebString markedText(markedText_); - browser_->UIT_GetWebView()->setComposition(markedText, - underlines_, - newSelRange.location, - NSMaxRange(newSelRange)); - } - } -} - -- (void)insertText:(id)string replacementRange: (NSRange) replacementRange { - BOOL isAttributedString = [string isKindOfClass:[NSAttributedString class]]; - NSString* im_text = isAttributedString ? [string string] : string; - if (handlingKeyDown_) { - textToBeInserted_.append(base::SysNSStringToUTF16(im_text)); - } else { - browser_->UIT_GetWebViewHost()->webwidget()->confirmComposition( - base::SysNSStringToUTF16(im_text)); - } - - // Inserting text will delete all marked text automatically. - hasMarkedText_ = NO; -} - -/////////////////////////////////////////////////////////////////////////////// -// Tooltip Support -// This code is copied from -// content/browser/renderer_host/render_widget_host_view_mac.mm - -// Below is the nasty tooltip stuff -- copied from WebKit's WebHTMLView.mm -// with minor modifications for code style and commenting. -// -// The 'public' interface is -setToolTipAtMousePoint:. This differs from -// -setToolTip: in that the updated tooltip takes effect immediately, -// without the user's having to move the mouse out of and back into the view. -// -// Unfortunately, doing this requires sending fake mouseEnter/Exit events to -// the view, which in turn requires overriding some internal tracking-rect -// methods (to keep track of its owner & userdata, which need to be filled out -// in the fake events.) --snej 7/6/09 - - -/* - * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. - * (C) 2006, 2007 Graham Dennis (graham.dennis@gmail.com) - * - * 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. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE 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 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. - */ - -// Any non-zero value will do, but using something recognizable might help us -// debug some day. -static const NSTrackingRectTag kTrackingRectTag = 0xBADFACE; - -// Override of a public NSView method, replacing the inherited functionality. -// See above for rationale. -- (NSTrackingRectTag)addTrackingRect:(NSRect)rect - owner:(id)owner - userData:(void *)data - assumeInside:(BOOL)assumeInside { - DCHECK(trackingRectOwner_ == nil); - trackingRectOwner_ = owner; - trackingRectUserData_ = data; - return kTrackingRectTag; -} - -// Override of (apparently) a private NSView method(!) See above for rationale. -- (NSTrackingRectTag)_addTrackingRect:(NSRect)rect - owner:(id)owner - userData:(void *)data - assumeInside:(BOOL)assumeInside - useTrackingNum:(int)tag { - DCHECK(tag == 0 || tag == kTrackingRectTag); - DCHECK(trackingRectOwner_ == nil); - trackingRectOwner_ = owner; - trackingRectUserData_ = data; - return kTrackingRectTag; -} - -// Override of (apparently) a private NSView method(!) See above for rationale. -- (void)_addTrackingRects:(NSRect *)rects - owner:(id)owner - userDataList:(void **)userDataList - assumeInsideList:(BOOL *)assumeInsideList - trackingNums:(NSTrackingRectTag *)trackingNums - count:(int)count { - DCHECK(count == 1); - DCHECK(trackingNums[0] == 0 || trackingNums[0] == kTrackingRectTag); - DCHECK(trackingRectOwner_ == nil); - trackingRectOwner_ = owner; - trackingRectUserData_ = userDataList[0]; - trackingNums[0] = kTrackingRectTag; -} - -// Override of a public NSView method, replacing the inherited functionality. -// See above for rationale. -- (void)removeTrackingRect:(NSTrackingRectTag)tag { - if (tag == 0) - return; - - if (tag == kTrackingRectTag) { - trackingRectOwner_ = nil; - return; - } - - if (tag == lastToolTipTag_) { - [super removeTrackingRect:tag]; - lastToolTipTag_ = 0; - return; - } - - // If any other tracking rect is being removed, we don't know how it was - // created and it's possible there's a leak involved (see Radar 3500217). - NOTREACHED(); -} - -// Override of (apparently) a private NSView method(!) -- (void)_removeTrackingRects:(NSTrackingRectTag *)tags count:(int)count { - for (int i = 0; i < count; ++i) { - int tag = tags[i]; - if (tag == 0) - continue; - DCHECK(tag == kTrackingRectTag); - trackingRectOwner_ = nil; - } -} - -// Sends a fake NSMouseExited event to the view for its current tracking rect. -- (void)_sendToolTipMouseExited { - // Nothing matters except window, trackingNumber, and userData. - int windowNumber = [[self window] windowNumber]; - NSEvent* fakeEvent = [NSEvent enterExitEventWithType:NSMouseExited - location:NSMakePoint(0, 0) - modifierFlags:0 - timestamp:0 - windowNumber:windowNumber - context:NULL - eventNumber:0 - trackingNumber:kTrackingRectTag - userData:trackingRectUserData_]; - [trackingRectOwner_ mouseExited:fakeEvent]; -} - -// Sends a fake NSMouseEntered event to the view for its current tracking rect. -- (void)_sendToolTipMouseEntered { - // Nothing matters except window, trackingNumber, and userData. - int windowNumber = [[self window] windowNumber]; - NSEvent* fakeEvent = [NSEvent enterExitEventWithType:NSMouseEntered - location:NSMakePoint(0, 0) - modifierFlags:0 - timestamp:0 - windowNumber:windowNumber - context:NULL - eventNumber:0 - trackingNumber:kTrackingRectTag - userData:trackingRectUserData_]; - [trackingRectOwner_ mouseEntered:fakeEvent]; -} - -// Sets the view's current tooltip, to be displayed at the current mouse -// location. (This does not make the tooltip appear -- as usual, it only -// appears after a delay.) Pass null to remove the tooltip. -- (void)setToolTipAtMousePoint:(NSString *)string { - NSString *toolTip = [string length] == 0 ? nil : string; - if ((toolTip && toolTip_ && [toolTip isEqualToString:toolTip_]) || - (!toolTip && !toolTip_)) { - return; - } - - if (toolTip_) { - [self _sendToolTipMouseExited]; - } - - toolTip_.reset([toolTip copy]); - - if (toolTip) { - // See radar 3500217 for why we remove all tooltips - // rather than just the single one we created. - [self removeAllToolTips]; - NSRect wideOpenRect = NSMakeRect(-100000, -100000, 200000, 200000); - lastToolTipTag_ = [self addToolTipRect:wideOpenRect - owner:self - userData:NULL]; - [self _sendToolTipMouseEntered]; - } -} - -// NSView calls this to get the text when displaying the tooltip. -- (NSString *)view:(NSView *)view - stringForToolTip:(NSToolTipTag)tag - point:(NSPoint)point - userData:(void *)data { - return [[toolTip_ retain] autorelease]; -} - -@end diff --git a/cef1/libcef/browser_zoom_map.cc b/cef1/libcef/browser_zoom_map.cc deleted file mode 100644 index 2be915400..000000000 --- a/cef1/libcef/browser_zoom_map.cc +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/browser_zoom_map.h" -#include "libcef/cef_thread.h" - -ZoomMap* ZoomMap::GetInstance() { - return Singleton::get(); -} - -void ZoomMap::set(const GURL& url, double zoomLevel) { - REQUIRE_UIT(); - - if (zoomLevel == 0.) { - // Remove the entry for this host. - Map::iterator iter = map_.find(url.host()); - if (iter != map_.end()) - map_.erase(iter); - } else { - // Update the entry for this host. - map_[url.host()] = zoomLevel; - } -} - -bool ZoomMap::get(const GURL& url, double& zoomLevel) { - REQUIRE_UIT(); - - Map::const_iterator iter = map_.find(url.host()); - if (iter == map_.end()) - return false; - - zoomLevel = iter->second; - return true; -} diff --git a/cef1/libcef/browser_zoom_map.h b/cef1/libcef/browser_zoom_map.h deleted file mode 100644 index 5b4345d9a..000000000 --- a/cef1/libcef/browser_zoom_map.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that can -// be found in the LICENSE file. - -#ifndef CEF_LIBCEF_BROWSER_ZOOM_MAP_H_ -#define CEF_LIBCEF_BROWSER_ZOOM_MAP_H_ -#pragma once - -#include -#include - -#include "include/internal/cef_string.h" -#include "base/memory/singleton.h" -#include "googleurl/src/gurl.h" - -// Maps the host/domain of a URL to a zoom value. -// NOTE: This class is not thread-safe. It is assumed that the methods will be -// called from the UI thread. -class ZoomMap { - public: - // Returns the static ZoomMap instance. - static ZoomMap* GetInstance(); - - // Store |zoomLevel| with key |url|. - void set(const GURL& url, double zoomLevel); - - // Returns true if there is a |zoomLevel| keyed with |url|, false otherwise. - // |zoomLevel| is the "out" variable. - bool get(const GURL& url, double& zoomLevel); - - private: - typedef std::map Map; - Map map_; - - friend struct DefaultSingletonTraits; - - ZoomMap() {} - virtual ~ZoomMap() {} - - DISALLOW_COPY_AND_ASSIGN(ZoomMap); -}; - -#endif // CEF_LIBCEF_BROWSER_ZOOM_MAP_H_ diff --git a/cef1/libcef/cef_context.cc b/cef1/libcef/cef_context.cc deleted file mode 100644 index 1dee145dc..000000000 --- a/cef1/libcef/cef_context.cc +++ /dev/null @@ -1,615 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/cef_context.h" -#include "libcef/browser_devtools_scheme_handler.h" -#include "libcef/browser_impl.h" -#include "libcef/browser_webkit_glue.h" -#include "libcef/v8_impl.h" - -#include "base/bind.h" -#include "base/file_util.h" -#include "base/path_service.h" -#include "base/synchronization/waitable_event.h" -#include "ui/base/resource/resource_bundle.h" -#include "ui/base/ui_base_paths.h" - -#if defined(OS_MACOSX) || defined(OS_WIN) -#include "crypto/nss_util.h" -#endif - -#if defined(OS_MACOSX) -#include "base/mac/foundation_util.h" -#include "base/mac/mac_util.h" -#include "grit/webkit_resources.h" -#endif - -#if defined(OS_WIN) -#include "base/win/resource_util.h" -#endif - -// Global CefContext pointer -CefRefPtr _Context; - -namespace { - -// Used in multi-threaded message loop mode to observe shutdown of the UI -// thread. -class DestructionObserver : public base::MessageLoop::DestructionObserver { - public: - explicit DestructionObserver(base::WaitableEvent *event) : event_(event) {} - virtual void WillDestroyCurrentMessageLoop() { - base::MessageLoop::current()->RemoveDestructionObserver(this); - event_->Signal(); - delete this; - } - private: - base::WaitableEvent *event_; -}; - -#if defined(OS_WIN) - -// Helper method for retrieving a resource from a module. -base::StringPiece GetRawDataResource(HMODULE module, int resource_id) { - void* data_ptr; - size_t data_size; - return base::win::GetDataResourceFromModule(module, resource_id, &data_ptr, - &data_size) - ? base::StringPiece(static_cast(data_ptr), data_size) - : base::StringPiece(); -} - -#endif // defined(OS_WIN) - -} // namespace - - -class CefResourceBundleDelegate : public ui::ResourceBundle::Delegate { - public: - CefResourceBundleDelegate(CefContext* context) - : context_(context), - allow_pack_file_load_(false) { - } - - void set_allow_pack_file_load(bool val) { allow_pack_file_load_ = val; } - - private: - virtual base::FilePath GetPathForResourcePack( - const base::FilePath& pack_path, - ui::ScaleFactor scale_factor) OVERRIDE { - // Only allow the cef pack file to load. - if (!context_->settings().pack_loading_disabled && allow_pack_file_load_) - return pack_path; - return base::FilePath(); - } - - virtual base::FilePath GetPathForLocalePack( - const base::FilePath& pack_path, - const std::string& locale) OVERRIDE { - if (!context_->settings().pack_loading_disabled) - return pack_path; - return base::FilePath(); - } - - virtual gfx::Image GetImageNamed(int resource_id) OVERRIDE { - return gfx::Image(); - } - - virtual gfx::Image GetNativeImageNamed( - int resource_id, - ui::ResourceBundle::ImageRTL rtl) OVERRIDE { - return gfx::Image(); - } - - virtual base::RefCountedStaticMemory* LoadDataResourceBytes( - int resource_id, - ui::ScaleFactor scale_factor) OVERRIDE { - return NULL; - } - - virtual bool GetRawDataResource(int resource_id, - ui::ScaleFactor scale_factor, - base::StringPiece* value) OVERRIDE { - return false; - } - - virtual bool GetLocalizedString(int message_id, string16* value) OVERRIDE { - return false; - } - - virtual scoped_ptr GetFont( - ui::ResourceBundle::FontStyle style) OVERRIDE { - return scoped_ptr(); - } - - // CefContext pointer is guaranteed to outlive this object. - CefContext* context_; - bool allow_pack_file_load_; - - DISALLOW_COPY_AND_ASSIGN(CefResourceBundleDelegate); -}; - - -bool CefInitialize(const CefSettings& settings, CefRefPtr application) { - // Return true if the global context already exists. - if (_Context.get()) - return true; - - if (settings.size != sizeof(cef_settings_t)) { - NOTREACHED() << "invalid CefSettings structure size"; - return false; - } - - // Create the new global context object. - _Context = new CefContext(); - - // Initialize the global context. - return _Context->Initialize(settings, application); -} - -void CefShutdown() { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return; - } - - // Must always be called on the same thread as Initialize. - if (!_Context->process()->CalledOnValidThread()) { - NOTREACHED() << "called on invalid thread"; - return; - } - - // Shut down the global context. This will block until shutdown is complete. - _Context->Shutdown(); - - // Delete the global context object. - _Context = NULL; -} - -void CefDoMessageLoopWork() { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return; - } - - // Must always be called on the same thread as Initialize. - if (!_Context->process()->CalledOnValidThread()) { - NOTREACHED() << "called on invalid thread"; - return; - } - - _Context->process()->DoMessageLoopIteration(); -} - -void CefRunMessageLoop() { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return; - } - - // Must always be called on the same thread as Initialize. - if (!_Context->process()->CalledOnValidThread()) { - NOTREACHED() << "called on invalid thread"; - return; - } - - _Context->process()->RunMessageLoop(); -} - -void CefQuitMessageLoop() { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return; - } - - // Must always be called on the same thread as Initialize. - if (!_Context->process()->CalledOnValidThread()) { - NOTREACHED() << "called on invalid thread"; - return; - } - - _Context->process()->QuitMessageLoop(); -} - -void CefSetOSModalLoop(bool osModalLoop) { -#if defined(OS_WIN) - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return; - } - - if (CefThread::CurrentlyOn(CefThread::UI)) { - base::MessageLoop::current()->set_os_modal_loop(osModalLoop); - } else { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(CefSetOSModalLoop, osModalLoop)); - } -#endif // defined(OS_WIN) -} - - -// CefContext - -CefContext::CefContext() - : initialized_(false), - shutting_down_(false), - request_context_(NULL), - current_webviewhost_(NULL), - dev_tools_client_count_(0) { -} - -CefContext::~CefContext() { - if (!shutting_down_) - Shutdown(); -} - -bool CefContext::Initialize(const CefSettings& settings, - CefRefPtr application) { - settings_ = settings; - application_ = application; - - cache_path_ = base::FilePath(CefString(&settings.cache_path)); - if (!cache_path_.empty() && - !file_util::PathExists(cache_path_) && - !file_util::CreateDirectory(cache_path_)) { - NOTREACHED() << "The cache_path directory could not be created"; - cache_path_.clear(); - } - if (cache_path_.empty()) { - // Create and use a temporary directory. - if (cache_temp_dir_.CreateUniqueTempDir()) { - cache_path_ = cache_temp_dir_.path(); - } else { - NOTREACHED() << "Failed to create temporary cache_path directory"; - } - } - -#if defined(OS_MACOSX) || defined(OS_WIN) - // We want to be sure to init NSPR on the main thread. - crypto::EnsureNSPRInit(); -#endif - - process_.reset(new CefProcess(settings_.multi_threaded_message_loop)); - process_->CreateChildThreads(); - - initialized_ = true; - - // Perform DevTools scheme registration when CEF initialization is complete. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&RegisterDevToolsSchemeHandler)); - - return true; -} - -void CefContext::Shutdown() { - // Must always be called on the same thread as Initialize. - DCHECK(process_->CalledOnValidThread()); - - shutting_down_ = true; - - if (settings_.multi_threaded_message_loop) { - // Events that will be used to signal when shutdown is complete. Start in - // non-signaled mode so that the event will block. - base::WaitableEvent browser_shutdown_event(false, false); - base::WaitableEvent uithread_shutdown_event(false, false); - - // Finish shutdown on the UI thread. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefContext::UIT_FinishShutdown, this, - &browser_shutdown_event, &uithread_shutdown_event)); - - // Block until browser shutdown is complete. - browser_shutdown_event.Wait(); - - // Delete the process to destroy the child threads. - process_.reset(NULL); - - // Block until UI thread shutdown is complete. - uithread_shutdown_event.Wait(); - } else { - // Finish shutdown on the current thread, which should be the UI thread. - UIT_FinishShutdown(NULL, NULL); - - // Delete the process to destroy the child threads. - process_.reset(NULL); - } -} - -int CefContext::GetNextBrowserID() { - return next_browser_id_.GetNext() + 1; -} - -void CefContext::AddBrowser(CefRefPtr browser) { - AutoLock lock_scope(this); - - browserlist_.push_back(browser); -} - -void CefContext::RemoveBrowser(CefRefPtr browser) { - bool empty = false; - - { - AutoLock lock_scope(this); - - BrowserList::iterator it = browserlist_.begin(); - for (; it != browserlist_.end(); ++it) { - if (it->get() == browser.get()) { - browserlist_.erase(it); - break; - } - } - - if (browserlist_.empty()) - empty = true; - } - - if (empty) { - if (CefThread::CurrentlyOn(CefThread::UI)) { - webkit_glue::ClearCache(); - } else { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(webkit_glue::ClearCache)); - } - } -} - -CefRefPtr CefContext::GetBrowserByID(int id) { - AutoLock lock_scope(this); - - BrowserList::const_iterator it = browserlist_.begin(); - for (; it != browserlist_.end(); ++it) { - if (it->get()->browser_id() == id) - return it->get(); - } - - return NULL; -} - -void CefContext::InitializeResourceBundle() { -#if !defined(OS_WIN) - base::FilePath chrome_pak_file; -#endif - base::FilePath devtools_pak_file, locales_dir; - - if (!settings_.pack_loading_disabled) { - base::FilePath resources_dir_path; - if (settings_.resources_dir_path.length > 0) - resources_dir_path = base::FilePath(CefString(&settings_.resources_dir_path)); - if (resources_dir_path.empty()) - resources_dir_path = GetResourcesFilePath(); - - if (!resources_dir_path.empty()) { -#if !defined(OS_WIN) - chrome_pak_file = resources_dir_path.Append( - FILE_PATH_LITERAL("chrome.pak")); -#endif - devtools_pak_file = resources_dir_path.Append( - FILE_PATH_LITERAL("devtools_resources.pak")); - } - - if (settings_.locales_dir_path.length > 0) - locales_dir = base::FilePath(CefString(&settings_.locales_dir_path)); - - if (!locales_dir.empty()) - PathService::Override(ui::DIR_LOCALES, locales_dir); - } - - std::string locale_str = locale(); - if (locale_str.empty()) - locale_str = "en-US"; - - resource_bundle_delegate_.reset(new CefResourceBundleDelegate(this)); - const std::string loaded_locale = - ui::ResourceBundle::InitSharedInstanceWithLocale( - locale_str, resource_bundle_delegate_.get()); - if (!settings_.pack_loading_disabled) { - CHECK(!loaded_locale.empty()) << "Locale could not be found for " - << locale_str; - - resource_bundle_delegate_->set_allow_pack_file_load(true); - - // The chrome.pak file is required on non-Windows platforms. -#if !defined(OS_WIN) - if (file_util::PathExists(chrome_pak_file)) { - ResourceBundle::GetSharedInstance().AddDataPackFromPath( - chrome_pak_file, ui::SCALE_FACTOR_NONE); - } else { - NOTREACHED() << "Could not load chrome.pak"; - } -#endif - - // The devtools_resources.pak file is optional. - if (file_util::PathExists(devtools_pak_file)) { - ResourceBundle::GetSharedInstance().AddDataPackFromPath( - devtools_pak_file, ui::SCALE_FACTOR_NONE); - } - - resource_bundle_delegate_->set_allow_pack_file_load(false); - } -} - -void CefContext::CleanupResourceBundle() { - ResourceBundle::CleanupSharedInstance(); - resource_bundle_delegate_.reset(NULL); -} - -string16 CefContext::GetLocalizedString(int message_id) const { - string16 value; - - if (application_.get()) { - CefRefPtr handler = - application_->GetResourceBundleHandler(); - if (handler.get()) { - CefString cef_str; - if (handler->GetLocalizedString(message_id, cef_str)) - value = cef_str; - } - } - - if (value.empty() && !settings_.pack_loading_disabled) - value = ResourceBundle::GetSharedInstance().GetLocalizedString(message_id); - - if (value.empty()) - LOG(ERROR) << "No localized string available for id " << message_id; - - return value; -} - -base::StringPiece CefContext::GetDataResource(int resource_id) const { - base::StringPiece value; - - if (application_.get()) { - CefRefPtr handler = - application_->GetResourceBundleHandler(); - if (handler.get()) { - void* data = NULL; - size_t data_size = 0; - if (handler->GetDataResource(resource_id, data, data_size)) - value = base::StringPiece(static_cast(data), data_size); - } - } - -#if defined(OS_WIN) - if (value.empty()) { - base::FilePath file_path; - HMODULE hModule = NULL; - - // Try to load the resource from the DLL. - if (PathService::Get(base::FILE_MODULE, &file_path)) - hModule = ::GetModuleHandle(file_path.value().c_str()); - if (!hModule) - hModule = ::GetModuleHandle(NULL); - value = ::GetRawDataResource(hModule, resource_id); - } -#elif defined(OS_MACOSX) - if (value.empty()) { - 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(); - } - } - value = broken_image_data; - break; - } - 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(); - } - } - value = resize_corner_data; - break; - } - - default: - break; - } - } -#endif // defined(OS_MACOSX) - - if (value.empty() && !settings_.pack_loading_disabled) - value = ResourceBundle::GetSharedInstance().GetRawDataResource(resource_id); - - if (value.empty()) - LOG(ERROR) << "No data resource available for id " << resource_id; - - return value; -} - -base::FilePath CefContext::GetResourcesFilePath() const { -#if defined(OS_MACOSX) - // Start out with the path to the running executable. - base::FilePath execPath; - PathService::Get(base::FILE_EXE, &execPath); - - // Get the main bundle path. - base::FilePath bundlePath = base::mac::GetAppBundlePath(execPath); - - // Go into the Contents/Resources directory. - return bundlePath.Append(FILE_PATH_LITERAL("Contents")) - .Append(FILE_PATH_LITERAL("Resources")); -#else - base::FilePath pak_dir; - PathService::Get(base::DIR_MODULE, &pak_dir); - return pak_dir; -#endif -} - -std::string CefContext::locale() const { - std::string localeStr = CefString(&settings_.locale); - if (!localeStr.empty()) - return localeStr; - - return "en-US"; -} - -void CefContext::UIT_FinishShutdown( - base::WaitableEvent* browser_shutdown_event, - base::WaitableEvent* uithread_shutdown_event) { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - BrowserList list; - - { - AutoLock lock_scope(this); - if (!browserlist_.empty()) { - list = browserlist_; - browserlist_.clear(); - } - } - - // Destroy any remaining browser windows. - if (!list.empty()) { - BrowserList::iterator it = list.begin(); - for (; it != list.end(); ++it) - (*it)->UIT_DestroyBrowser(); - } - - if (uithread_shutdown_event) { - // The destruction observer will signal the UI thread shutdown event when - // the UI thread has been destroyed. - base::MessageLoop::current()->AddDestructionObserver( - new DestructionObserver(uithread_shutdown_event)); - - // Signal the browser shutdown event now. - browser_shutdown_event->Signal(); - } -} - -void CefContext::UIT_DevToolsClientCreated() { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - ++dev_tools_client_count_; -} - -void CefContext::UIT_DevToolsClientDestroyed() { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - --dev_tools_client_count_; - if (dev_tools_client_count_ == 0) { - if (settings_.uncaught_exception_stack_size > 0) { - v8::V8::SetCaptureStackTraceForUncaughtExceptions(true, - settings_.uncaught_exception_stack_size, - v8::StackTrace::kDetailed); - } - } -} diff --git a/cef1/libcef/cef_context.h b/cef1/libcef/cef_context.h deleted file mode 100644 index 095e506ce..000000000 --- a/cef1/libcef/cef_context.h +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that can -// be found in the LICENSE file. - -#ifndef CEF_LIBCEF_CEF_CONTEXT_H_ -#define CEF_LIBCEF_CEF_CONTEXT_H_ -#pragma once - -#include -#include -#include - -#include "include/cef_app.h" -#include "include/cef_base.h" -#include "libcef/browser_file_system.h" -#include "libcef/browser_request_context.h" -#include "libcef/cef_process.h" - -#include "base/at_exit.h" -#include "base/atomic_sequence_num.h" -#include "base/files/file_path.h" -#include "base/memory/ref_counted.h" -#include "base/files/scoped_temp_dir.h" -#include "base/threading/sequenced_worker_pool.h" - -class CefBrowserImpl; -class CefResourceBundleDelegate; -class WebViewHost; - -namespace base { -class WaitableEvent; -} - -class CefContext : public CefBase { - public: - typedef std::list > BrowserList; - - CefContext(); - ~CefContext(); - - // These methods will be called on the main application thread. - bool Initialize(const CefSettings& settings, CefRefPtr application); - void Shutdown(); - - // Returns true if the context is initialized. - bool initialized() { return initialized_; } - - // Returns true if the context is shutting down. - bool shutting_down() { return shutting_down_; } - - CefProcess* process() { return process_.get(); } - - int GetNextBrowserID(); - void AddBrowser(CefRefPtr browser); - void RemoveBrowser(CefRefPtr browser); - CefRefPtr GetBrowserByID(int id); - BrowserList* GetBrowserList() { return &browserlist_; } - - void InitializeResourceBundle(); - void CleanupResourceBundle(); - - string16 GetLocalizedString(int message_id) const; - base::StringPiece GetDataResource(int resource_id) const; - - base::FilePath GetResourcesFilePath() const; - - // Retrieve the path at which cache data will be stored on disk. If empty, - // cache data will be stored in-memory. - const base::FilePath& cache_path() const { return cache_path_; } - - const CefSettings& settings() const { return settings_; } - CefRefPtr application() const { return application_; } - - // Return the locale specified in CefSettings or the default value of "en-US". - std::string locale() const; - - // The BrowserRequestContext object is managed by CefProcessIOThread. - void set_request_context(BrowserRequestContext* request_context) { - request_context_ = request_context; - } - BrowserRequestContext* request_context() { return request_context_; } - - BrowserFileSystem* file_system() { return &file_system_; } - - // Used to keep track of the web view host we're dragging over. WARNING: - // this pointer should never be dereferenced. Use it only for comparing - // pointers. - WebViewHost* current_webviewhost() { return current_webviewhost_; } - void set_current_webviewhost(WebViewHost* host) { - current_webviewhost_ = host; - } - - // The SequencedWorkerPool object is managed by CefProcessUIThread. - void set_blocking_pool(base::SequencedWorkerPool* blocking_pool) { - blocking_pool_ = blocking_pool; - } - base::SequencedWorkerPool* blocking_pool() { return blocking_pool_.get(); } - - static bool ImplementsThreadSafeReferenceCounting() { return true; } - - // Keep count of DevTools windows, need to re-enable stack trace - // functionality for uncaught exceptions. - void UIT_DevToolsClientCreated(); - void UIT_DevToolsClientDestroyed(); - - private: - // Performs shutdown actions that need to occur on the UI thread before any - // threads are destroyed. - void UIT_FinishShutdown(base::WaitableEvent* browser_shutdown_event, - base::WaitableEvent* uithread_shutdown_event); - - // Track context state. - bool initialized_; - bool shutting_down_; - - // Manages the various process threads. - scoped_ptr process_; - - // Initialize the AtExitManager on the main application thread to avoid - // asserts and possible memory leaks. - base::AtExitManager at_exit_manager_; - - CefSettings settings_; - CefRefPtr application_; - base::FilePath cache_path_; - base::ScopedTempDir cache_temp_dir_; - - BrowserRequestContext* request_context_; - BrowserFileSystem file_system_; - scoped_ptr resource_bundle_delegate_; - - // Map of browsers that currently exist. - BrowserList browserlist_; - - // Used for assigning unique IDs to browser instances. - base::AtomicSequenceNumber next_browser_id_; - - WebViewHost* current_webviewhost_; - - scoped_refptr blocking_pool_; - - int dev_tools_client_count_; - - IMPLEMENT_REFCOUNTING(CefContext); - IMPLEMENT_LOCKING(CefContext); -}; - -// Global context object pointer. -extern CefRefPtr _Context; - -// Helper macro that returns true if the global context is in a valid state. -#define CONTEXT_STATE_VALID() \ - (_Context.get() && _Context->initialized() && !_Context->shutting_down()) - -#endif // CEF_LIBCEF_CEF_CONTEXT_H_ diff --git a/cef1/libcef/cef_process.cc b/cef1/libcef/cef_process.cc deleted file mode 100644 index eb34be53f..000000000 --- a/cef1/libcef/cef_process.cc +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions 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. - -#include "libcef/cef_process.h" -#include "libcef/cef_process_io_thread.h" -#include "libcef/cef_process_sub_thread.h" -#include "libcef/cef_process_ui_thread.h" - -#include "base/run_loop.h" -#include "base/synchronization/waitable_event.h" -#include "base/threading/thread.h" - -// Class used to process events on the current message loop. -class CefMessageLoopForUI : public base::MessageLoopForUI { - typedef base::MessageLoopForUI inherited; - - public: - CefMessageLoopForUI() { - } - - // Returns the MessageLoopForUI of the current thread. - static CefMessageLoopForUI* current() { - base::MessageLoop* loop = base::MessageLoop::current(); - DCHECK_EQ(base::MessageLoop::TYPE_UI, loop->type()); - return static_cast(loop); - } - - // Do a single interation of the UI message loop. - void DoMessageLoopIteration() { - base::RunLoop run_loop; - run_loop.RunUntilIdle(); - } - - // Run the UI message loop. - void RunMessageLoop() { - Run(); - } - - private: - DISALLOW_COPY_AND_ASSIGN(CefMessageLoopForUI); -}; - -CefProcess::CefProcess(bool multi_threaded_message_loop) - : multi_threaded_message_loop_(multi_threaded_message_loop), - created_ui_thread_(false), - created_io_thread_(false), - created_file_thread_(false) { -} - -CefProcess::~CefProcess() { - // Terminate the IO thread. - io_thread_.reset(); - - // Terminate the FILE thread. - file_thread_.reset(); - - if (!multi_threaded_message_loop_) { - // Must explicitly clean up the UI thread. - ui_thread_->CleanUp(); - - // Terminate the UI thread. - ui_thread_.reset(); - - // Terminate the message loop. - ui_message_loop_.reset(); - } -} - -void CefProcess::DoMessageLoopIteration() { - DCHECK(CalledOnValidThread() && ui_message_loop_.get() != NULL); - ui_message_loop_->DoMessageLoopIteration(); -} - -void CefProcess::RunMessageLoop() { - DCHECK(CalledOnValidThread() && ui_message_loop_.get() != NULL); - ui_message_loop_->RunMessageLoop(); -} - -void CefProcess::QuitMessageLoop() { - DCHECK(CalledOnValidThread() && ui_message_loop_.get() != NULL); - ui_message_loop_->Quit(); -} - -void CefProcess::CreateUIThread() { - DCHECK(!created_ui_thread_ && ui_thread_.get() == NULL); - created_ui_thread_ = true; - - scoped_ptr thread; - if (multi_threaded_message_loop_) { - // Create the message loop on a new thread. - thread.reset(new CefProcessUIThread()); - base::Thread::Options options; - options.message_loop_type = base::MessageLoop::TYPE_UI; - if (!thread->StartWithOptions(options)) - return; - } else { - // Create the message loop on the current (main application) thread. - ui_message_loop_.reset(new CefMessageLoopForUI()); - thread.reset( - new CefProcessUIThread(ui_message_loop_.get())); - - // Must explicitly initialize the UI thread. - thread->Init(); - } - - ui_thread_.swap(thread); -} - -void CefProcess::CreateIOThread() { - DCHECK(!created_io_thread_ && io_thread_.get() == NULL); - created_io_thread_ = true; - - scoped_ptr thread(new CefProcessIOThread()); - base::Thread::Options options; - options.message_loop_type = base::MessageLoop::TYPE_IO; - if (!thread->StartWithOptions(options)) - return; - io_thread_.swap(thread); -} - -void CefProcess::CreateFileThread() { - DCHECK(!created_file_thread_ && file_thread_.get() == NULL); - created_file_thread_ = true; - - scoped_ptr thread(new CefProcessSubThread(CefThread::FILE)); - base::Thread::Options options; - options.message_loop_type = base::MessageLoop::TYPE_IO; - if (!thread->StartWithOptions(options)) - return; - file_thread_.swap(thread); -} diff --git a/cef1/libcef/cef_process.h b/cef1/libcef/cef_process.h deleted file mode 100644 index 81c4c7a57..000000000 --- a/cef1/libcef/cef_process.h +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions 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. - -// This interface is for managing the global services of the application. Each -// service is lazily created when requested the first time. The service getters -// will return NULL if the service is not available, so callers must check for -// this condition. - -#ifndef CEF_LIBCEF_CEF_PROCESS_H_ -#define CEF_LIBCEF_CEF_PROCESS_H_ -#pragma once - -#include -#include - -#include "base/basictypes.h" -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" -#include "base/message_loop.h" -#include "base/threading/non_thread_safe.h" -#include "ipc/ipc_message.h" - -namespace base { -class Thread; -class WaitableEvent; -} - -class CefProcessIOThread; -class CefProcessUIThread; -class CefMessageLoopForUI; - -// NOT THREAD SAFE, call only from the main thread. -// These functions shouldn't return NULL unless otherwise noted. -class CefProcess : public base::NonThreadSafe { - public: - explicit CefProcess(bool multi_threaded_message_loop); - virtual ~CefProcess(); - - // Creates key child threads. We need to do this explicitly since - // CefThread::PostTask silently deletes a posted task if the target message - // loop isn't created. - void CreateChildThreads() { - ui_thread(); - // Create the FILE thread before the IO thread because IO thread - // initialization depends on existance of the FILE thread (for cache - // support, etc). - file_thread(); - io_thread(); - } - - CefProcessUIThread* ui_thread() { - DCHECK(CalledOnValidThread()); - if (!created_ui_thread_) - CreateUIThread(); - return ui_thread_.get(); - } - - // Do a single iteration of the UI message loop on the current thread. If - // RunMessageLoop() was called you do not need to call this method. - void DoMessageLoopIteration(); - - // Run the UI message loop on the current thread. - void RunMessageLoop(); - - // Quit the UI message loop on the current thread. - void QuitMessageLoop(); - - // Returns the thread that we perform I/O coordination on (network requests, - // communication with renderers, etc. - // NOTE: You should ONLY use this to pass to IPC or other objects which must - // need a MessageLoop*. If you just want to post a task, use - // CefThread::PostTask (or other variants) as they take care of checking - // that a thread is still alive, race conditions, lifetime differences etc. - // If you still must use this, need to check the return value for NULL. - CefProcessIOThread* io_thread() { - DCHECK(CalledOnValidThread()); - if (!created_io_thread_) - CreateIOThread(); - return io_thread_.get(); - } - - // Returns the thread that we perform random file operations on. For code - // that wants to do I/O operations (not network requests or even file: URL - // requests), this is the thread to use to avoid blocking the UI thread. - // It might be nicer to have a thread pool for this kind of thing. - base::Thread* file_thread() { - DCHECK(CalledOnValidThread()); - if (!created_file_thread_) - CreateFileThread(); - return file_thread_.get(); - } - -#if defined(IPC_MESSAGE_LOG_ENABLED) - // Enable or disable IPC logging for the browser, all processes - // derived from ChildProcess (plugin etc), and all - // renderers. - void SetIPCLoggingEnabled(bool enable); -#endif - - private: - void CreateUIThread(); - void CreateIOThread(); - void CreateFileThread(); - - bool multi_threaded_message_loop_; - - bool created_ui_thread_; - scoped_ptr ui_thread_; - scoped_ptr ui_message_loop_; - - bool created_io_thread_; - scoped_ptr io_thread_; - - bool created_file_thread_; - scoped_ptr file_thread_; - - DISALLOW_COPY_AND_ASSIGN(CefProcess); -}; - -#endif // CEF_LIBCEF_CEF_PROCESS_H_ diff --git a/cef1/libcef/cef_process_io_thread.cc b/cef1/libcef/cef_process_io_thread.cc deleted file mode 100644 index c8be90cb4..000000000 --- a/cef1/libcef/cef_process_io_thread.cc +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions 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. - -#include "libcef/cef_process_io_thread.h" - -#include "libcef/cef_context.h" -#include "libcef/browser_appcache_system.h" -#include "libcef/browser_file_writer.h" -#include "libcef/browser_network_delegate.h" -#include "libcef/browser_resource_loader_bridge.h" -#include "libcef/browser_socket_stream_bridge.h" -#include "libcef/browser_webblobregistry_impl.h" - -#include "build/build_config.h" -#include "base/compiler_specific.h" -#include "net/socket/client_socket_pool_manager.h" - -#if defined(OS_WIN) -#include // NOLINT(build/include_order) -#endif - -CefProcessIOThread::CefProcessIOThread() - : CefThread(CefThread::IO), request_context_(NULL) {} - -CefProcessIOThread::CefProcessIOThread(base::MessageLoop* message_loop) - : CefThread(CefThread::IO, message_loop), request_context_(NULL) {} - -CefProcessIOThread::~CefProcessIOThread() { - // We cannot rely on our base class to stop the thread since we want our - // CleanUp function to run. - Stop(); -} - -void CefProcessIOThread::Init() { - CefThread::Init(); - - base::FilePath cache_path(_Context->cache_path()); - request_context_.reset(new BrowserRequestContext(cache_path, - net::HttpCache::NORMAL, false)); - _Context->set_request_context(request_context_.get()); - - network_delegate_.reset(new BrowserNetworkDelegate()); - request_context_->set_network_delegate(network_delegate_.get()); - - BrowserAppCacheSystem::InitializeOnIOThread(request_context_.get()); - BrowserFileWriter::InitializeOnIOThread(request_context_.get()); - BrowserFileSystem::InitializeOnIOThread( - request_context_->blob_storage_controller()); - BrowserSocketStreamBridge::InitializeOnIOThread(request_context_.get()); - BrowserWebBlobRegistryImpl::InitializeOnIOThread( - request_context_->blob_storage_controller()); -} - -void CefProcessIOThread::CleanUp() { - // Flush any remaining messages. This ensures that any accumulated - // Task objects get destroyed before we exit, which avoids noise in - // purify leak-test results. - base::MessageLoop::current()->RunUntilIdle(); - - // In reverse order of initialization. - BrowserWebBlobRegistryImpl::Cleanup(); - BrowserSocketStreamBridge::Cleanup(); - BrowserFileSystem::CleanupOnIOThread(); - BrowserFileWriter::CleanupOnIOThread(); - BrowserAppCacheSystem::CleanupOnIOThread(); - - _Context->set_request_context(NULL); - - request_context_->set_network_delegate(NULL); - network_delegate_.reset(NULL); - - _Context->set_request_context(NULL); - request_context_.reset(NULL); - - CefThread::Cleanup(); -} diff --git a/cef1/libcef/cef_process_io_thread.h b/cef1/libcef/cef_process_io_thread.h deleted file mode 100644 index 1b2802042..000000000 --- a/cef1/libcef/cef_process_io_thread.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions 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. - -#ifndef CEF_LIBCEF_CEF_PROCESS_IO_THREAD_H_ -#define CEF_LIBCEF_CEF_PROCESS_IO_THREAD_H_ -#pragma once - -#include "libcef/browser_request_context.h" -#include "libcef/cef_thread.h" - -#include "base/basictypes.h" - -namespace net { -class NetworkDelegate; -} - -// ---------------------------------------------------------------------------- -// CefProcessIOThread -// -// This simple thread object is used for the specialized threads that the -// CefProcess spins up. -// -// Applications must initialize the COM library before they can call -// COM library functions other than CoGetMalloc and memory allocation -// functions, so this class initializes COM for those users. -class CefProcessIOThread : public CefThread { - public: - CefProcessIOThread(); - explicit CefProcessIOThread(base::MessageLoop* message_loop); - virtual ~CefProcessIOThread(); - - BrowserRequestContext* request_context() { return request_context_.get(); } - - protected: - virtual void Init(); - virtual void CleanUp(); - - scoped_ptr request_context_; - scoped_ptr network_delegate_; - - DISALLOW_COPY_AND_ASSIGN(CefProcessIOThread); -}; - -#endif // CEF_LIBCEF_CEF_PROCESS_IO_THREAD_H_ diff --git a/cef1/libcef/cef_process_sub_thread.cc b/cef1/libcef/cef_process_sub_thread.cc deleted file mode 100644 index abd2dd029..000000000 --- a/cef1/libcef/cef_process_sub_thread.cc +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions 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. - -#include "libcef/cef_process_sub_thread.h" - -#include "build/build_config.h" -#include "base/compiler_specific.h" - -CefProcessSubThread::CefProcessSubThread(CefThread::ID identifier) - : CefThread(identifier) {} - -CefProcessSubThread::CefProcessSubThread(CefThread::ID identifier, - base::MessageLoop* message_loop) - : CefThread(identifier, message_loop) {} - -CefProcessSubThread::~CefProcessSubThread() { - // We cannot rely on our base class to stop the thread since we want our - // CleanUp function to run. - Stop(); -} - -void CefProcessSubThread::CleanUp() { - // Flush any remaining messages. This ensures that any accumulated - // Task objects get destroyed before we exit, which avoids noise in - // purify leak-test results. - base::MessageLoop::current()->RunUntilIdle(); - - CefThread::Cleanup(); -} diff --git a/cef1/libcef/cef_process_sub_thread.h b/cef1/libcef/cef_process_sub_thread.h deleted file mode 100644 index efc2b04dc..000000000 --- a/cef1/libcef/cef_process_sub_thread.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions 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. - -#ifndef CEF_LIBCEF_CEF_PROCESS_SUB_THREAD_H_ -#define CEF_LIBCEF_CEF_PROCESS_SUB_THREAD_H_ -#pragma once - -#include "libcef/cef_thread.h" - -#include "base/basictypes.h" - -// ---------------------------------------------------------------------------- -// CefProcessSubThread -// -// This simple thread object is used for the specialized threads that the -// CefProcess spins up. -// -// Applications must initialize the COM library before they can call -// COM library functions other than CoGetMalloc and memory allocation -// functions, so this class initializes COM for those users. -class CefProcessSubThread : public CefThread { - public: - explicit CefProcessSubThread(CefThread::ID identifier); - CefProcessSubThread(CefThread::ID identifier, - base::MessageLoop* message_loop); - virtual ~CefProcessSubThread(); - - protected: - virtual void CleanUp(); - - private: - DISALLOW_COPY_AND_ASSIGN(CefProcessSubThread); -}; - -#endif // CEF_LIBCEF_CEF_PROCESS_SUB_THREAD_H_ diff --git a/cef1/libcef/cef_process_ui_thread.cc b/cef1/libcef/cef_process_ui_thread.cc deleted file mode 100644 index 1a599b870..000000000 --- a/cef1/libcef/cef_process_ui_thread.cc +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions 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. - -#include "libcef/cef_process_ui_thread.h" - -#include - -#include "include/cef_version.h" -#include "libcef/browser_devtools_scheme_handler.h" -#include "libcef/browser_webkit_glue.h" -#include "libcef/browser_webkit_init.h" -#include "libcef/cef_context.h" -#include "libcef/scheme_registrar_impl.h" -#include "libcef/v8_impl.h" - -#include "base/bind.h" -#include "base/command_line.h" -#include "base/i18n/icu_util.h" -#include "base/metrics/stats_table.h" -#include "base/rand_util.h" -#include "base/string_number_conversions.h" -#include "base/stringprintf.h" -#include "build/build_config.h" -#include "net/base/net_module.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebNetworkStateNotifier.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptController.h" -#include "ui/base/ui_base_paths.h" -#include "ui/gl/gl_implementation.h" -#include "webkit/glue/webkit_glue.h" -#include "webkit/plugins/npapi/plugin_list.h" -#include "webkit/user_agent/user_agent.h" -#include "webkit/user_agent/user_agent_util.h" - -#if defined(OS_WIN) -#include // NOLINT(build/include_order) -#include // NOLINT(build/include_order) -#endif - -namespace { - -static const char* kStatsFilePrefix = "libcef_"; -static int kStatsFileThreads = 20; -static int kStatsFileCounters = 200; - -base::StringPiece ResourceProvider(int resource_id) { - return _Context->GetDataResource(resource_id); -} - -} // namespace - -CefProcessUIThread::CefProcessUIThread() - : CefThread(CefThread::UI), statstable_(NULL), webkit_init_(NULL) {} - -CefProcessUIThread::CefProcessUIThread(base::MessageLoop* message_loop) - : CefThread(CefThread::UI, message_loop), statstable_(NULL), - webkit_init_(NULL) {} - -CefProcessUIThread::~CefProcessUIThread() { - // We cannot rely on our base class to stop the thread since we want our - // CleanUp function to run. - Stop(); -} - -void CefProcessUIThread::Init() { - // Initialize the global CommandLine object. - CommandLine::Init(0, NULL); - - // Create the blocking I/O pool before other threads. - CefThread::CreateThreadPool(); - - const CefSettings& settings = _Context->settings(); - - // Initialize logging. - logging::LoggingDestination logging_dest; - if (settings.log_severity == LOGSEVERITY_DISABLE) { - logging_dest = logging::LOG_NONE; - } else { - logging_dest = logging::LOG_TO_BOTH_FILE_AND_SYSTEM_DEBUG_LOG; - logging::SetMinLogLevel(settings.log_severity); - } - - base::FilePath log_file = base::FilePath(CefString(&settings.log_file)); - logging::DcheckState dcheck_state = - logging::DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS; - if (settings.release_dcheck_enabled) - dcheck_state = logging::ENABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS; - - logging::InitLogging(log_file.value().c_str(), logging_dest, - logging::DONT_LOCK_LOG_FILE, logging::APPEND_TO_OLD_LOG_FILE, - dcheck_state); - - CefRefPtr schemeRegistrar( - new CefSchemeRegistrarImpl()); - - CefRefPtr app = _Context->application(); - if (app.get()) - app->OnRegisterCustomSchemes(schemeRegistrar.get()); - - // Add built-in schemes. - schemeRegistrar->AddCustomScheme(kChromeDevToolsScheme, true, false, true); - - // No references to the registar should be kept. - schemeRegistrar->Detach(); - DCHECK(schemeRegistrar->VerifyRefCount()); - - // Load ICU data tables. - bool ret = icu_util::Initialize(); - if (!ret) { -#if defined(OS_WIN) - MessageBox(NULL, L"Failed to load the required icudt library", - L"CEF Initialization Error", MB_ICONERROR | MB_OK); -#endif - return; - } - - // Provides path resolution required for locating locale pack files. - ui::RegisterPathProvider(); - - _Context->InitializeResourceBundle(); - - PlatformInit(); - - // Initialize the blocking pool. - blocking_pool_ = new base::SequencedWorkerPool(3, "BrowserBlocking"); - _Context->set_blocking_pool(blocking_pool_.get()); - - // Initialize WebKit. - webkit_init_ = new BrowserWebKitInit(); - - // Initialize WebKit encodings - webkit_glue::InitializeTextEncoding(); - - // Register custom schemes with WebKit. - schemeRegistrar->RegisterWithWebKit(); - - // Config the network module so it has access to a limited set of resources. - net::NetModule::SetResourceProvider(ResourceProvider); - - // Load and initialize the stats table. Attempt to construct a somewhat - // unique name to isolate separate instances from each other. - statstable_ = new base::StatsTable( - kStatsFilePrefix + base::Uint64ToString(base::RandUint64()), - kStatsFileThreads, - kStatsFileCounters); - base::StatsTable::set_current(statstable_); - - if (settings.javascript_flags.length > 0) { - // Pass the JavaScript flags to V8. - webkit_glue::SetJavaScriptFlags(CefString(&settings.javascript_flags)); - } - - if (settings.uncaught_exception_stack_size > 0) { - v8::V8::AddMessageListener(&CefV8MessageHandler); - v8::V8::SetCaptureStackTraceForUncaughtExceptions(true, - settings.uncaught_exception_stack_size, - v8::StackTrace::kDetailed); - } - -#if defined(OS_WIN) - if (settings.graphics_implementation == ANGLE_IN_PROCESS || - settings.graphics_implementation == ANGLE_IN_PROCESS_COMMAND_BUFFER) { - gfx::InitializeGLBindings(gfx::kGLImplementationEGLGLES2); - } else { - gfx::InitializeGLBindings(gfx::kGLImplementationDesktopGL); - } -#else - gfx::InitializeGLBindings(gfx::kGLImplementationDesktopGL); -#endif - - if (settings.user_agent.length > 0) { - webkit_glue::SetUserAgent(CefString(&settings.user_agent), false); - } else { - std::string product_version; - - if (settings.product_version.length > 0) { - product_version = CefString(&settings.product_version).ToString(); - } else { - product_version = base::StringPrintf("Chrome/%d.%d.%d.%d", - CHROME_VERSION_MAJOR, CHROME_VERSION_MINOR, CHROME_VERSION_BUILD, - CHROME_VERSION_PATCH); - } - - webkit_glue::SetUserAgent( - webkit_glue::BuildUserAgentFromProduct(product_version), false); - } - - if (settings.extra_plugin_paths) { - cef_string_t str; - memset(&str, 0, sizeof(str)); - - base::FilePath path; - int size = cef_string_list_size(settings.extra_plugin_paths); - for (int i = 0; i < size; ++i) { - if (!cef_string_list_value(settings.extra_plugin_paths, i, &str)) - continue; - path = base::FilePath(CefString(&str)); - webkit::npapi::PluginList::Singleton()->AddExtraPluginPath(path); - } - } - - // Create a network change notifier before starting the IO & File threads. - network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); - - // Add a listener for OnConnectionTypeChanged to notify WebKit of changes. - net::NetworkChangeNotifier::AddConnectionTypeObserver(this); - - // Initialize WebKit with the current state. - WebKit::WebNetworkStateNotifier::setOnLine( - !net::NetworkChangeNotifier::IsOffline()); -} - -void CefProcessUIThread::CleanUp() { - // Flush any remaining messages. This ensures that any accumulated - // Task objects get destroyed before we exit, which avoids noise in - // purify leak-test results. - base::MessageLoop::current()->RunUntilIdle(); - - // Tear down the shared StatsTable. - base::StatsTable::set_current(NULL); - delete statstable_; - statstable_ = NULL; - - // Shut down WebKit. - delete webkit_init_; - webkit_init_ = NULL; - - // Release the network change notifier after all other threads end. - net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); - network_change_notifier_.reset(); - - // Shut down the blocking pool. - _Context->set_blocking_pool(NULL); - blocking_pool_->Shutdown(); - blocking_pool_ = NULL; - - PlatformCleanUp(); - - _Context->CleanupResourceBundle(); - - // Close the blocking I/O pool after the other threads. Other threads such - // as the I/O thread may need to schedule work like closing files or flushing - // data during shutdown, so the blocking pool needs to be available. There - // may also be slow operations pending that will blcok shutdown, so closing - // it here (which will block until required operations are complete) gives - // more head start for those operations to finish. - CefThread::ShutdownThreadPool(); -} - -void CefProcessUIThread::OnConnectionTypeChanged( - net::NetworkChangeNotifier::ConnectionType type) { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - WebKit::WebNetworkStateNotifier::setOnLine( - type != net::NetworkChangeNotifier::CONNECTION_NONE); -} - diff --git a/cef1/libcef/cef_process_ui_thread.h b/cef1/libcef/cef_process_ui_thread.h deleted file mode 100644 index c3a51f021..000000000 --- a/cef1/libcef/cef_process_ui_thread.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions 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. - -#ifndef CEF_LIBCEF_CEF_PROCESS_UI_THREAD_H_ -#define CEF_LIBCEF_CEF_PROCESS_UI_THREAD_H_ -#pragma once - -#include "libcef/cef_thread.h" - -#include "base/basictypes.h" -#include "base/memory/scoped_ptr.h" -#include "base/threading/sequenced_worker_pool.h" -#include "net/base/network_change_notifier.h" - -class BrowserWebKitInit; -namespace base { -class StatsTable; -} - -// ---------------------------------------------------------------------------- -// CefProcessUIThread -// -// This simple thread object is used for the specialized threads that the -// CefProcess spins up. -// -// Applications must initialize the COM library before they can call -// COM library functions other than CoGetMalloc and memory allocation -// functions, so this class initializes COM for those users. -class CefProcessUIThread - : public net::NetworkChangeNotifier::ConnectionTypeObserver, - public CefThread { - public: - CefProcessUIThread(); - explicit CefProcessUIThread(base::MessageLoop* message_loop); - virtual ~CefProcessUIThread(); - - virtual void Init(); - virtual void CleanUp(); - - private: - void PlatformInit(); - void PlatformCleanUp(); - - // From net::NetworkChangeNotifier::ConnectionTypeObserver - virtual void OnConnectionTypeChanged( - net::NetworkChangeNotifier::ConnectionType type); - - base::StatsTable* statstable_; - - // WebKit implementation class. - BrowserWebKitInit* webkit_init_; - - scoped_ptr network_change_notifier_; - - scoped_refptr blocking_pool_; - - DISALLOW_COPY_AND_ASSIGN(CefProcessUIThread); -}; - -#endif // CEF_LIBCEF_CEF_PROCESS_UI_THREAD_H_ diff --git a/cef1/libcef/cef_process_ui_thread_gtk.cc b/cef1/libcef/cef_process_ui_thread_gtk.cc deleted file mode 100644 index 40b1593fe..000000000 --- a/cef1/libcef/cef_process_ui_thread_gtk.cc +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/cef_process_ui_thread.h" -#include "libcef/browser_impl.h" - -void CefProcessUIThread::PlatformInit() { -} - -void CefProcessUIThread::PlatformCleanUp() { -} - diff --git a/cef1/libcef/cef_process_ui_thread_mac.mm b/cef1/libcef/cef_process_ui_thread_mac.mm deleted file mode 100644 index f4c93c9df..000000000 --- a/cef1/libcef/cef_process_ui_thread_mac.mm +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions 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 - -#import "include/cef_application_mac.h" -#include "libcef/cef_process_ui_thread.h" -#include "libcef/browser_webkit_glue.h" -#include "libcef/cef_context.h" -#include "base/command_line.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/base/ui_base_switches.h" - -void CefProcessUIThread::PlatformInit() { - // The NSApplication instance must implement the CefAppProtocol protocol. - DCHECK([[NSApplication sharedApplication] - conformsToProtocol:@protocol(CefAppProtocol)]); - - // On Mac, the select popup menus are rendered by the browser. - WebKit::WebView::setUseExternalPopupMenus(true); - - // Core Animation mode for plugins is not supported. - CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kDisableCoreAnimationPlugins); -} - -void CefProcessUIThread::PlatformCleanUp() { -} diff --git a/cef1/libcef/cef_process_ui_thread_win.cc b/cef1/libcef/cef_process_ui_thread_win.cc deleted file mode 100644 index 206f52731..000000000 --- a/cef1/libcef/cef_process_ui_thread_win.cc +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions 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. - -#include "libcef/cef_process_ui_thread.h" - -#include -#include - -#include "libcef/browser_impl.h" - -void CefProcessUIThread::PlatformInit() { - HRESULT res; - - // Initialize common controls - res = CoInitialize(NULL); - DCHECK(SUCCEEDED(res)); - INITCOMMONCONTROLSEX InitCtrlEx; - InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); - InitCtrlEx.dwICC = ICC_STANDARD_CLASSES; - InitCommonControlsEx(&InitCtrlEx); - - // Start COM stuff - res = OleInitialize(NULL); - DCHECK(SUCCEEDED(res)); - - // Register the window class - WNDCLASSEX wcex = { - /* cbSize = */ sizeof(WNDCLASSEX), - /* style = */ CS_HREDRAW | CS_VREDRAW, - /* lpfnWndProc = */ CefBrowserImpl::WndProc, - /* cbClsExtra = */ 0, - /* cbWndExtra = */ 0, - /* hInstance = */ ::GetModuleHandle(NULL), - /* hIcon = */ NULL, - /* hCursor = */ LoadCursor(NULL, IDC_ARROW), - /* hbrBackground = */ 0, - /* lpszMenuName = */ NULL, - /* lpszClassName = */ CefBrowserImpl::GetWndClass(), - /* hIconSm = */ NULL, - }; - RegisterClassEx(&wcex); -} - -void CefProcessUIThread::PlatformCleanUp() { - // Uninitialize COM stuff - OleUninitialize(); - - // Closes the COM library on the current thread. CoInitialize must - // be balanced by a corresponding call to CoUninitialize. - CoUninitialize(); -} - diff --git a/cef1/libcef/cef_string_list.cc b/cef1/libcef/cef_string_list.cc deleted file mode 100644 index fbc2b2ce1..000000000 --- a/cef1/libcef/cef_string_list.cc +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework 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 -#include "include/internal/cef_string_list.h" -#include "base/logging.h" - -typedef std::vector StringList; - -CEF_EXPORT cef_string_list_t cef_string_list_alloc() { - return new StringList; -} - -CEF_EXPORT int cef_string_list_size(cef_string_list_t list) { - DCHECK(list); - StringList* impl = reinterpret_cast(list); - return impl->size(); -} - -CEF_EXPORT int cef_string_list_value(cef_string_list_t list, int index, - cef_string_t* value) { - DCHECK(list); - DCHECK(value); - StringList* impl = reinterpret_cast(list); - DCHECK_GE(index, 0); - DCHECK_LT(index, static_cast(impl->size())); - if (index < 0 || index >= static_cast(impl->size())) - return false; - const CefString& str = (*impl)[index]; - return cef_string_copy(str.c_str(), str.length(), value); -} - -CEF_EXPORT void cef_string_list_append(cef_string_list_t list, - const cef_string_t* value) { - DCHECK(list); - DCHECK(value); - StringList* impl = reinterpret_cast(list); - impl->push_back(CefString(value)); -} - -CEF_EXPORT void cef_string_list_clear(cef_string_list_t list) { - DCHECK(list); - StringList* impl = reinterpret_cast(list); - impl->clear(); -} - -CEF_EXPORT void cef_string_list_free(cef_string_list_t list) { - DCHECK(list); - StringList* impl = reinterpret_cast(list); - delete impl; -} - -CEF_EXPORT cef_string_list_t cef_string_list_copy(cef_string_list_t list) { - DCHECK(list); - StringList* impl = reinterpret_cast(list); - return new StringList(*impl); -} diff --git a/cef1/libcef/cef_string_map.cc b/cef1/libcef/cef_string_map.cc deleted file mode 100644 index 9538ab05e..000000000 --- a/cef1/libcef/cef_string_map.cc +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework 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 -#include "include/internal/cef_string_map.h" -#include "base/logging.h" - -typedef std::map StringMap; - -CEF_EXPORT cef_string_map_t cef_string_map_alloc() { - return new StringMap; -} - -CEF_EXPORT int cef_string_map_size(cef_string_map_t map) { - DCHECK(map); - StringMap* impl = reinterpret_cast(map); - return impl->size(); -} - -CEF_EXPORT int cef_string_map_find(cef_string_map_t map, - const cef_string_t* key, - cef_string_t* value) { - DCHECK(map); - DCHECK(value); - StringMap* impl = reinterpret_cast(map); - StringMap::const_iterator it = impl->find(CefString(key)); - if (it == impl->end()) - return 0; - - const CefString& val = it->second; - return cef_string_set(val.c_str(), val.length(), value, true); -} - -CEF_EXPORT int cef_string_map_key(cef_string_map_t map, int index, - cef_string_t* key) { - DCHECK(map); - DCHECK(key); - StringMap* impl = reinterpret_cast(map); - DCHECK_GE(index, 0); - DCHECK_LT(index, static_cast(impl->size())); - if (index < 0 || index >= static_cast(impl->size())) - return 0; - - StringMap::const_iterator it = impl->begin(); - for (int ct = 0; it != impl->end(); ++it, ct++) { - if (ct == index) - return cef_string_set(it->first.c_str(), it->first.length(), key, true); - } - return 0; -} - -CEF_EXPORT int cef_string_map_value(cef_string_map_t map, int index, - cef_string_t* value) { - DCHECK(map); - DCHECK(value); - StringMap* impl = reinterpret_cast(map); - DCHECK_GE(index, 0); - DCHECK_LT(index, static_cast(impl->size())); - if (index < 0 || index >= static_cast(impl->size())) - return 0; - - StringMap::const_iterator it = impl->begin(); - for (int ct = 0; it != impl->end(); ++it, ct++) { - if (ct == index) { - return cef_string_set(it->second.c_str(), it->second.length(), value, - true); - } - } - return 0; -} - -CEF_EXPORT int cef_string_map_append(cef_string_map_t map, - const cef_string_t* key, - const cef_string_t* value) { - DCHECK(map); - StringMap* impl = reinterpret_cast(map); - impl->insert(std::make_pair(CefString(key), CefString(value))); - return 1; -} - -CEF_EXPORT void cef_string_map_clear(cef_string_map_t map) { - DCHECK(map); - StringMap* impl = reinterpret_cast(map); - impl->clear(); -} - -CEF_EXPORT void cef_string_map_free(cef_string_map_t map) { - DCHECK(map); - StringMap* impl = reinterpret_cast(map); - delete impl; -} diff --git a/cef1/libcef/cef_string_multimap.cc b/cef1/libcef/cef_string_multimap.cc deleted file mode 100644 index 1daf4a8a9..000000000 --- a/cef1/libcef/cef_string_multimap.cc +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 -#include "include/internal/cef_string_multimap.h" -#include "base/logging.h" - -typedef std::multimap StringMultimap; - -CEF_EXPORT cef_string_multimap_t cef_string_multimap_alloc() { - return new StringMultimap; -} - -CEF_EXPORT int cef_string_multimap_size(cef_string_multimap_t map) { - DCHECK(map); - StringMultimap* impl = reinterpret_cast(map); - return impl->size(); -} - -CEF_EXPORT int cef_string_multimap_find_count(cef_string_multimap_t map, - const cef_string_t* key) { - DCHECK(map); - DCHECK(key); - StringMultimap* impl = reinterpret_cast(map); - return impl->count(CefString(key)); -} - -CEF_EXPORT int cef_string_multimap_enumerate(cef_string_multimap_t map, - const cef_string_t* key, - int value_index, - cef_string_t* value) { - DCHECK(map); - DCHECK(key); - DCHECK(value); - - StringMultimap* impl = reinterpret_cast(map); - CefString key_str(key); - - DCHECK_GE(value_index, 0); - DCHECK_LT(value_index, static_cast(impl->count(key_str))); - if (value_index < 0 || value_index >= static_cast(impl->count(key_str))) - return 0; - - std::pair range_it = - impl->equal_range(key_str); - - int count = value_index; - while (count-- && range_it.first != range_it.second) - range_it.first++; - - if (range_it.first == range_it.second) - return 0; - - const CefString& val = range_it.first->second; - return cef_string_set(val.c_str(), val.length(), value, true); -} - -CEF_EXPORT int cef_string_multimap_key(cef_string_multimap_t map, int index, - cef_string_t* key) { - DCHECK(map); - DCHECK(key); - StringMultimap* impl = reinterpret_cast(map); - DCHECK_GE(index, 0); - DCHECK_LT(index, static_cast(impl->size())); - if (index < 0 || index >= static_cast(impl->size())) - return 0; - - StringMultimap::const_iterator it = impl->begin(); - for (int ct = 0; it != impl->end(); ++it, ct++) { - if (ct == index) - return cef_string_set(it->first.c_str(), it->first.length(), key, true); - } - return 0; -} - -CEF_EXPORT int cef_string_multimap_value(cef_string_multimap_t map, int index, - cef_string_t* value) { - DCHECK(map); - DCHECK(value); - StringMultimap* impl = reinterpret_cast(map); - DCHECK_GE(index, 0); - DCHECK_LT(index, static_cast(impl->size())); - if (index < 0 || index >= static_cast(impl->size())) - return 0; - - StringMultimap::const_iterator it = impl->begin(); - for (int ct = 0; it != impl->end(); ++it, ct++) { - if (ct == index) { - return cef_string_set(it->second.c_str(), it->second.length(), value, - true); - } - } - return 0; -} - -CEF_EXPORT int cef_string_multimap_append(cef_string_multimap_t map, - const cef_string_t* key, - const cef_string_t* value) { - DCHECK(map); - StringMultimap* impl = reinterpret_cast(map); - impl->insert(std::make_pair(CefString(key), CefString(value))); - return 1; -} - -CEF_EXPORT void cef_string_multimap_clear(cef_string_multimap_t map) { - DCHECK(map); - StringMultimap* impl = reinterpret_cast(map); - impl->clear(); -} - -CEF_EXPORT void cef_string_multimap_free(cef_string_multimap_t map) { - DCHECK(map); - StringMultimap* impl = reinterpret_cast(map); - delete impl; -} diff --git a/cef1/libcef/cef_string_types.cc b/cef1/libcef/cef_string_types.cc deleted file mode 100644 index cf82d381f..000000000 --- a/cef1/libcef/cef_string_types.cc +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework 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 "include/internal/cef_string_types.h" -#include "base/logging.h" -#include "base/string16.h" -#include "base/utf_string_conversions.h" - -namespace { - -void string_wide_dtor(wchar_t* str) { - delete [] str; -} - -void string_utf8_dtor(char* str) { - delete [] str; -} - -void string_utf16_dtor(char16* str) { - delete [] str; -} - -} // namespace - -CEF_EXPORT int cef_string_wide_set(const wchar_t* src, size_t src_len, - cef_string_wide_t* output, int copy) { - cef_string_wide_clear(output); - - if (copy) { - if (src && src_len > 0) { - output->str = new wchar_t[src_len+1]; - if (!output->str) - return 0; - - memcpy(output->str, src, src_len * sizeof(wchar_t)); - output->str[src_len] = 0; - output->length = src_len; - output->dtor = string_wide_dtor; - } - } else { - output->str = const_cast(src); - output->length = src_len; - output->dtor = NULL; - } - return 1; -} - -CEF_EXPORT int cef_string_utf8_set(const char* src, size_t src_len, - cef_string_utf8_t* output, int copy) { - cef_string_utf8_clear(output); - if (copy) { - if (src && src_len > 0) { - output->str = new char[src_len+1]; - if (!output->str) - return 0; - - memcpy(output->str, src, src_len * sizeof(char)); - output->str[src_len] = 0; - output->length = src_len; - output->dtor = string_utf8_dtor; - } - } else { - output->str = const_cast(src); - output->length = src_len; - output->dtor = NULL; - } - return 1; -} - -CEF_EXPORT int cef_string_utf16_set(const char16* src, size_t src_len, - cef_string_utf16_t* output, int copy) { - cef_string_utf16_clear(output); - - if (copy) { - if (src && src_len > 0) { - output->str = new char16[src_len+1]; - if (!output->str) - return 0; - - memcpy(output->str, src, src_len * sizeof(char16)); - output->str[src_len] = 0; - output->length = src_len; - output->dtor = string_utf16_dtor; - } - } else { - output->str = const_cast(src); - output->length = src_len; - output->dtor = NULL; - } - return 1; -} - -CEF_EXPORT void cef_string_wide_clear(cef_string_wide_t* str) { - DCHECK(str != NULL); - if (str->dtor && str->str) - str->dtor(str->str); - - str->str = NULL; - str->length = 0; - str->dtor = NULL; -} - -CEF_EXPORT void cef_string_utf8_clear(cef_string_utf8_t* str) { - DCHECK(str != NULL); - if (str->dtor && str->str) - str->dtor(str->str); - - str->str = NULL; - str->length = 0; - str->dtor = NULL; -} - -CEF_EXPORT void cef_string_utf16_clear(cef_string_utf16_t* str) { - DCHECK(str != NULL); - if (str->dtor && str->str) - str->dtor(str->str); - - str->str = NULL; - str->length = 0; - str->dtor = NULL; -} - -CEF_EXPORT int cef_string_wide_cmp(const cef_string_wide_t* str1, - const cef_string_wide_t* str2) { - if (str1->length == 0 && str2->length == 0) - return 0; - int r = wcsncmp(str1->str, str2->str, std::min(str1->length, str2->length)); - if (r == 0) { - if (str1->length > str2->length) - return 1; - else if (str1->length < str2->length) - return -1; - } - return r; -} - -CEF_EXPORT int cef_string_utf8_cmp(const cef_string_utf8_t* str1, - const cef_string_utf8_t* str2) { - if (str1->length == 0 && str2->length == 0) - return 0; - int r = strncmp(str1->str, str2->str, std::min(str1->length, str2->length)); - if (r == 0) { - if (str1->length > str2->length) - return 1; - else if (str1->length < str2->length) - return -1; - } - return r; -} - -CEF_EXPORT int cef_string_utf16_cmp(const cef_string_utf16_t* str1, - const cef_string_utf16_t* str2) { - if (str1->length == 0 && str2->length == 0) - return 0; -#if defined(WCHAR_T_IS_UTF32) - int r = base::c16memcmp(str1->str, str2->str, std::min(str1->length, - str2->length)); -#else - int r = wcsncmp(str1->str, str2->str, std::min(str1->length, str2->length)); -#endif - if (r == 0) { - if (str1->length > str2->length) - return 1; - else if (str1->length < str2->length) - return -1; - } - return r; -} - -CEF_EXPORT int cef_string_wide_to_utf8(const wchar_t* src, size_t src_len, - cef_string_utf8_t* output) { - std::string str; - bool ret = WideToUTF8(src, src_len, &str); - if (!cef_string_utf8_set(str.c_str(), str.length(), output, true)) - return false; - return ret; -} - -CEF_EXPORT int cef_string_utf8_to_wide(const char* src, size_t src_len, - cef_string_wide_t* output) { - std::wstring str; - bool ret = UTF8ToWide(src, src_len, &str); - if (!cef_string_wide_set(str.c_str(), str.length(), output, true)) - return false; - return ret; -} - -CEF_EXPORT int cef_string_wide_to_utf16(const wchar_t* src, size_t src_len, - cef_string_utf16_t* output) { - string16 str; - bool ret = WideToUTF16(src, src_len, &str); - if (!cef_string_utf16_set(str.c_str(), str.length(), output, true)) - return false; - return ret; -} - -CEF_EXPORT int cef_string_utf16_to_wide(const char16* src, size_t src_len, - cef_string_wide_t* output) { - std::wstring str; - bool ret = UTF16ToWide(src, src_len, &str); - if (!cef_string_wide_set(str.c_str(), str.length(), output, true)) - return false; - return ret; -} - -CEF_EXPORT int cef_string_utf8_to_utf16(const char* src, size_t src_len, - cef_string_utf16_t* output) { - string16 str; - bool ret = UTF8ToUTF16(src, src_len, &str); - if (!cef_string_utf16_set(str.c_str(), str.length(), output, true)) - return false; - return ret; -} - -CEF_EXPORT int cef_string_utf16_to_utf8(const char16* src, size_t src_len, - cef_string_utf8_t* output) { - std::string str; - bool ret = UTF16ToUTF8(src, src_len, &str); - if (!cef_string_utf8_set(str.c_str(), str.length(), output, true)) - return false; - return ret; -} - -CEF_EXPORT int cef_string_ascii_to_wide(const char* src, size_t src_len, - cef_string_wide_t* output) { - std::wstring str = ASCIIToWide(std::string(src, src_len)); - return cef_string_wide_set(str.c_str(), str.length(), output, true); -} - -CEF_EXPORT int cef_string_ascii_to_utf16(const char* src, size_t src_len, - cef_string_utf16_t* output) { - string16 str = ASCIIToUTF16(std::string(src, src_len)); - return cef_string_utf16_set(str.c_str(), str.length(), output, true); -} - -CEF_EXPORT cef_string_userfree_wide_t cef_string_userfree_wide_alloc() { - cef_string_wide_t* s = new cef_string_wide_t; - memset(s, 0, sizeof(cef_string_wide_t)); - return s; -} - -CEF_EXPORT cef_string_userfree_utf8_t cef_string_userfree_utf8_alloc() { - cef_string_utf8_t* s = new cef_string_utf8_t; - memset(s, 0, sizeof(cef_string_utf8_t)); - return s; -} - -CEF_EXPORT cef_string_userfree_utf16_t cef_string_userfree_utf16_alloc() { - cef_string_utf16_t* s = new cef_string_utf16_t; - memset(s, 0, sizeof(cef_string_utf16_t)); - return s; -} - -CEF_EXPORT void cef_string_userfree_wide_free(cef_string_userfree_wide_t str) { - cef_string_wide_clear(str); - delete str; -} - -CEF_EXPORT void cef_string_userfree_utf8_free(cef_string_userfree_utf8_t str) { - cef_string_utf8_clear(str); - delete str; -} - -CEF_EXPORT void cef_string_userfree_utf16_free( - cef_string_userfree_utf16_t str) { - cef_string_utf16_clear(str); - delete str; -} diff --git a/cef1/libcef/cef_thread.cc b/cef1/libcef/cef_thread.cc deleted file mode 100644 index 7a41816af..000000000 --- a/cef1/libcef/cef_thread.cc +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions 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. - -#include "libcef/cef_thread.h" - -#include "base/compiler_specific.h" -#include "base/lazy_instance.h" -#include "base/message_loop.h" -#include "base/message_loop_proxy.h" -#include "base/threading/sequenced_worker_pool.h" - -#if defined(OS_WIN) -#include // NOLINT(build/include_order) -#endif - -using base::MessageLoopProxy; - -namespace { - -// Friendly names for the well-known threads. -static const char* cef_thread_names[CefThread::ID_COUNT] = { - "Cef_UIThread", // UI - "Cef_FileThread", // FILE - "Cef_IOThread", // IO -}; - -struct CefThreadGlobals { - CefThreadGlobals() { - memset(threads, 0, CefThread::ID_COUNT * sizeof(threads[0])); - } - - // This lock protects |threads|. Do not read or modify that array - // without holding this lock. Do not block while holding this lock. - base::Lock lock; - - // This array is protected by |lock|. The threads are not owned by this - // array. Typically, the threads are owned on the UI thread by - // BrowserMainLoop. BrowserThreadImpl objects remove themselves from this - // array upon destruction. - CefThread* threads[CefThread::ID_COUNT]; - - scoped_refptr blocking_pool; -}; - -base::LazyInstance::Leaky - g_globals = LAZY_INSTANCE_INITIALIZER; - -// An implementation of MessageLoopProxy to be used in conjunction -// with CefThread. -class CefThreadMessageLoopProxy : public MessageLoopProxy { - public: - explicit CefThreadMessageLoopProxy(CefThread::ID identifier) - : id_(identifier) { - } - - // TaskRunner implementation. - virtual bool PostDelayedTask(const tracked_objects::Location& from_here, - const base::Closure& task, - base::TimeDelta delay) OVERRIDE { - return CefThread::PostDelayedTask(id_, from_here, task, delay); - } - - // SequencedTaskRunner implementation. - virtual bool PostNonNestableDelayedTask( - const tracked_objects::Location& from_here, - const base::Closure& task, - base::TimeDelta delay) OVERRIDE { - return CefThread::PostNonNestableDelayedTask(id_, from_here, task, delay); - } - - virtual bool RunsTasksOnCurrentThread() const OVERRIDE { - return CefThread::CurrentlyOn(id_); - } - - private: - CefThread::ID id_; - DISALLOW_COPY_AND_ASSIGN(CefThreadMessageLoopProxy); -}; - -} // namespace - -CefThread::CefThread(CefThread::ID identifier) - : Thread(cef_thread_names[identifier]), - identifier_(identifier) { - Initialize(); -} - -CefThread::CefThread(ID identifier, MessageLoop* message_loop) - : Thread(cef_thread_names[identifier]), - identifier_(identifier) { - message_loop->set_thread_name(cef_thread_names[identifier]); - set_message_loop(message_loop); - Initialize(); -} - -// static -void CefThread::CreateThreadPool() { - CefThreadGlobals& globals = g_globals.Get(); - DCHECK(!globals.blocking_pool.get()); - globals.blocking_pool = new base::SequencedWorkerPool(3, "BrowserBlocking"); -} - -// static -void CefThread::ShutdownThreadPool() { - // The goal is to make it impossible for chrome to 'infinite loop' during - // shutdown, but to reasonably expect that all BLOCKING_SHUTDOWN tasks queued - // during shutdown get run. There's nothing particularly scientific about the - // number chosen. - const int kMaxNewShutdownBlockingTasks = 1000; - CefThreadGlobals& globals = g_globals.Get(); - globals.blocking_pool->Shutdown(kMaxNewShutdownBlockingTasks); - globals.blocking_pool = NULL; -} - -void CefThread::Init() { -#if defined(OS_WIN) - // Initializes the COM library on the current thread. - CoInitialize(NULL); -#endif - -#if defined(OS_MACOSX) - autorelease_pool_.reset(new base::mac::ScopedNSAutoreleasePool); -#endif -} - -void CefThread::Cleanup() { -#if defined(OS_WIN) - // Closes the COM library on the current thread. CoInitialize must - // be balanced by a corresponding call to CoUninitialize. - CoUninitialize(); -#endif - -#if defined(OS_MACOSX) - autorelease_pool_.reset(NULL); -#endif -} - -void CefThread::Initialize() { - CefThreadGlobals& globals = g_globals.Get(); - base::AutoLock lock(globals.lock); - DCHECK(identifier_ >= 0 && identifier_ < ID_COUNT); - DCHECK(globals.threads[identifier_] == NULL); - globals.threads[identifier_] = this; -} - -CefThread::~CefThread() { - // Stop the thread here, instead of the parent's class destructor. This is so - // that if there are pending tasks that run, code that checks that it's on the - // correct CefThread succeeds. - Stop(); - - CefThreadGlobals& globals = g_globals.Get(); - base::AutoLock lock(globals.lock); - globals.threads[identifier_] = NULL; -#ifndef NDEBUG - // Double check that the threads are ordererd correctly in the enumeration. - for (int i = identifier_ + 1; i < ID_COUNT; ++i) { - DCHECK(!globals.threads[i]) << - "Threads must be listed in the reverse order that they die"; - } -#endif -} - -// static -base::SequencedWorkerPool* CefThread::GetBlockingPool() { - CefThreadGlobals& globals = g_globals.Get(); - DCHECK(globals.blocking_pool.get()); - return globals.blocking_pool; -} - -// static -bool CefThread::IsWellKnownThread(ID identifier) { - CefThreadGlobals& globals = g_globals.Get(); - base::AutoLock lock(globals.lock); - return (identifier >= 0 && identifier < ID_COUNT && - globals.threads[identifier]); -} - -// static -bool CefThread::CurrentlyOn(ID identifier) { - CefThreadGlobals& globals = g_globals.Get(); - base::AutoLock lock(globals.lock); - DCHECK(identifier >= 0 && identifier < ID_COUNT); - return globals.threads[identifier] && - globals.threads[identifier]->message_loop() == - base::MessageLoop::current(); -} - -// static -bool CefThread::PostTask(ID identifier, - const tracked_objects::Location& from_here, - const base::Closure& task) { - return PostTaskHelper(identifier, from_here, task, base::TimeDelta(), true); -} - -// static -bool CefThread::PostDelayedTask(ID identifier, - const tracked_objects::Location& from_here, - const base::Closure& task, - base::TimeDelta delay) { - return PostTaskHelper(identifier, from_here, task, delay, true); -} - -// static -bool CefThread::PostNonNestableTask( - ID identifier, - const tracked_objects::Location& from_here, - const base::Closure& task) { - return PostTaskHelper(identifier, from_here, task, base::TimeDelta(), false); -} - -// static -bool CefThread::PostNonNestableDelayedTask( - ID identifier, - const tracked_objects::Location& from_here, - const base::Closure& task, - base::TimeDelta delay) { - return PostTaskHelper(identifier, from_here, task, delay, false); -} - -// static -bool CefThread::GetCurrentThreadIdentifier(ID* identifier) { - CefThreadGlobals& globals = g_globals.Get(); - base::MessageLoop* cur_message_loop = base::MessageLoop::current(); - for (int i = 0; i < ID_COUNT; ++i) { - if (globals.threads[i] && - globals.threads[i]->message_loop() == cur_message_loop) { - *identifier = globals.threads[i]->identifier_; - return true; - } - } - - return false; -} - -// static -scoped_refptr CefThread::GetMessageLoopProxyForThread( - ID identifier) { - scoped_refptr proxy = - new CefThreadMessageLoopProxy(identifier); - return proxy; -} - -// static -bool CefThread::PostTaskHelper( - ID identifier, - const tracked_objects::Location& from_here, - const base::Closure& task, - base::TimeDelta delay, - bool nestable) { - DCHECK(identifier >= 0 && identifier < ID_COUNT); - // Optimization: to avoid unnecessary locks, we listed the ID enumeration in - // order of lifetime. So no need to lock if we know that the other thread - // outlives this one. - // Note: since the array is so small, ok to loop instead of creating a map, - // which would require a lock because std::map isn't thread safe, defeating - // the whole purpose of this optimization. - ID current_thread; - bool guaranteed_to_outlive_target_thread = - GetCurrentThreadIdentifier(¤t_thread) && - current_thread >= identifier; - - CefThreadGlobals& globals = g_globals.Get(); - - if (!guaranteed_to_outlive_target_thread) - globals.lock.Acquire(); - - base::MessageLoop* message_loop = globals.threads[identifier] ? - globals.threads[identifier]->message_loop() : NULL; - if (message_loop) { - if (nestable) { - message_loop->PostDelayedTask(from_here, task, delay); - } else { - message_loop->PostNonNestableDelayedTask(from_here, task, delay); - } - } - - if (!guaranteed_to_outlive_target_thread) - globals.lock.Release(); - - return !!message_loop; -} diff --git a/cef1/libcef/cef_thread.h b/cef1/libcef/cef_thread.h deleted file mode 100644 index 3f138ce6d..000000000 --- a/cef1/libcef/cef_thread.h +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. -// Portions 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. - -#ifndef CEF_LIBCEF_CEF_THREAD_H_ -#define CEF_LIBCEF_CEF_THREAD_H_ -#pragma once - -#include "base/memory/scoped_ptr.h" -#include "base/synchronization/lock.h" -#include "base/threading/thread.h" - -#if defined(OS_MACOSX) -#include "base/mac/scoped_nsautorelease_pool.h" -#endif - -namespace base { -class MessageLoopProxy; -class SequencedWorkerPool; -} - -/////////////////////////////////////////////////////////////////////////////// -// CefThread -// -// This class represents a thread that is known by a browser-wide name. For -// example, there is one IO thread for the entire browser process, and various -// pieces of code find it useful to retrieve a pointer to the IO thread's -// Invoke a task by thread ID: -// -// CefThread::PostTask(CefThread::IO, FROM_HERE, task); -// -// The return value is false if the task couldn't be posted because the target -// thread doesn't exist. If this could lead to data loss, you need to check the -// result and restructure the code to ensure it doesn't occur. -// -// This class automatically handles the lifetime of different threads. -// It's always safe to call PostTask on any thread. If it's not yet created, -// the task is deleted. There are no race conditions. If the thread that the -// task is posted to is guaranteed to outlive the current thread, then no locks -// are used. You should never need to cache pointers to MessageLoops, since -// they're not thread safe. -class CefThread : public base::Thread { - public: - // An enumeration of the well-known threads. - // NOTE: threads must be listed in the order of their life-time, with each - // thread outliving every other thread below it. - enum ID { - // The main thread in the browser. - UI, - - // This is the thread that interacts with the file system. - FILE, - - // This is the thread that processes network and schema messages. - IO, - - // This identifier does not represent a thread. Instead it counts the - // number of well-known threads. Insert new well-known threads before this - // identifier. - ID_COUNT - }; - - // Construct a CefThread with the supplied identifier. It is an error - // to construct a CefThread that already exists. - explicit CefThread(ID identifier); - - // Special constructor for the main (UI) thread and unittests. We use a dummy - // thread here since the main thread already exists. - CefThread(ID identifier, base::MessageLoop* message_loop); - - static void CreateThreadPool(); - static void ShutdownThreadPool(); - - virtual ~CefThread(); - - // These are the same methods in message_loop.h, but are guaranteed to either - // get posted to the MessageLoop if it's still alive, or be deleted otherwise. - // They return true iff the thread existed and the task was posted. Note that - // even if the task is posted, there's no guarantee that it will run, since - // the target thread may already have a Quit message in its queue. - static bool PostTask(ID identifier, - const tracked_objects::Location& from_here, - const base::Closure& task); - static bool PostDelayedTask(ID identifier, - const tracked_objects::Location& from_here, - const base::Closure& task, - base::TimeDelta delay); - static bool PostNonNestableTask(ID identifier, - const tracked_objects::Location& from_here, - const base::Closure& task); - static bool PostNonNestableDelayedTask( - ID identifier, - const tracked_objects::Location& from_here, - const base::Closure& task, - base::TimeDelta delay); - - template - static bool DeleteSoon(ID identifier, - const tracked_objects::Location& from_here, - const T* object) { - return GetMessageLoopProxyForThread(identifier)->DeleteSoon( - from_here, object); - } - - template - static bool ReleaseSoon(ID identifier, - const tracked_objects::Location& from_here, - const T* object) { - return GetMessageLoopProxyForThread(identifier)->ReleaseSoon( - from_here, object); - } - - // Returns the thread pool used for blocking file I/O. Use this object to - // perform random blocking operations such as file writes or querying the - // Windows registry. - static base::SequencedWorkerPool* GetBlockingPool(); - - // Callable on any thread. Returns whether the given ID corresponds to a well - // known thread. - static bool IsWellKnownThread(ID identifier); - - // Callable on any thread. Returns whether you're currently on a particular - // thread. - static bool CurrentlyOn(ID identifier); - - // If the current message loop is one of the known threads, returns true and - // sets identifier to its ID. Otherwise returns false. - static bool GetCurrentThreadIdentifier(ID* identifier); - - // Callers can hold on to a refcounted MessageLoopProxy beyond the lifetime - // of the thread. - static scoped_refptr GetMessageLoopProxyForThread( - ID identifier); - - // Use these templates in conjuction with RefCountedThreadSafe when you want - // to ensure that an object is deleted on a specific thread. This is needed - // when an object can hop between threads (i.e. IO -> FILE -> IO), and thread - // switching delays can mean that the final IO tasks executes before the FILE - // task's stack unwinds. This would lead to the object destructing on the - // FILE thread, which often is not what you want (i.e. to unregister from - // NotificationService, to notify other objects on the creating thread etc). - template - struct DeleteOnThread { - template - static void Destruct(T* x) { - if (CurrentlyOn(thread)) { - delete x; - } else { - DeleteSoon(thread, FROM_HERE, x); - } - } - }; - - // Sample usage: - // class Foo - // : public base::RefCountedThreadSafe< - // Foo, CefThread::DeleteOnIOThread> { - // - // ... - // private: - // friend class CefThread; - // friend class DeleteTask; - // - // ~Foo(); - struct DeleteOnUIThread : public DeleteOnThread { }; - struct DeleteOnIOThread : public DeleteOnThread { }; - struct DeleteOnFileThread : public DeleteOnThread { }; - - protected: - virtual void Init(); - virtual void Cleanup(); - - private: - // Common initialization code for the constructors. - void Initialize(); - - static bool PostTaskHelper( - ID identifier, - const tracked_objects::Location& from_here, - const base::Closure& task, - base::TimeDelta delay, - bool nestable); - - // The identifier of this thread. Only one thread can exist with a given - // identifier at a given time. - ID identifier_; - -#if defined(OS_MACOSX) - scoped_ptr autorelease_pool_; -#endif -}; - -#define REQUIRE_UIT() DCHECK(CefThread::CurrentlyOn(CefThread::UI)) -#define REQUIRE_IOT() DCHECK(CefThread::CurrentlyOn(CefThread::IO)) - -#endif // CEF_LIBCEF_CEF_THREAD_H_ diff --git a/cef1/libcef/cef_time.cc b/cef1/libcef/cef_time.cc deleted file mode 100644 index 47a70a846..000000000 --- a/cef1/libcef/cef_time.cc +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/cef_time_util.h" - -void cef_time_to_basetime(const cef_time_t& cef_time, base::Time& time) { - base::Time::Exploded exploded; - exploded.year = cef_time.year; - exploded.month = cef_time.month; - exploded.day_of_week = cef_time.day_of_week; - exploded.day_of_month = cef_time.day_of_month; - exploded.hour = cef_time.hour; - exploded.minute = cef_time.minute; - exploded.second = cef_time.second; - exploded.millisecond = cef_time.millisecond; - time = base::Time::FromUTCExploded(exploded); -} - -void cef_time_from_basetime(const base::Time& time, cef_time_t& cef_time) { - base::Time::Exploded exploded; - time.UTCExplode(&exploded); - cef_time.year = exploded.year; - cef_time.month = exploded.month; - cef_time.day_of_week = exploded.day_of_week; - cef_time.day_of_month = exploded.day_of_month; - cef_time.hour = exploded.hour; - cef_time.minute = exploded.minute; - cef_time.second = exploded.second; - cef_time.millisecond = exploded.millisecond; -} - -CEF_EXPORT int cef_time_to_timet(const cef_time_t* cef_time, time_t* time) { - if (!cef_time || !time) - return 0; - - base::Time base_time; - cef_time_to_basetime(*cef_time, base_time); - *time = base_time.ToTimeT(); - return 1; -} - -CEF_EXPORT int cef_time_from_timet(time_t time, cef_time_t* cef_time) { - if (!cef_time) - return 0; - - base::Time base_time = base::Time::FromTimeT(time); - cef_time_from_basetime(base_time, *cef_time); - return 1; -} - -CEF_EXPORT int cef_time_to_doublet(const cef_time_t* cef_time, double* time) { - if (!cef_time || !time) - return 0; - - base::Time base_time; - cef_time_to_basetime(*cef_time, base_time); - *time = base_time.ToDoubleT(); - return 1; -} - -CEF_EXPORT int cef_time_from_doublet(double time, cef_time_t* cef_time) { - if (!cef_time) - return 0; - - base::Time base_time = base::Time::FromDoubleT(time); - cef_time_from_basetime(base_time, *cef_time); - return 1; -} - -CEF_EXPORT int cef_time_now(cef_time_t* cef_time) { - if (!cef_time) - return 0; - - base::Time base_time = base::Time::Now(); - cef_time_from_basetime(base_time, *cef_time); - return 1; -} - -CEF_EXPORT int cef_time_delta(const cef_time_t* cef_time1, - const cef_time_t* cef_time2, - long long* delta) { - if (!cef_time1 || !cef_time2 || !delta) - return 0; - - base::Time base_time1, base_time2; - cef_time_to_basetime(*cef_time1, base_time1); - cef_time_to_basetime(*cef_time2, base_time2); - - base::TimeDelta time_delta = base_time2 - base_time1; - *delta = time_delta.InMilliseconds(); - return 1; -} diff --git a/cef1/libcef/cef_time_util.h b/cef1/libcef/cef_time_util.h deleted file mode 100644 index 7996ff0ef..000000000 --- a/cef1/libcef/cef_time_util.h +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_CEF_TIME_UTIL_H_ -#define CEF_LIBCEF_CEF_TIME_UTIL_H_ -#pragma once - -#include "include/internal/cef_time.h" -#include "base/time.h" - -// Converts cef_time_t to/from a base::Time object. -void cef_time_to_basetime(const cef_time_t& cef_time, base::Time& time); -void cef_time_from_basetime(const base::Time& time, cef_time_t& cef_time); - -#endif // CEF_LIBCEF_CEF_TIME_UTIL_H_ diff --git a/cef1/libcef/command_line_impl.cc b/cef1/libcef/command_line_impl.cc deleted file mode 100644 index 616a45d53..000000000 --- a/cef1/libcef/command_line_impl.cc +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "include/cef_command_line.h" -#include "base/command_line.h" -#include "base/files/file_path.h" -#include "base/logging.h" - -namespace { - -class CefCommandLineImpl : public CefCommandLine { - public: - CefCommandLineImpl() - : command_line_(CommandLine::NO_PROGRAM) { - } - - virtual void InitFromArgv(int argc, const char* const* argv) OVERRIDE { -#if !defined(OS_WIN) - AutoLock lock_scope(this); - command_line_.InitFromArgv(argc, argv); -#else - NOTREACHED() << "method not supported on this platform"; -#endif - } - - virtual void InitFromString(const CefString& command_line) OVERRIDE { -#if defined(OS_WIN) - AutoLock lock_scope(this); - command_line_.ParseFromString(command_line); -#else - NOTREACHED() << "method not supported on this platform"; -#endif - } - - virtual CefString GetCommandLineString() OVERRIDE { - AutoLock lock_scope(this); - return command_line_.GetCommandLineString(); - } - - virtual CefString GetProgram() OVERRIDE { - AutoLock lock_scope(this); - return command_line_.GetProgram().value(); - } - - virtual void SetProgram(const CefString& program) OVERRIDE { - AutoLock lock_scope(this); - command_line_.SetProgram(base::FilePath(program)); - } - - virtual bool HasSwitches() OVERRIDE { - AutoLock lock_scope(this); - return (command_line_.GetSwitches().size() > 0); - } - - virtual bool HasSwitch(const CefString& name) OVERRIDE { - AutoLock lock_scope(this); - return command_line_.HasSwitch(name); - } - - virtual CefString GetSwitchValue(const CefString& name) OVERRIDE { - AutoLock lock_scope(this); - return command_line_.GetSwitchValueNative(name); - } - - virtual void GetSwitches(SwitchMap& switches) OVERRIDE { - AutoLock lock_scope(this); - const CommandLine::SwitchMap& map = command_line_.GetSwitches(); - CommandLine::SwitchMap::const_iterator it = map.begin(); - for (; it != map.end(); ++it) - switches.insert(std::make_pair(it->first, it->second)); - } - - virtual void AppendSwitch(const CefString& name) OVERRIDE { - AutoLock lock_scope(this); - command_line_.AppendSwitch(name); - } - - virtual void AppendSwitchWithValue(const CefString& name, - const CefString& value) OVERRIDE { - AutoLock lock_scope(this); - command_line_.AppendSwitchNative(name, value); - } - - virtual bool HasArguments() OVERRIDE { - AutoLock lock_scope(this); - return (command_line_.GetArgs().size() > 0); - } - - virtual void GetArguments(ArgumentList& arguments) OVERRIDE { - AutoLock lock_scope(this); - const CommandLine::StringVector& vec = command_line_.GetArgs(); - CommandLine::StringVector::const_iterator it = vec.begin(); - for (; it != vec.end(); ++it) - arguments.push_back(*it); - } - - virtual void AppendArgument(const CefString& argument) OVERRIDE { - AutoLock lock_scope(this); - command_line_.AppendArgNative(argument); - } - - private: - CommandLine command_line_; - - IMPLEMENT_REFCOUNTING(CefCommandLineImpl); - IMPLEMENT_LOCKING(CefCommandLineImpl); -}; - -} // namespace - -// static -CefRefPtr CefCommandLine::CreateCommandLine() { - return new CefCommandLineImpl(); -} diff --git a/cef1/libcef/cookie_manager_impl.cc b/cef1/libcef/cookie_manager_impl.cc deleted file mode 100644 index 86856c1c8..000000000 --- a/cef1/libcef/cookie_manager_impl.cc +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 "libcef/cookie_manager_impl.h" - -#include - -#include "libcef/cef_context.h" -#include "libcef/cef_thread.h" -#include "libcef/cef_time_util.h" - -#include "base/bind.h" -#include "base/logging.h" -#include "content/browser/net/sqlite_persistent_cookie_store.h" - -namespace { - -// Callback class for visiting cookies. -class VisitCookiesCallback : public base::RefCounted { - public: - explicit VisitCookiesCallback(net::CookieMonster* cookie_monster, - CefRefPtr visitor) - : cookie_monster_(cookie_monster), - visitor_(visitor) { - } - - void Run(const net::CookieList& list) { - REQUIRE_IOT(); - - int total = list.size(), count = 0; - - net::CookieList::const_iterator it = list.begin(); - for (; it != list.end(); ++it, ++count) { - CefCookie cookie; - const net::CanonicalCookie& cc = *(it); - - CefString(&cookie.name).FromString(cc.Name()); - CefString(&cookie.value).FromString(cc.Value()); - CefString(&cookie.domain).FromString(cc.Domain()); - CefString(&cookie.path).FromString(cc.Path()); - cookie.secure = cc.IsSecure(); - cookie.httponly = cc.IsHttpOnly(); - cef_time_from_basetime(cc.CreationDate(), cookie.creation); - cef_time_from_basetime(cc.LastAccessDate(), cookie.last_access); - cookie.has_expires = cc.IsPersistent(); - if (cookie.has_expires) - cef_time_from_basetime(cc.ExpiryDate(), cookie.expires); - - bool deleteCookie = false; - bool keepLooping = visitor_->Visit(cookie, count, total, deleteCookie); - if (deleteCookie) { - cookie_monster_->DeleteCanonicalCookieAsync(cc, - net::CookieMonster::DeleteCookieCallback()); - } - if (!keepLooping) - break; - } - } - - private: - scoped_refptr cookie_monster_; - CefRefPtr visitor_; -}; - -} // namespace - - -CefCookieManagerImpl::CefCookieManagerImpl(bool is_global) - : is_global_(is_global) { - if (is_global) { - cookie_monster_ = - static_cast( - _Context->request_context()->cookie_store()); - DCHECK(cookie_monster_); - } -} - -CefCookieManagerImpl::~CefCookieManagerImpl() { -} - -void CefCookieManagerImpl::SetSupportedSchemes( - const std::vector& schemes) { - if (CefThread::CurrentlyOn(CefThread::IO)) { - if (schemes.empty()) - return; - - std::set scheme_set; - std::vector::const_iterator it = schemes.begin(); - for (; it != schemes.end(); ++it) - scheme_set.insert(*it); - - const char** arr = new const char*[scheme_set.size()]; - std::set::const_iterator it2 = scheme_set.begin(); - for (int i = 0; it2 != scheme_set.end(); ++it2, ++i) - arr[i] = it2->c_str(); - - cookie_monster_->SetCookieableSchemes(arr, scheme_set.size()); - - delete [] arr; - } else { - // Execute on the IO thread. - CefThread::PostTask(CefThread::IO, FROM_HERE, - base::Bind(&CefCookieManagerImpl::SetSupportedSchemes, - this, schemes)); - } -} - -bool CefCookieManagerImpl::VisitAllCookies( - CefRefPtr visitor) { - if (CefThread::CurrentlyOn(CefThread::IO)) { - scoped_refptr callback( - new VisitCookiesCallback(cookie_monster_, visitor)); - - cookie_monster_->GetAllCookiesAsync( - base::Bind(&VisitCookiesCallback::Run, callback.get())); - } else { - // Execute on the IO thread. - CefThread::PostTask(CefThread::IO, FROM_HERE, - base::Bind(base::IgnoreResult(&CefCookieManagerImpl::VisitAllCookies), - this, visitor)); - } - - return true; -} - -bool CefCookieManagerImpl::VisitUrlCookies( - const CefString& url, bool includeHttpOnly, - CefRefPtr visitor) { - if (CefThread::CurrentlyOn(CefThread::IO)) { - net::CookieOptions options; - if (includeHttpOnly) - options.set_include_httponly(); - - scoped_refptr callback( - new VisitCookiesCallback(cookie_monster_, visitor)); - - GURL gurl = GURL(url.ToString()); - cookie_monster_->GetAllCookiesForURLWithOptionsAsync(gurl, options, - base::Bind(&VisitCookiesCallback::Run, callback.get())); - } else { - // Execute on the IO thread. - CefThread::PostTask(CefThread::IO, FROM_HERE, - base::Bind(base::IgnoreResult(&CefCookieManagerImpl::VisitUrlCookies), - this, url, includeHttpOnly, visitor)); - } - - return true; -} - -bool CefCookieManagerImpl::SetCookie(const CefString& url, - const CefCookie& cookie) { - // Verify that this function is being called on the IO thread. - if (!CefThread::CurrentlyOn(CefThread::IO)) { - NOTREACHED() << "called on invalid thread"; - return false; - } - - GURL gurl = GURL(url.ToString()); - if (!gurl.is_valid()) - return false; - - std::string name = CefString(&cookie.name).ToString(); - std::string value = CefString(&cookie.value).ToString(); - std::string domain = CefString(&cookie.domain).ToString(); - std::string path = CefString(&cookie.path).ToString(); - - base::Time expiration_time; - if (cookie.has_expires) - cef_time_to_basetime(cookie.expires, expiration_time); - - cookie_monster_->SetCookieWithDetailsAsync(gurl, name, value, domain, path, - expiration_time, cookie.secure, cookie.httponly, - net::CookieStore::SetCookiesCallback()); - return true; -} - -bool CefCookieManagerImpl::DeleteCookies(const CefString& url, - const CefString& cookie_name) { - // Verify that this function is being called on the IO thread. - if (!CefThread::CurrentlyOn(CefThread::IO)) { - NOTREACHED() << "called on invalid thread"; - return false; - } - - if (url.empty()) { - // Delete all cookies. - cookie_monster_->DeleteAllAsync(net::CookieMonster::DeleteCallback()); - return true; - } - - GURL gurl = GURL(url.ToString()); - if (!gurl.is_valid()) - return false; - - if (cookie_name.empty()) { - // Delete all matching host cookies. - cookie_monster_->DeleteAllForHostAsync(gurl, - net::CookieMonster::DeleteCallback()); - } else { - // Delete all matching host and domain cookies. - cookie_monster_->DeleteCookieAsync(gurl, cookie_name, base::Closure()); - } - return true; -} - -bool CefCookieManagerImpl::SetStoragePath(const CefString& path) { - if (CefThread::CurrentlyOn(CefThread::IO)) { - base::FilePath new_path; - if (!path.empty()) - new_path = base::FilePath(path); - - if (is_global_) { - // Global path changes are handled by the request context. - _Context->request_context()->SetCookieStoragePath(new_path); - cookie_monster_ = - static_cast( - _Context->request_context()->cookie_store()); - return true; - } - - if (cookie_monster_ && ((storage_path_.empty() && path.empty()) || - storage_path_ == new_path)) { - // The path has not changed so don't do anything. - return true; - } - - scoped_refptr persistent_store; - if (!new_path.empty()) { - if (!file_util::PathExists(new_path) && - !file_util::CreateDirectory(new_path)) { - NOTREACHED() << "Failed to create cookie storage directory"; - new_path.clear(); - } else { - base::FilePath cookie_path = new_path.Append(FILE_PATH_LITERAL("Cookies")); - persistent_store = - new content::SQLitePersistentCookieStore( - cookie_path, - CefThread::GetMessageLoopProxyForThread(CefThread::IO), - CefThread::GetMessageLoopProxyForThread(CefThread::FILE), - false, - NULL); - } - } - - // Set the new cookie store that will be used for all new requests. The old - // cookie store, if any, will be automatically flushed and closed when no - // longer referenced. - cookie_monster_ = new net::CookieMonster(persistent_store.get(), NULL); - storage_path_ = new_path; - } else { - // Execute on the IO thread. - CefThread::PostTask(CefThread::IO, FROM_HERE, - base::Bind(base::IgnoreResult(&CefCookieManagerImpl::SetStoragePath), - this, path)); - } - - return true; -} - - -// CefCookieManager methods ---------------------------------------------------- - -// static -CefRefPtr CefCookieManager::GetGlobalManager() { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return NULL; - } - - return new CefCookieManagerImpl(true); -} - -// static -CefRefPtr CefCookieManager::CreateManager( - const CefString& path) { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return NULL; - } - - CefRefPtr manager(new CefCookieManagerImpl(false)); - manager->SetStoragePath(path); - return manager; -} diff --git a/cef1/libcef/cookie_manager_impl.h b/cef1/libcef/cookie_manager_impl.h deleted file mode 100644 index 56c1226b6..000000000 --- a/cef1/libcef/cookie_manager_impl.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that can -// be found in the LICENSE file. - -#ifndef CEF_LIBCEF_COOKIE_IMPL_H_ -#define CEF_LIBCEF_COOKIE_IMPL_H_ - -#include "include/cef_cookie.h" -#include "base/files/file_path.h" -#include "net/cookies/cookie_monster.h" - -// Implementation of the CefCookieManager interface. -class CefCookieManagerImpl : public CefCookieManager { - public: - CefCookieManagerImpl(bool is_global); - - ~CefCookieManagerImpl(); - - // CefCookieManager methods. - virtual void SetSupportedSchemes(const std::vector& schemes) - OVERRIDE; - virtual bool VisitAllCookies(CefRefPtr visitor) OVERRIDE; - virtual bool VisitUrlCookies(const CefString& url, bool includeHttpOnly, - CefRefPtr visitor) OVERRIDE; - virtual bool SetCookie(const CefString& url, - const CefCookie& cookie) OVERRIDE; - virtual bool DeleteCookies(const CefString& url, - const CefString& cookie_name) OVERRIDE; - virtual bool SetStoragePath(const CefString& path) OVERRIDE; - - net::CookieMonster* cookie_monster() { return cookie_monster_; } - - private: - scoped_refptr cookie_monster_; - bool is_global_; - base::FilePath storage_path_; - - IMPLEMENT_REFCOUNTING(CefCookieManagerImpl); -}; - -#endif // CEF_LIBCEF_COOKIE_IMPL_H_ diff --git a/cef1/libcef/cookie_store_proxy.cc b/cef1/libcef/cookie_store_proxy.cc deleted file mode 100644 index ad38f2539..000000000 --- a/cef1/libcef/cookie_store_proxy.cc +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 "libcef/cookie_store_proxy.h" - -#include - -#include "libcef/browser_impl.h" -#include "libcef/cef_context.h" -#include "libcef/cookie_manager_impl.h" - -#include "base/logging.h" - - -CefCookieStoreProxy::CefCookieStoreProxy(CefBrowserImpl* browser) - : browser_(browser) { - DCHECK(browser_); -} - -void CefCookieStoreProxy::SetCookieWithOptionsAsync( - const GURL& url, - const std::string& cookie_line, - const net::CookieOptions& options, - const SetCookiesCallback& callback) { - scoped_refptr cookie_store = GetCookieStore(); - cookie_store->SetCookieWithOptionsAsync(url, cookie_line, options, callback); -} - -void CefCookieStoreProxy::GetCookiesWithOptionsAsync( - const GURL& url, const net::CookieOptions& options, - const GetCookiesCallback& callback) { - scoped_refptr cookie_store = GetCookieStore(); - cookie_store->GetCookiesWithOptionsAsync(url, options, callback); -} - -void CefCookieStoreProxy::DeleteCookieAsync( - const GURL& url, - const std::string& cookie_name, - const base::Closure& callback) { - scoped_refptr cookie_store = GetCookieStore(); - cookie_store->DeleteCookieAsync(url, cookie_name, callback); -} - -void CefCookieStoreProxy::DeleteAllCreatedBetweenAsync( - const base::Time& delete_begin, - const base::Time& delete_end, - const DeleteCallback& callback) { - scoped_refptr cookie_store = GetCookieStore(); - cookie_store->DeleteAllCreatedBetweenAsync(delete_begin, delete_end, - callback); -} - -void CefCookieStoreProxy::DeleteSessionCookiesAsync( - const DeleteCallback& callback) { - scoped_refptr cookie_store = GetCookieStore(); - cookie_store->DeleteSessionCookiesAsync(callback); -} - -net::CookieMonster* CefCookieStoreProxy::GetCookieMonster() { - scoped_refptr cookie_store = GetCookieStore(); - return cookie_store->GetCookieMonster(); -} - -net::CookieStore* CefCookieStoreProxy::GetCookieStore() { - scoped_refptr cookie_store; - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetRequestHandler(); - if (handler.get()) { - // Get the manager from the handler. - CefRefPtr manager = - handler->GetCookieManager(browser_, browser_->pending_url().spec()); - if (manager.get()) { - cookie_store = - reinterpret_cast( - manager.get())->cookie_monster(); - } - } - } - - if (!cookie_store) { - // Use the global cookie store. - cookie_store = _Context->request_context()->cookie_store(); - } - - DCHECK(cookie_store); - return cookie_store; -} diff --git a/cef1/libcef/cookie_store_proxy.h b/cef1/libcef/cookie_store_proxy.h deleted file mode 100644 index 86c7fe904..000000000 --- a/cef1/libcef/cookie_store_proxy.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that can -// be found in the LICENSE file. - -#ifndef CEF_LIBCEF_COOKIE_STORE_PROXY_H_ -#define CEF_LIBCEF_COOKIE_STORE_PROXY_H_ -#pragma once - -#include "net/cookies/cookie_store.h" - -class CefBrowserImpl; - -// Handles cookie requests from the network stack. -class CefCookieStoreProxy : public net::CookieStore { - public: - explicit CefCookieStoreProxy(CefBrowserImpl* browser); - - // net::CookieStore methods. - virtual void SetCookieWithOptionsAsync( - const GURL& url, - const std::string& cookie_line, - const net::CookieOptions& options, - const SetCookiesCallback& callback) OVERRIDE; - virtual void GetCookiesWithOptionsAsync( - const GURL& url, const net::CookieOptions& options, - const GetCookiesCallback& callback) OVERRIDE; - virtual void DeleteCookieAsync(const GURL& url, - const std::string& cookie_name, - const base::Closure& callback) OVERRIDE; - virtual void DeleteAllCreatedBetweenAsync(const base::Time& delete_begin, - const base::Time& delete_end, - const DeleteCallback& callback) - OVERRIDE; - virtual void DeleteSessionCookiesAsync(const DeleteCallback& callback) - OVERRIDE; - virtual net::CookieMonster* GetCookieMonster() OVERRIDE; - - private: - net::CookieStore* GetCookieStore(); - - CefBrowserImpl* browser_; -}; - -#endif // CEF_LIBCEF_COOKIE_STORE_PROXY_H_ diff --git a/cef1/libcef/dom_document_impl.cc b/cef1/libcef/dom_document_impl.cc deleted file mode 100644 index 844a00fd2..000000000 --- a/cef1/libcef/dom_document_impl.cc +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/dom_document_impl.h" -#include "libcef/dom_node_impl.h" -#include "libcef/cef_thread.h" - -#include "base/logging.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebRange.h" - -using WebKit::WebDocument; -using WebKit::WebElement; -using WebKit::WebFrame; -using WebKit::WebNode; -using WebKit::WebRange; -using WebKit::WebString; -using WebKit::WebURL; - - -CefDOMDocumentImpl::CefDOMDocumentImpl(CefBrowserImpl* browser, - WebFrame* frame) - : browser_(browser), - frame_(frame) { - const WebDocument& document = frame_->document(); - DCHECK(!document.isNull()); -} - -CefDOMDocumentImpl::~CefDOMDocumentImpl() { - REQUIRE_UIT(); - - // Verify that the Detach() method has been called. - DCHECK(frame_ == NULL); -} - -CefDOMDocumentImpl::Type CefDOMDocumentImpl::GetType() { - if (!VerifyContext()) - return DOM_DOCUMENT_TYPE_UNKNOWN; - - const WebDocument& document = frame_->document(); - if (document.isHTMLDocument()) - return DOM_DOCUMENT_TYPE_HTML; - if (document.isXHTMLDocument()) - return DOM_DOCUMENT_TYPE_XHTML; - if (document.isPluginDocument()) - return DOM_DOCUMENT_TYPE_PLUGIN; - return DOM_DOCUMENT_TYPE_UNKNOWN; -} - -CefRefPtr CefDOMDocumentImpl::GetDocument() { - const WebDocument& document = frame_->document(); - return GetOrCreateNode(document.document()); -} - -CefRefPtr CefDOMDocumentImpl::GetBody() { - const WebDocument& document = frame_->document(); - return GetOrCreateNode(document.body()); -} - -CefRefPtr CefDOMDocumentImpl::GetHead() { - WebDocument document = frame_->document(); - return GetOrCreateNode(document.head()); -} - -CefString CefDOMDocumentImpl::GetTitle() { - CefString str; - if (!VerifyContext()) - return str; - - const WebDocument& document = frame_->document(); - const WebString& title = document.title(); - if (!title.isNull()) - str = title; - - return str; -} - -CefRefPtr CefDOMDocumentImpl::GetElementById(const CefString& id) { - const WebDocument& document = frame_->document(); - return GetOrCreateNode(document.getElementById(string16(id))); -} - -CefRefPtr CefDOMDocumentImpl::GetFocusedNode() { - const WebDocument& document = frame_->document(); - return GetOrCreateNode(document.focusedNode()); -} - -bool CefDOMDocumentImpl::HasSelection() { - if (!VerifyContext()) - return false; - - return frame_->hasSelection(); -} - -CefRefPtr CefDOMDocumentImpl::GetSelectionStartNode() { - if (!VerifyContext() || !frame_->hasSelection()) - return NULL; - - const WebRange& range = frame_->selectionRange(); - if (range.isNull()) - return NULL; - - int exceptionCode; - return GetOrCreateNode(range.startContainer(exceptionCode)); -} - -int CefDOMDocumentImpl::GetSelectionStartOffset() { - if (!VerifyContext() || !frame_->hasSelection()) - return 0; - - const WebRange& range = frame_->selectionRange(); - if (range.isNull()) - return 0; - - return range.startOffset(); -} - -CefRefPtr CefDOMDocumentImpl::GetSelectionEndNode() { - if (!VerifyContext() || !frame_->hasSelection()) - return NULL; - - const WebRange& range = frame_->selectionRange(); - if (range.isNull()) - return NULL; - - int exceptionCode; - return GetOrCreateNode(range.endContainer(exceptionCode)); -} - -int CefDOMDocumentImpl::GetSelectionEndOffset() { - if (!VerifyContext() || !frame_->hasSelection()) - return 0; - - const WebRange& range = frame_->selectionRange(); - if (range.isNull()) - return 0; - - return range.endOffset(); -} - -CefString CefDOMDocumentImpl::GetSelectionAsMarkup() { - CefString str; - if (!VerifyContext() || !frame_->hasSelection()) - return str; - - const WebString& markup = frame_->selectionAsMarkup(); - if (!markup.isNull()) - str = markup; - - return str; -} - -CefString CefDOMDocumentImpl::GetSelectionAsText() { - CefString str; - if (!VerifyContext() || !frame_->hasSelection()) - return str; - - const WebString& text = frame_->selectionAsText(); - if (!text.isNull()) - str = text; - - return str; -} - -CefString CefDOMDocumentImpl::GetBaseURL() { - CefString str; - if (!VerifyContext()) - return str; - - const WebDocument& document = frame_->document(); - const WebURL& url = document.baseURL(); - if (!url.isNull()) { - GURL gurl = url; - str = gurl.spec(); - } - - return str; -} - -CefString CefDOMDocumentImpl::GetCompleteURL(const CefString& partialURL) { - CefString str; - if (!VerifyContext()) - return str; - - const WebDocument& document = frame_->document(); - const WebURL& url = document.completeURL(string16(partialURL)); - if (!url.isNull()) { - GURL gurl = url; - str = gurl.spec(); - } - - return str; -} - -CefRefPtr CefDOMDocumentImpl::GetOrCreateNode( - const WebKit::WebNode& node) { - if (!VerifyContext()) - return NULL; - - // Nodes may potentially be null. - if (node.isNull()) - return NULL; - - if (!node_map_.empty()) { - // Locate the existing node, if any. - NodeMap::const_iterator it = node_map_.find(node); - if (it != node_map_.end()) - return it->second; - } - - // Create the new node object. - CefRefPtr nodeImpl(new CefDOMNodeImpl(this, node)); - node_map_.insert(std::make_pair(node, nodeImpl)); - return nodeImpl; -} - -void CefDOMDocumentImpl::RemoveNode(const WebKit::WebNode& node) { - if (!VerifyContext()) - return; - - if (!node_map_.empty()) { - NodeMap::iterator it = node_map_.find(node); - if (it != node_map_.end()) - node_map_.erase(it); - } -} - -void CefDOMDocumentImpl::Detach() { - if (!VerifyContext()) - return; - - // If you hit this assert it means that you are keeping references to node - // objects beyond the valid scope. - DCHECK(node_map_.empty()); - - // If you hit this assert it means that you are keeping references to this - // document object beyond the valid scope. - DCHECK_EQ(GetRefCt(), 1); - - if (!node_map_.empty()) { - NodeMap::const_iterator it = node_map_.begin(); - for (; it != node_map_.end(); ++it) - static_cast(it->second)->Detach(); - node_map_.clear(); - } - - frame_ = NULL; -} - -bool CefDOMDocumentImpl::VerifyContext() { - if (!CefThread::CurrentlyOn(CefThread::UI) || frame_ == NULL) { - NOTREACHED(); - return false; - } - return true; -} diff --git a/cef1/libcef/dom_document_impl.h b/cef1/libcef/dom_document_impl.h deleted file mode 100644 index 54296ac31..000000000 --- a/cef1/libcef/dom_document_impl.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_DOM_DOCUMENT_IMPL_H_ -#define CEF_LIBCEF_DOM_DOCUMENT_IMPL_H_ -#pragma once - -#include -#include "include/cef_dom.h" - -namespace WebKit { -class WebFrame; -class WebNode; -}; - -class CefBrowserImpl; - -class CefDOMDocumentImpl : public CefDOMDocument { - public: - CefDOMDocumentImpl(CefBrowserImpl* browser, - WebKit::WebFrame* frame); - virtual ~CefDOMDocumentImpl(); - - virtual Type GetType() OVERRIDE; - virtual CefRefPtr GetDocument() OVERRIDE; - virtual CefRefPtr GetBody() OVERRIDE; - virtual CefRefPtr GetHead() OVERRIDE; - virtual CefString GetTitle() OVERRIDE; - virtual CefRefPtr GetElementById(const CefString& id) OVERRIDE; - virtual CefRefPtr GetFocusedNode() OVERRIDE; - virtual bool HasSelection() OVERRIDE; - virtual CefRefPtr GetSelectionStartNode() OVERRIDE; - virtual int GetSelectionStartOffset() OVERRIDE; - virtual CefRefPtr GetSelectionEndNode() OVERRIDE; - virtual int GetSelectionEndOffset() OVERRIDE; - virtual CefString GetSelectionAsMarkup() OVERRIDE; - virtual CefString GetSelectionAsText() OVERRIDE; - virtual CefString GetBaseURL() OVERRIDE; - virtual CefString GetCompleteURL(const CefString& partialURL) OVERRIDE; - - CefBrowserImpl* GetBrowser() { return browser_; } - WebKit::WebFrame* GetFrame() { return frame_; } - - // The document maintains a map of all existing node objects. - CefRefPtr GetOrCreateNode(const WebKit::WebNode& node); - void RemoveNode(const WebKit::WebNode& node); - - // Must be called before the object is destroyed. - void Detach(); - - // Verify that the object exists and is being accessed on the UI thread. - bool VerifyContext(); - - protected: - CefBrowserImpl* browser_; - WebKit::WebFrame* frame_; - - typedef std::map NodeMap; - NodeMap node_map_; - - IMPLEMENT_REFCOUNTING(CefDOMDocumentImpl); -}; - -#endif // CEF_LIBCEF_DOM_DOCUMENT_IMPL_H_ diff --git a/cef1/libcef/dom_event_impl.cc b/cef1/libcef/dom_event_impl.cc deleted file mode 100644 index ba92fe40d..000000000 --- a/cef1/libcef/dom_event_impl.cc +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/dom_event_impl.h" -#include "libcef/cef_thread.h" -#include "libcef/dom_document_impl.h" - -#include "base/logging.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMEvent.h" - -using WebKit::WebDOMEvent; -using WebKit::WebString; - - -CefDOMEventImpl::CefDOMEventImpl(CefRefPtr document, - const WebKit::WebDOMEvent& event) - : document_(document), - event_(event) { - DCHECK(!event_.isNull()); -} - -CefDOMEventImpl::~CefDOMEventImpl() { - REQUIRE_UIT(); - DCHECK(event_.isNull()); -} - -CefString CefDOMEventImpl::GetType() { - CefString str; - if (!VerifyContext()) - return str; - - const WebString& type = event_.type(); - if (!type.isNull()) - str = type; - - return str; -} - -CefDOMEventImpl::Category CefDOMEventImpl::GetCategory() { - if (!VerifyContext()) - return DOM_EVENT_CATEGORY_UNKNOWN; - - int flags = 0; - if (event_.isUIEvent()) - flags |= DOM_EVENT_CATEGORY_UI; - if (event_.isMouseEvent()) - flags |= DOM_EVENT_CATEGORY_MOUSE; - if (event_.isMutationEvent()) - flags |= DOM_EVENT_CATEGORY_MUTATION; - if (event_.isKeyboardEvent()) - flags |= DOM_EVENT_CATEGORY_KEYBOARD; - if (event_.isTextEvent()) - flags |= DOM_EVENT_CATEGORY_TEXT; - if (event_.isCompositionEvent()) - flags |= DOM_EVENT_CATEGORY_COMPOSITION; - if (event_.isDragEvent()) - flags |= DOM_EVENT_CATEGORY_DRAG; - if (event_.isClipboardEvent()) - flags |= DOM_EVENT_CATEGORY_CLIPBOARD; - if (event_.isMessageEvent()) - flags |= DOM_EVENT_CATEGORY_MESSAGE; - if (event_.isWheelEvent()) - flags |= DOM_EVENT_CATEGORY_WHEEL; - if (event_.isBeforeTextInsertedEvent()) - flags |= DOM_EVENT_CATEGORY_BEFORE_TEXT_INSERTED; - if (event_.isOverflowEvent()) - flags |= DOM_EVENT_CATEGORY_OVERFLOW; - if (event_.isPageTransitionEvent()) - flags |= DOM_EVENT_CATEGORY_PAGE_TRANSITION; - if (event_.isPopStateEvent()) - flags |= DOM_EVENT_CATEGORY_POPSTATE; - if (event_.isProgressEvent()) - flags |= DOM_EVENT_CATEGORY_PROGRESS; - if (event_.isXMLHttpRequestProgressEvent()) - flags |= DOM_EVENT_CATEGORY_XMLHTTPREQUEST_PROGRESS; - if (event_.isBeforeLoadEvent()) - flags |= DOM_EVENT_CATEGORY_BEFORE_LOAD; - - return static_cast(flags); -} - -CefDOMEventImpl::Phase CefDOMEventImpl::GetPhase() { - if (!VerifyContext()) - return DOM_EVENT_PHASE_UNKNOWN; - - switch (event_.eventPhase()) { - case WebDOMEvent::CapturingPhase: - return DOM_EVENT_PHASE_CAPTURING; - case WebDOMEvent::AtTarget: - return DOM_EVENT_PHASE_AT_TARGET; - case WebDOMEvent::BubblingPhase: - return DOM_EVENT_PHASE_BUBBLING; - } - - return DOM_EVENT_PHASE_UNKNOWN; -} - -bool CefDOMEventImpl::CanBubble() { - if (!VerifyContext()) - return false; - - return event_.bubbles(); -} - -bool CefDOMEventImpl::CanCancel() { - if (!VerifyContext()) - return false; - - return event_.cancelable(); -} - -CefRefPtr CefDOMEventImpl::GetDocument() { - if (!VerifyContext()) - return NULL; - - return document_.get(); -} - -CefRefPtr CefDOMEventImpl::GetTarget() { - if (!VerifyContext()) - return NULL; - - return document_->GetOrCreateNode(event_.target()); -} - -CefRefPtr CefDOMEventImpl::GetCurrentTarget() { - if (!VerifyContext()) - return NULL; - - return document_->GetOrCreateNode(event_.currentTarget()); -} - -void CefDOMEventImpl::Detach() { - // If you hit this assert it means that you are keeping references to this - // event object beyond the valid scope. - DCHECK_EQ(GetRefCt(), 1); - - document_ = NULL; - event_.assign(WebDOMEvent()); -} - -bool CefDOMEventImpl::VerifyContext() { - if (!document_.get()) { - NOTREACHED(); - return false; - } - if (!document_->VerifyContext()) - return false; - if (event_.isNull()) { - NOTREACHED(); - return false; - } - return true; -} diff --git a/cef1/libcef/dom_event_impl.h b/cef1/libcef/dom_event_impl.h deleted file mode 100644 index 4b57af4bb..000000000 --- a/cef1/libcef/dom_event_impl.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_DOM_EVENT_IMPL_H_ -#define CEF_LIBCEF_DOM_EVENT_IMPL_H_ -#pragma once - -#include "include/cef_dom.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMEvent.h" - -class CefDOMDocumentImpl; - -class CefDOMEventImpl : public CefDOMEvent { - public: - CefDOMEventImpl(CefRefPtr document, - const WebKit::WebDOMEvent& event); - virtual ~CefDOMEventImpl(); - - virtual CefString GetType() OVERRIDE; - virtual Category GetCategory() OVERRIDE; - virtual Phase GetPhase() OVERRIDE; - virtual bool CanBubble() OVERRIDE; - virtual bool CanCancel() OVERRIDE; - virtual CefRefPtr GetDocument() OVERRIDE; - virtual CefRefPtr GetTarget() OVERRIDE; - virtual CefRefPtr GetCurrentTarget() OVERRIDE; - - // Will be called from CefDOMEventListenerWrapper::handleEvent(). - void Detach(); - - // Verify that the object exists and is being accessed on the UI thread. - bool VerifyContext(); - - protected: - CefRefPtr document_; - WebKit::WebDOMEvent event_; - - IMPLEMENT_REFCOUNTING(CefDOMEventImpl); -}; - -#endif // CEF_LIBCEF_DOM_EVENT_IMPL_H_ diff --git a/cef1/libcef/dom_node_impl.cc b/cef1/libcef/dom_node_impl.cc deleted file mode 100644 index 4ce6b3f66..000000000 --- a/cef1/libcef/dom_node_impl.cc +++ /dev/null @@ -1,460 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 "libcef/dom_node_impl.h" -#include "libcef/browser_impl.h" -#include "libcef/cef_thread.h" -#include "libcef/dom_document_impl.h" -#include "libcef/dom_event_impl.h" -#include "libcef/tracker.h" - -#include "base/logging.h" -#include "base/string_util.h" -#include "base/threading/non_thread_safe.h" -#include "base/utf_string_conversions.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMEvent.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMEventListener.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFormControlElement.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputElement.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebSelectElement.h" - -using WebKit::WebDocument; -using WebKit::WebDOMEvent; -using WebKit::WebDOMEventListener; -using WebKit::WebElement; -using WebKit::WebFrame; -using WebKit::WebFormControlElement; -using WebKit::WebInputElement; -using WebKit::WebNode; -using WebKit::WebSelectElement; -using WebKit::WebString; - -namespace { - -// Wrapper implementation for WebDOMEventListener. -class CefDOMEventListenerWrapper : public WebDOMEventListener, - public CefTrackNode, - public base::NonThreadSafe { - public: - CefDOMEventListenerWrapper(CefBrowserImpl* browser, WebFrame* frame, - CefRefPtr listener) - : browser_(browser), - frame_(frame), - listener_(listener) { - // Cause this object to be deleted immediately before the frame is closed. - browser->UIT_AddFrameObject(frame, this); - } - virtual ~CefDOMEventListenerWrapper() { - } - - virtual void handleEvent(const WebDOMEvent& event) { - CefRefPtr documentImpl; - CefRefPtr eventImpl; - - if (!event.isNull()) { - // Create CefDOMDocumentImpl and CefDOMEventImpl objects that are valid - // only for the scope of this method. - const WebDocument& document = frame_->document(); - if (!document.isNull()) { - documentImpl = new CefDOMDocumentImpl(browser_, frame_); - eventImpl = new CefDOMEventImpl(documentImpl, event); - } - } - - listener_->HandleEvent(eventImpl.get()); - - if (eventImpl.get()) - eventImpl->Detach(); - if (documentImpl.get()) - documentImpl->Detach(); - } - - protected: - CefBrowserImpl* browser_; - WebFrame* frame_; - CefRefPtr listener_; -}; - -} // namespace - - -CefDOMNodeImpl::CefDOMNodeImpl(CefRefPtr document, - const WebKit::WebNode& node) - : document_(document), - node_(node) { -} - -CefDOMNodeImpl::~CefDOMNodeImpl() { - REQUIRE_UIT(); - - if (document_.get() && !node_.isNull()) { - // Remove the node from the document. - document_->RemoveNode(node_); - } -} - -CefDOMNodeImpl::Type CefDOMNodeImpl::GetType() { - if (!VerifyContext()) - return DOM_NODE_TYPE_UNSUPPORTED; - - switch (node_.nodeType()) { - case WebNode::ElementNode: - return DOM_NODE_TYPE_ELEMENT; - case WebNode::AttributeNode: - return DOM_NODE_TYPE_ATTRIBUTE; - case WebNode::TextNode: - return DOM_NODE_TYPE_TEXT; - case WebNode::CDataSectionNode: - return DOM_NODE_TYPE_CDATA_SECTION; - case WebNode::EntityReferenceNode: - return DOM_NODE_TYPE_ENTITY_REFERENCE; - case WebNode::EntityNode: - return DOM_NODE_TYPE_ENTITY; - case WebNode::ProcessingInstructionsNode: - return DOM_NODE_TYPE_PROCESSING_INSTRUCTIONS; - case WebNode::CommentNode: - return DOM_NODE_TYPE_COMMENT; - case WebNode::DocumentNode: - return DOM_NODE_TYPE_DOCUMENT; - case WebNode::DocumentTypeNode: - return DOM_NODE_TYPE_DOCUMENT_TYPE; - case WebNode::DocumentFragmentNode: - return DOM_NODE_TYPE_DOCUMENT_FRAGMENT; - case WebNode::NotationNode: - return DOM_NODE_TYPE_NOTATION; - case WebNode::XPathNamespaceNode: - return DOM_NODE_TYPE_XPATH_NAMESPACE; - default: - return DOM_NODE_TYPE_UNSUPPORTED; - } -} - -bool CefDOMNodeImpl::IsText() { - if (!VerifyContext()) - return false; - - return node_.isTextNode(); -} - -bool CefDOMNodeImpl::IsElement() { - if (!VerifyContext()) - return false; - - return node_.isElementNode(); -} - -bool CefDOMNodeImpl::IsFormControlElement() { - if (!VerifyContext()) - return false; - - if (node_.isElementNode()) { - const WebElement& element = node_.toConst(); - return element.isFormControlElement(); - } - - return false; -} - -CefString CefDOMNodeImpl::GetFormControlElementType() { - CefString str; - if (!VerifyContext()) - return str; - - if (node_.isElementNode()) { - const WebElement& element = node_.toConst(); - if (element.isFormControlElement()) { - // Retrieve the type from the form control element. - const WebFormControlElement& formElement = - node_.toConst(); - - const string16& form_control_type = formElement.formControlType(); - str = form_control_type; - } - } - - return str; -} - -bool CefDOMNodeImpl::IsSame(CefRefPtr that) { - if (!VerifyContext()) - return false; - - CefDOMNodeImpl* impl = static_cast(that.get()); - if (!impl || !impl->VerifyContext()) - return false; - - return node_.equals(impl->node_); -} - -CefString CefDOMNodeImpl::GetName() { - CefString str; - if (!VerifyContext()) - return str; - - const WebString& name = node_.nodeName(); - if (!name.isNull()) - str = name; - - return str; -} - -CefString CefDOMNodeImpl::GetValue() { - CefString str; - if (!VerifyContext()) - return str; - - if (node_.isElementNode()) { - const WebElement& element = node_.toConst(); - if (element.isFormControlElement()) { - // Retrieve the value from the form control element. - const WebFormControlElement& formElement = - node_.toConst(); - - string16 value; - const string16& form_control_type = formElement.formControlType(); - if (form_control_type == ASCIIToUTF16("text")) { - const WebInputElement& input_element = - formElement.toConst(); - value = input_element.value(); - } else if (form_control_type == ASCIIToUTF16("select-one")) { - const WebSelectElement& select_element = - formElement.toConst(); - value = select_element.value(); - } - - TrimWhitespace(value, TRIM_LEADING, &value); - str = value; - } - } - - if (str.empty()) { - const WebString& value = node_.nodeValue(); - if (!value.isNull()) - str = value; - } - - return str; -} - -bool CefDOMNodeImpl::SetValue(const CefString& value) { - if (!VerifyContext()) - return false; - - if (node_.isElementNode()) - return false; - - return node_.setNodeValue(string16(value)); -} - -CefString CefDOMNodeImpl::GetAsMarkup() { - CefString str; - if (!VerifyContext()) - return str; - - const WebString& markup = node_.createMarkup(); - if (!markup.isNull()) - str = markup; - - return str; -} - -CefRefPtr CefDOMNodeImpl::GetDocument() { - if (!VerifyContext()) - return NULL; - - return document_.get(); -} - -CefRefPtr CefDOMNodeImpl::GetParent() { - if (!VerifyContext()) - return NULL; - - return document_->GetOrCreateNode(node_.parentNode()); -} - -CefRefPtr CefDOMNodeImpl::GetPreviousSibling() { - if (!VerifyContext()) - return NULL; - - return document_->GetOrCreateNode(node_.previousSibling()); -} - -CefRefPtr CefDOMNodeImpl::GetNextSibling() { - if (!VerifyContext()) - return NULL; - - return document_->GetOrCreateNode(node_.nextSibling()); -} - -bool CefDOMNodeImpl::HasChildren() { - if (!VerifyContext()) - return false; - - return node_.hasChildNodes(); -} - -CefRefPtr CefDOMNodeImpl::GetFirstChild() { - if (!VerifyContext()) - return NULL; - - return document_->GetOrCreateNode(node_.firstChild()); -} - -CefRefPtr CefDOMNodeImpl::GetLastChild() { - if (!VerifyContext()) - return NULL; - - return document_->GetOrCreateNode(node_.lastChild()); -} - -void CefDOMNodeImpl::AddEventListener(const CefString& eventType, - CefRefPtr listener, - bool useCapture) { - if (!VerifyContext()) - return; - - node_.addEventListener(string16(eventType), - new CefDOMEventListenerWrapper(document_->GetBrowser(), - document_->GetFrame(), listener), - useCapture); -} - -CefString CefDOMNodeImpl::GetElementTagName() { - CefString str; - if (!VerifyContext()) - return str; - - if (!node_.isElementNode()) { - NOTREACHED(); - return str; - } - - const WebElement& element = node_.toConst(); - const WebString& tagname = element.tagName(); - if (!tagname.isNull()) - str = tagname; - - return str; -} - -bool CefDOMNodeImpl::HasElementAttributes() { - if (!VerifyContext()) - return false; - - if (!node_.isElementNode()) { - NOTREACHED(); - return false; - } - - const WebElement& element = node_.toConst(); - return (element.attributeCount() > 0); -} - -bool CefDOMNodeImpl::HasElementAttribute(const CefString& attrName) { - if (!VerifyContext()) - return false; - - if (!node_.isElementNode()) { - NOTREACHED(); - return false; - } - - const WebElement& element = node_.toConst(); - return element.hasAttribute(string16(attrName)); -} - -CefString CefDOMNodeImpl::GetElementAttribute(const CefString& attrName) { - CefString str; - if (!VerifyContext()) - return str; - - if (!node_.isElementNode()) { - NOTREACHED(); - return str; - } - - const WebElement& element = node_.toConst(); - const WebString& attr = element.getAttribute(string16(attrName)); - if (!attr.isNull()) - str = attr; - - return str; -} - -void CefDOMNodeImpl::GetElementAttributes(AttributeMap& attrMap) { - if (!VerifyContext()) - return; - - if (!node_.isElementNode()) { - NOTREACHED(); - return; - } - - const WebElement& element = node_.toConst(); - unsigned int len = element.attributeCount(); - if (len == 0) - return; - - for (unsigned int i = 0; i < len; ++i) { - string16 name = element.attributeLocalName(i); - string16 value = element.attributeValue(i); - attrMap.insert(std::make_pair(name, value)); - } -} - -bool CefDOMNodeImpl::SetElementAttribute(const CefString& attrName, - const CefString& value) { - if (!VerifyContext()) - return false; - - if (!node_.isElementNode()) { - NOTREACHED(); - return false; - } - - WebElement element = node_.to(); - return element.setAttribute(string16(attrName), string16(value)); -} - -CefString CefDOMNodeImpl::GetElementInnerText() { - CefString str; - if (!VerifyContext()) - return str; - - if (!node_.isElementNode()) { - NOTREACHED(); - return str; - } - - WebElement element = node_.to(); - const WebString& text = element.innerText(); - if (!text.isNull()) - str = text; - - return str; -} - -void CefDOMNodeImpl::Detach() { - document_ = NULL; - node_.assign(WebNode()); -} - -bool CefDOMNodeImpl::VerifyContext() { - if (!document_.get()) { - NOTREACHED(); - return false; - } - if (!document_->VerifyContext()) - return false; - if (node_.isNull()) { - NOTREACHED(); - return false; - } - return true; -} diff --git a/cef1/libcef/dom_node_impl.h b/cef1/libcef/dom_node_impl.h deleted file mode 100644 index e98d1d2b1..000000000 --- a/cef1/libcef/dom_node_impl.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_DOM_NODE_IMPL_H_ -#define CEF_LIBCEF_DOM_NODE_IMPL_H_ -#pragma once - -#include "include/cef_dom.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h" - -class CefDOMDocumentImpl; - -class CefDOMNodeImpl : public CefDOMNode { - public: - CefDOMNodeImpl(CefRefPtr document, - const WebKit::WebNode& node); - virtual ~CefDOMNodeImpl(); - - virtual Type GetType() OVERRIDE; - virtual bool IsText() OVERRIDE; - virtual bool IsElement() OVERRIDE; - virtual bool IsFormControlElement() OVERRIDE; - virtual CefString GetFormControlElementType() OVERRIDE; - virtual bool IsSame(CefRefPtr that) OVERRIDE; - virtual CefString GetName() OVERRIDE; - virtual CefString GetValue() OVERRIDE; - virtual bool SetValue(const CefString& value) OVERRIDE; - virtual CefString GetAsMarkup() OVERRIDE; - virtual CefRefPtr GetDocument() OVERRIDE; - virtual CefRefPtr GetParent() OVERRIDE; - virtual CefRefPtr GetPreviousSibling() OVERRIDE; - virtual CefRefPtr GetNextSibling() OVERRIDE; - virtual bool HasChildren() OVERRIDE; - virtual CefRefPtr GetFirstChild() OVERRIDE; - virtual CefRefPtr GetLastChild() OVERRIDE; - virtual void AddEventListener(const CefString& eventType, - CefRefPtr listener, - bool useCapture) OVERRIDE; - virtual CefString GetElementTagName() OVERRIDE; - virtual bool HasElementAttributes() OVERRIDE; - virtual bool HasElementAttribute(const CefString& attrName) OVERRIDE; - virtual CefString GetElementAttribute(const CefString& attrName) OVERRIDE; - virtual void GetElementAttributes(AttributeMap& attrMap) OVERRIDE; - virtual bool SetElementAttribute(const CefString& attrName, - const CefString& value) OVERRIDE; - virtual CefString GetElementInnerText() OVERRIDE; - - // Will be called from CefDOMDocumentImpl::Detach(). - void Detach(); - - // Verify that the object exists and is being accessed on the UI thread. - bool VerifyContext(); - - protected: - CefRefPtr document_; - WebKit::WebNode node_; - - IMPLEMENT_REFCOUNTING(CefDOMNodeImpl); -}; - -#endif // CEF_LIBCEF_DOM_NODE_IMPL_H_ diff --git a/cef1/libcef/download_util.cc b/cef1/libcef/download_util.cc deleted file mode 100644 index 5d46e7afa..000000000 --- a/cef1/libcef/download_util.cc +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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 "libcef/download_util.h" - -#include "base/files/file_path.h" -#include "base/string16.h" -#include "base/string_util.h" -#include "base/strings/sys_string_conversions.h" -#include "base/utf_string_conversions.h" -#include "base/threading/thread.h" -#include "base/threading/thread_restrictions.h" -#include "googleurl/src/gurl.h" -#include "net/base/mime_util.h" -#include "net/base/net_util.h" - -namespace { - -#if defined(OS_WIN) -// Returns whether the specified extension is automatically integrated into the -// windows shell. -// From chrome/browser/download/download_util.cc -bool IsShellIntegratedExtension(const string16& extension) { - string16 extension_lower = StringToLowerASCII(extension); - - static const wchar_t* const integrated_extensions[] = { - // See . - L"local", - // Right-clicking on shortcuts can be magical. - L"lnk", - }; - - for (int i = 0; i < arraysize(integrated_extensions); ++i) { - if (extension_lower == integrated_extensions[i]) - return true; - } - - // See . - // That vulnerability report is not exactly on point, but files become magical - // if their end in a CLSID. Here we block extensions that look like CLSIDs. - if (extension_lower.size() > 0 && extension_lower.at(0) == L'{' && - extension_lower.at(extension_lower.length() - 1) == L'}') - return true; - - return false; -} - -// Returns whether the specified file name is a reserved name on windows. -// This includes names like "com2.zip" (which correspond to devices) and -// desktop.ini and thumbs.db which have special meaning to the windows shell. -// From chrome/browser/download/download_util.cc -bool IsReservedName(const string16& filename) { - // This list is taken from the MSDN article "Naming a file" - // http://msdn2.microsoft.com/en-us/library/aa365247(VS.85).aspx - // I also added clock$ because GetSaveFileName seems to consider it as a - // reserved name too. - static const wchar_t* const known_devices[] = { - L"con", L"prn", L"aux", L"nul", L"com1", L"com2", L"com3", L"com4", L"com5", - L"com6", L"com7", L"com8", L"com9", L"lpt1", L"lpt2", L"lpt3", L"lpt4", - L"lpt5", L"lpt6", L"lpt7", L"lpt8", L"lpt9", L"clock$" - }; - string16 filename_lower = StringToLowerASCII(filename); - - for (int i = 0; i < arraysize(known_devices); ++i) { - // Exact match. - if (filename_lower == known_devices[i]) - return true; - // Starts with "DEVICE.". - if (filename_lower.find(string16(known_devices[i]) + L".") == 0) - return true; - } - - static const wchar_t* const magic_names[] = { - // These file names are used by the "Customize folder" feature of the shell. - L"desktop.ini", - L"thumbs.db", - }; - - for (int i = 0; i < arraysize(magic_names); ++i) { - if (filename_lower == magic_names[i]) - return true; - } - - return false; -} -#endif // OS_WIN - -// Create an extension based on the file name and mime type. -// From chrome/browser/download/download_util.cc -void GenerateExtension(const base::FilePath& file_name, - const std::string& mime_type, - base::FilePath::StringType* generated_extension) { - // We're worried about two things here: - // - // 1) Usability. If the site fails to provide a file extension, we want to - // guess a reasonable file extension based on the content type. - // - // 2) Shell integration. Some file extensions automatically integrate with - // the shell. We block these extensions to prevent a malicious web site - // from integrating with the user's shell. - - // See if our file name already contains an extension. - base::FilePath::StringType extension = file_name.Extension(); - if (!extension.empty()) - extension.erase(extension.begin()); // Erase preceding '.'. - -#if defined(OS_WIN) - static const base::FilePath::CharType default_extension[] = - FILE_PATH_LITERAL("download"); - - // Rename shell-integrated extensions. - if (IsShellIntegratedExtension(extension)) - extension.assign(default_extension); -#endif - - if (extension.empty()) { - // The GetPreferredExtensionForMimeType call will end up going to disk. Do - // this on another thread to avoid slowing the IO thread. - // http://crbug.com/61827 - base::ThreadRestrictions::ScopedAllowIO allow_io; - net::GetPreferredExtensionForMimeType(mime_type, &extension); - } - - generated_extension->swap(extension); -} - -// Used to make sure we have a safe file extension and filename for a -// download. |file_name| can either be just the file name or it can be a -// full path to a file. -// From chrome/browser/download/download_util.cc -void GenerateSafeFileName(const std::string& mime_type, - base::FilePath* file_name) { - // Make sure we get the right file extension - base::FilePath::StringType extension; - GenerateExtension(*file_name, mime_type, &extension); - *file_name = file_name->ReplaceExtension(extension); - -#if defined(OS_WIN) - // Prepend "_" to the file name if it's a reserved name - base::FilePath::StringType leaf_name = file_name->BaseName().value(); - DCHECK(!leaf_name.empty()); - if (IsReservedName(leaf_name)) { - leaf_name = base::FilePath::StringType(FILE_PATH_LITERAL("_")) + leaf_name; - *file_name = file_name->DirName(); - if (file_name->value() == base::FilePath::kCurrentDirectory) { - *file_name = base::FilePath(leaf_name); - } else { - *file_name = file_name->Append(leaf_name); - } - } -#endif -} - -} // namespace - -namespace download_util { - -// Create a file name based on the response from the server. -// From chrome/browser/download/download_util.cc -void GenerateFileName(const GURL& url, - const std::string& content_disposition, - const std::string& referrer_charset, - const std::string& mime_type, - const std::string& suggested_name, - base::FilePath* generated_name) { - string16 new_name = net::GetSuggestedFilename(GURL(url), - content_disposition, - referrer_charset, - suggested_name, - mime_type, - "download"); - - // TODO(evan): this code is totally wrong -- we should just generate - // Unicode filenames and do all this encoding switching at the end. - // However, I'm just shuffling wrong code around, at least not adding - // to it. -#if defined(OS_WIN) - *generated_name = base::FilePath(new_name); -#else - *generated_name = - base::FilePath(base::SysWideToNativeMB(UTF16ToWide(new_name))); -#endif - - DCHECK(!generated_name->empty()); - - GenerateSafeFileName(mime_type, generated_name); -} - -} // namespace download_util diff --git a/cef1/libcef/download_util.h b/cef1/libcef/download_util.h deleted file mode 100644 index 98e71b4f4..000000000 --- a/cef1/libcef/download_util.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_DOWNLOAD_UTIL_H_ -#define CEF_LIBCEF_DOWNLOAD_UTIL_H_ -#pragma once - -#include - -class GURL; - -namespace base { -class FilePath; -} - -namespace download_util { - -// Create a file name based on the response from the server. -void GenerateFileName(const GURL& url, - const std::string& content_disposition, - const std::string& referrer_charset, - const std::string& mime_type, - const std::string& suggested_name, - base::FilePath* generated_name); - -} // namespace download_util - -#endif // CEF_LIBCEF_DOWNLOAD_UTIL_H_ diff --git a/cef1/libcef/drag_data_impl.cc b/cef1/libcef/drag_data_impl.cc deleted file mode 100644 index 83e9677ae..000000000 --- a/cef1/libcef/drag_data_impl.cc +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/drag_data_impl.h" -#include "base/files/file_path.h" - -CefDragDataImpl::CefDragDataImpl(const WebDropData& data) - : data_(data) { -} - -bool CefDragDataImpl::IsLink() { - return (data_.url.is_valid() && data_.file_description_filename.empty()); -} - -bool CefDragDataImpl::IsFragment() { - return (!data_.url.is_valid() && data_.file_description_filename.empty() && - data_.filenames.empty()); -} - -bool CefDragDataImpl::IsFile() { - return (!data_.file_description_filename.empty() || !data_.filenames.empty()); -} - -CefString CefDragDataImpl::GetLinkURL() { - return data_.url.spec(); -} - -CefString CefDragDataImpl::GetLinkTitle() { - return data_.url_title; -} - -CefString CefDragDataImpl::GetLinkMetadata() { - return data_.download_metadata; -} - -CefString CefDragDataImpl::GetFragmentText() { - return data_.text.is_null() ? CefString() : CefString(data_.text.string()); -} - -CefString CefDragDataImpl::GetFragmentHtml() { - return data_.html.is_null() ? CefString() : CefString(data_.html.string()); -} - -CefString CefDragDataImpl::GetFragmentBaseURL() { - return data_.html_base_url.spec(); -} - -CefString CefDragDataImpl::GetFileName() { - return data_.file_description_filename; -} - -bool CefDragDataImpl::GetFileNames(std::vector& names) { - if (data_.filenames.empty()) - return false; - - std::vector::const_iterator it = - data_.filenames.begin(); - for (; it != data_.filenames.end(); ++it) - names.push_back(it->path); - - return true; -} diff --git a/cef1/libcef/drag_data_impl.h b/cef1/libcef/drag_data_impl.h deleted file mode 100644 index b3c0c0ca8..000000000 --- a/cef1/libcef/drag_data_impl.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_DRAG_DATA_IMPL_H_ -#define CEF_LIBCEF_DRAG_DATA_IMPL_H_ -#pragma once - -#include - -#include "include/cef_drag_data.h" -#include "webkit/glue/webdropdata.h" - -// Implementation of CefDragData. -class CefDragDataImpl : public CefDragData { - public: - explicit CefDragDataImpl(const WebDropData& data); - - virtual bool IsLink(); - virtual bool IsFragment(); - virtual bool IsFile(); - virtual CefString GetLinkURL(); - virtual CefString GetLinkTitle(); - virtual CefString GetLinkMetadata(); - virtual CefString GetFragmentText(); - virtual CefString GetFragmentHtml(); - virtual CefString GetFragmentBaseURL(); - virtual CefString GetFileName(); - virtual bool GetFileNames(std::vector& names); - - protected: - WebDropData data_; - - IMPLEMENT_REFCOUNTING(CefDragDataImpl); -}; - -#endif // CEF_LIBCEF_DRAG_DATA_IMPL_H_ diff --git a/cef1/libcef/drag_download_file.cc b/cef1/libcef/drag_download_file.cc deleted file mode 100644 index d6cf2628c..000000000 --- a/cef1/libcef/drag_download_file.cc +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2009-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. - -#include "libcef/drag_download_file.h" -#include "libcef/browser_impl.h" -#include "libcef/cef_thread.h" - -#include "base/bind.h" -#include "base/file_util.h" -#include "base/message_loop.h" -#include "net/base/file_stream.h" - -DragDownloadFile::DragDownloadFile( - const base::FilePath& file_name_or_path, - scoped_ptr file_stream, - const GURL& url, - const GURL& referrer, - const std::string& referrer_encoding, - BrowserWebViewDelegate* view) - : file_stream_(file_stream.Pass()), - url_(url), - referrer_(referrer), - referrer_encoding_(referrer_encoding), - view_(view), - drag_message_loop_(base::MessageLoop::current()), - is_started_(false), - is_successful_(false) { -#if defined(OS_WIN) - DCHECK(!file_name_or_path.empty() && !file_stream.get()); - file_name_ = file_name_or_path; -#elif defined(OS_POSIX) - DCHECK(!file_name_or_path.empty() && file_stream.get()); - file_path_ = file_name_or_path; -#endif -} - -DragDownloadFile::~DragDownloadFile() { - AssertCurrentlyOnDragThread(); - - // Since the target application can still hold and use the dragged file, - // we do not know the time that it can be safely deleted. To solve this - // problem, we schedule it to be removed after the system is restarted. -#if defined(OS_WIN) - if (!temp_dir_path_.empty()) { - if (!file_path_.empty()) - file_util::DeleteAfterReboot(file_path_); - file_util::DeleteAfterReboot(temp_dir_path_); - } -#endif -} - -void DragDownloadFile::Start(ui::DownloadFileObserver* observer) { - AssertCurrentlyOnDragThread(); - - if (is_started_) - return; - is_started_ = true; - - DCHECK(!observer_.get()); - observer_ = observer; - - if (!file_stream_.get()) { - // Create a temporary directory to save the temporary download file. We do - // not want to use the default download directory since we do not want the - // twisted file name shown in the download shelf if the file with the same - // name already exists. - if (!file_util::CreateNewTempDirectory(FILE_PATH_LITERAL("chrome"), - &temp_dir_path_)) - return; - - file_path_ = temp_dir_path_.Append(file_name_); - } - - InitiateDownload(); -} - -bool DragDownloadFile::Wait() { - AssertCurrentlyOnDragThread(); - - if (is_started_) - nested_loop_.Run(); - return is_successful_; -} - -void DragDownloadFile::Stop() { -} - -void DragDownloadFile::InitiateDownload() { -#if defined(OS_WIN) - // DownloadManager could only be invoked from the UI thread. - if (!CefThread::CurrentlyOn(CefThread::UI)) { - CefThread::PostTask( - CefThread::UI, FROM_HERE, - base::Bind(&DragDownloadFile::InitiateDownload, this)); - return; - } -#endif - - // TODO(cef): You seem to have found an example of HTML5 drag and drop - // download. Please report it to the CEF developers so that we can add support - // for it. - NOTREACHED(); - bool is_successful = false; - DownloadCompleted(is_successful); -} - -void DragDownloadFile::DownloadCompleted(bool is_successful) { -#if defined(OS_WIN) - // If not in drag-and-drop thread, defer the running to it. - if (drag_message_loop_ != base::MessageLoop::current()) { - drag_message_loop_->PostTask( - FROM_HERE, - base::Bind(&DragDownloadFile::DownloadCompleted, this, is_successful)); - return; - } -#endif - - is_successful_ = is_successful; - - if (nested_loop_.running()) - nested_loop_.Quit(); -} - -void DragDownloadFile::AssertCurrentlyOnDragThread() { - // Only do the check on Windows where two threads are involved. -#if defined(OS_WIN) - DCHECK(drag_message_loop_ == base::MessageLoop::current()); -#endif -} - -void DragDownloadFile::AssertCurrentlyOnUIThread() { - // Only do the check on Windows where two threads are involved. -#if defined(OS_WIN) - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); -#endif -} diff --git a/cef1/libcef/drag_download_file.h b/cef1/libcef/drag_download_file.h deleted file mode 100644 index 0f8b4bfd8..000000000 --- a/cef1/libcef/drag_download_file.h +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2009-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. - -#ifndef CEF_LIBCEF_DRAG_DOWNLOAD_FILE_H_ -#define CEF_LIBCEF_DRAG_DOWNLOAD_FILE_H_ -#pragma once - -#include - -#include "base/files/file_path.h" -#include "base/memory/scoped_ptr.h" -#include "base/message_loop.h" -#include "base/run_loop.h" -#include "googleurl/src/gurl.h" -#include "ui/base/dragdrop/download_file_interface.h" - -class BrowserWebViewDelegate; - -namespace net { -class FileStream; -} - -class DragDownloadFile : public ui::DownloadFileProvider { - public: - // On Windows, we need to download into a temporary file. Two threads are - // involved: background drag-and-drop thread and UI thread. - // The first parameter file_name_or_path should contain file name while the - // second parameter file_stream should be NULL. - // - // On MacOSX, we need to download into a file stream that has already been - // created. Only UI thread is involved. - // The file path and file stream should be provided as the first two - // parameters. - DragDownloadFile(const base::FilePath& file_name_or_path, - scoped_ptr file_stream, - const GURL& url, - const GURL& referrer, - const std::string& referrer_encoding, - BrowserWebViewDelegate* view); - - // DownloadFileProvider methods. - // Called on drag-and-drop thread (Windows). - // Called on UI thread (MacOSX). - virtual void Start(ui::DownloadFileObserver* observer) OVERRIDE; - virtual bool Wait() OVERRIDE; - virtual void Stop() OVERRIDE; - - private: - // Called on drag-and-drop thread (Windows). - // Called on UI thread (Windows). - virtual ~DragDownloadFile(); - - // Called on either drag-and-drop thread or UI thread (Windows). - // Called on UI thread (MacOSX). - void InitiateDownload(); - void DownloadCompleted(bool is_successful); - - // Helper methods to make sure we're in the correct thread. - void AssertCurrentlyOnDragThread(); - void AssertCurrentlyOnUIThread(); - - // Initialized on drag-and-drop thread. Accessed on either thread after that - // (Windows). - // Accessed on UI thread (MacOSX). - base::FilePath file_path_; - base::FilePath file_name_; - scoped_ptr file_stream_; - GURL url_; - GURL referrer_; - std::string referrer_encoding_; - BrowserWebViewDelegate* view_; - base::MessageLoop* drag_message_loop_; - base::FilePath temp_dir_path_; - - // Accessed on drag-and-drop thread (Windows). - // Accessed on UI thread (MacOSX). - bool is_started_; - bool is_successful_; - scoped_refptr observer_; - base::RunLoop nested_loop_; - - // Accessed on drag-and-drop thread (Windows only). -#if defined(OS_WIN) - bool is_running_nested_message_loop_; -#endif - - DISALLOW_COPY_AND_ASSIGN(DragDownloadFile); -}; - -#endif // CEF_LIBCEF_DRAG_DOWNLOAD_FILE_H_ diff --git a/cef1/libcef/drag_download_util.cc b/cef1/libcef/drag_download_util.cc deleted file mode 100644 index a92b862b3..000000000 --- a/cef1/libcef/drag_download_util.cc +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright (c) 2011 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 "libcef/cef_thread.h" -#include "libcef/drag_download_util.h" - -#include "base/bind.h" -#include "base/string_util.h" -#include "base/files/file_path.h" -#include "base/file_util.h" -#include "base/memory/scoped_ptr.h" -#include "base/string_number_conversions.h" -#include "base/utf_string_conversions.h" -#include "googleurl/src/gurl.h" -#include "net/base/file_stream.h" -#include "net/base/net_errors.h" - -using net::FileStream; - -namespace drag_download_util { - -bool ParseDownloadMetadata(const string16& metadata, - string16* mime_type, - base::FilePath* file_name, - GURL* url) { - const char16 separator = L':'; - - size_t mime_type_end_pos = metadata.find(separator); - if (mime_type_end_pos == string16::npos) - return false; - - size_t file_name_end_pos = metadata.find(separator, mime_type_end_pos + 1); - if (file_name_end_pos == string16::npos) - return false; - - GURL parsed_url = GURL(metadata.substr(file_name_end_pos + 1)); - if (!parsed_url.is_valid()) - return false; - - if (mime_type) - *mime_type = metadata.substr(0, mime_type_end_pos); - if (file_name) { - string16 file_name_str = metadata.substr( - mime_type_end_pos + 1, file_name_end_pos - mime_type_end_pos - 1); -#if defined(OS_WIN) - *file_name = base::FilePath(file_name_str); -#else - *file_name = base::FilePath(UTF16ToUTF8(file_name_str)); -#endif - } - if (url) - *url = parsed_url; - - return true; -} - -FileStream* CreateFileStreamForDrop(base::FilePath* file_path) { - DCHECK(file_path && !file_path->empty()); - - scoped_ptr file_stream(new FileStream(NULL)); - const int kMaxSeq = 99; - for (int seq = 0; seq <= kMaxSeq; seq++) { - base::FilePath new_file_path; - if (seq == 0) { - new_file_path = *file_path; - } else { -#if defined(OS_WIN) - string16 suffix = ASCIIToUTF16("-") + base::IntToString16(seq); -#else - std::string suffix = std::string("-") + base::IntToString(seq); -#endif - new_file_path = file_path->InsertBeforeExtension(suffix); - } - - // Explicitly (and redundantly check) for file -- despite the fact that our - // open won't overwrite -- just to avoid log spew. - if (!file_util::PathExists(new_file_path) && - file_stream->OpenSync(new_file_path, base::PLATFORM_FILE_CREATE | - base::PLATFORM_FILE_WRITE) == net::OK) { - *file_path = new_file_path; - return file_stream.release(); - } - } - - return NULL; -} - -PromiseFileFinalizer::PromiseFileFinalizer( - DragDownloadFile* drag_file_downloader) - : drag_file_downloader_(drag_file_downloader) { -} - -PromiseFileFinalizer::~PromiseFileFinalizer() {} - -void PromiseFileFinalizer::Cleanup() { - if (drag_file_downloader_.get()) - drag_file_downloader_ = NULL; -} - -void PromiseFileFinalizer::OnDownloadCompleted( - const base::FilePath& file_path) { - CefThread::PostTask( - CefThread::UI, FROM_HERE, - base::Bind(&PromiseFileFinalizer::Cleanup, this)); -} - -void PromiseFileFinalizer::OnDownloadAborted() { - CefThread::PostTask( - CefThread::UI, FROM_HERE, - base::Bind(&PromiseFileFinalizer::Cleanup, this)); -} - -} // namespace drag_download_util diff --git a/cef1/libcef/drag_download_util.h b/cef1/libcef/drag_download_util.h deleted file mode 100644 index 7f480a2cf..000000000 --- a/cef1/libcef/drag_download_util.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_DRAG_DOWNLOAD_UTIL_H_ -#define CEF_LIBCEF_DRAG_DOWNLOAD_UTIL_H_ -#pragma once - -#include "libcef/drag_download_file.h" - -#include "base/basictypes.h" -#include "base/memory/ref_counted.h" -#include "base/string16.h" -#include "ui/base/dragdrop/download_file_interface.h" - -class GURL; - -namespace base { -class FilePath; -} - -namespace net { -class FileStream; -} - -namespace drag_download_util { - -// Parse the download metadata set in DataTransfer.setData. The metadata -// consists of a set of the following values separated by ":" -// * MIME type -// * File name -// * URL -// If the file name contains special characters, they need to be escaped -// appropriately. -// For example, we can have -// text/plain:example.txt:http://example.com/example.txt -bool ParseDownloadMetadata(const string16& metadata, - string16* mime_type, - base::FilePath* file_name, - GURL* url); - -// Create a new file at the specified path. If the file already exists, try to -// insert the sequential unifier to produce a new file, like foo-01.txt. -// Return a FileStream if successful. -net::FileStream* CreateFileStreamForDrop(base::FilePath* file_path); - -// Implementation of DownloadFileObserver to finalize the download process. -class PromiseFileFinalizer : public ui::DownloadFileObserver { - public: - explicit PromiseFileFinalizer(DragDownloadFile* drag_file_downloader); - virtual ~PromiseFileFinalizer(); - - // DownloadFileObserver methods. - virtual void OnDownloadCompleted(const base::FilePath& file_path); - virtual void OnDownloadAborted(); - - private: - void Cleanup(); - - scoped_refptr drag_file_downloader_; - - DISALLOW_COPY_AND_ASSIGN(PromiseFileFinalizer); -}; - -} // namespace drag_download_util - -#endif // CEF_LIBCEF_DRAG_DOWNLOAD_UTIL_H_ diff --git a/cef1/libcef/external_popup_menu_mac.h b/cef1/libcef/external_popup_menu_mac.h deleted file mode 100644 index 7beb29096..000000000 --- a/cef1/libcef/external_popup_menu_mac.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions 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. - -#ifndef CEF_LIBCEF_EXTERNAL_POPUP_MENU_MAC_H_ -#define CEF_LIBCEF_EXTERNAL_POPUP_MENU_MAC_H_ -#pragma once - -#include "base/basictypes.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebExternalPopupMenu.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenuInfo.h" - -class BrowserWebViewDelegate; -namespace WebKit { -class WebExternalPopupMenuClient; -} - -class ExternalPopupMenu : public WebKit::WebExternalPopupMenu { - public: - ExternalPopupMenu(BrowserWebViewDelegate* delegate, - const WebKit::WebPopupMenuInfo& popup_menu_info, - WebKit::WebExternalPopupMenuClient* popup_menu_client); - virtual ~ExternalPopupMenu() {} - - // WebKit::WebExternalPopupMenu implementation: - virtual void show(const WebKit::WebRect& bounds); - virtual void close(); - - private: - BrowserWebViewDelegate* delegate_; - WebKit::WebPopupMenuInfo popup_menu_info_; - WebKit::WebExternalPopupMenuClient* popup_menu_client_; - - DISALLOW_COPY_AND_ASSIGN(ExternalPopupMenu); -}; - -#endif // CEF_LIBCEF_EXTERNAL_POPUP_MENU_MAC_H_ diff --git a/cef1/libcef/external_popup_menu_mac.mm b/cef1/libcef/external_popup_menu_mac.mm deleted file mode 100644 index 757f2b25e..000000000 --- a/cef1/libcef/external_popup_menu_mac.mm +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions 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. - -#include "libcef/external_popup_menu_mac.h" -#include "libcef/browser_impl.h" - -#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebExternalPopupMenuClient.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenuInfo.h" -#include "webkit/glue/webmenurunner_mac.h" - -ExternalPopupMenu::ExternalPopupMenu( - BrowserWebViewDelegate* delegate, - const WebKit::WebPopupMenuInfo& popup_menu_info, - WebKit::WebExternalPopupMenuClient* popup_menu_client) - : delegate_(delegate), - popup_menu_info_(popup_menu_info), - popup_menu_client_(popup_menu_client) { -} - -void ExternalPopupMenu::show(const WebKit::WebRect& bounds) { - // Display a HTML select menu. - - std::vector items; - for (size_t i = 0; i < popup_menu_info_.items.size(); ++i) - items.push_back(popup_menu_info_.items[i]); - - double font_size = popup_menu_info_.itemFontSize; - int selected_index = popup_menu_info_.selectedIndex; - bool right_aligned = popup_menu_info_.rightAligned; - - CefBrowserImpl* browser = delegate_->GetBrowser(); - - NSView* view = nil; - NSRect view_rect; - - if (!browser->IsWindowRenderingDisabled()) { - view = browser->UIT_GetWebViewWndHandle(); - view_rect = [view bounds]; - } else { - view = browser->UIT_GetMainWndHandle(); - if (view != nil) { - CefRefPtr client = browser->GetClient(); - if (client.get()) { - // Retrieve the view rect. - CefRect rect; - CefRefPtr render_handler = client->GetRenderHandler(); - if (render_handler.get() && - render_handler->GetViewRect(browser, rect)) { - view_rect = NSMakeRect(rect.x, rect.y, rect.width, rect.height); - } - } - } - } - - if (view == nil || view_rect.size.width == 0 || view_rect.size.height == 0) { - popup_menu_client_->didCancel(); - delegate_->ClosePopupMenu(); - return; - } - - // Set up the menu position. - int y_offset = bounds.y + bounds.height; - NSRect position = NSMakeRect(bounds.x, view_rect.size.height - y_offset, - bounds.width, bounds.height); - - // Display the menu. - scoped_nsobject menu_runner; - menu_runner.reset([[WebMenuRunner alloc] initWithItems:items - fontSize:font_size - rightAligned:right_aligned]); - - [menu_runner runMenuInView:view - withBounds:position - initialIndex:selected_index]; - - if ([menu_runner menuItemWasChosen]) - popup_menu_client_->didAcceptIndex([menu_runner indexOfSelectedItem]); - else - popup_menu_client_->didCancel(); - - delegate_->ClosePopupMenu(); -} - -void ExternalPopupMenu::close() { - popup_menu_client_ = NULL; - delegate_ = NULL; -} diff --git a/cef1/libcef/external_protocol_handler.h b/cef1/libcef/external_protocol_handler.h deleted file mode 100644 index 67f94387b..000000000 --- a/cef1/libcef/external_protocol_handler.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_EXTERNAL_PROTOCOL_HANDLER_H_ -#define CEF_LIBCEF_EXTERNAL_PROTOCOL_HANDLER_H_ -#pragma once - -#include - -class GURL; - -namespace ExternalProtocolHandler { - -// Returns true if the OS provides external support for the specified |scheme|. -bool HasExternalHandler(const std::string& scheme); - -// Pass handling of the specified |gurl| to the OS. -bool HandleExternalProtocol(const GURL& gurl); - -} // namespace ExternalProtocolHandler - -#endif // CEF_LIBCEF_EXTERNAL_PROTOCOL_HANDLER_H_ diff --git a/cef1/libcef/external_protocol_handler_gtk.cc b/cef1/libcef/external_protocol_handler_gtk.cc deleted file mode 100644 index 7efb413eb..000000000 --- a/cef1/libcef/external_protocol_handler_gtk.cc +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/external_protocol_handler.h" - -namespace ExternalProtocolHandler { - -bool HasExternalHandler(const std::string& scheme) { - return false; -} - -bool HandleExternalProtocol(const GURL& gurl) { - return false; -} - -} // namespace ExternalProtocolHandler diff --git a/cef1/libcef/external_protocol_handler_mac.mm b/cef1/libcef/external_protocol_handler_mac.mm deleted file mode 100644 index 7efb413eb..000000000 --- a/cef1/libcef/external_protocol_handler_mac.mm +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/external_protocol_handler.h" - -namespace ExternalProtocolHandler { - -bool HasExternalHandler(const std::string& scheme) { - return false; -} - -bool HandleExternalProtocol(const GURL& gurl) { - return false; -} - -} // namespace ExternalProtocolHandler diff --git a/cef1/libcef/external_protocol_handler_win.cc b/cef1/libcef/external_protocol_handler_win.cc deleted file mode 100644 index 12f3a3fce..000000000 --- a/cef1/libcef/external_protocol_handler_win.cc +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/external_protocol_handler.h" - -#include -#include - -#include "base/utf_string_conversions.h" -#include "base/win/registry.h" -#include "googleurl/src/gurl.h" - -namespace ExternalProtocolHandler { - -// According to Mozilla in uriloader/exthandler/win/nsOSHelperAppService.cpp: -// "Some versions of windows (Win2k before SP3, Win XP before SP1) crash in -// ShellExecute on long URLs (bug 161357 on bugzilla.mozilla.org). IE 5 and 6 -// support URLS of 2083 chars in length, 2K is safe." -const int kMaxAddressLengthChars = 2048; - -bool HasExternalHandler(const std::string& scheme) { - base::win::RegKey key; - const std::wstring registry_path = - ASCIIToWide(scheme + "\\shell\\open\\command"); - key.Open(HKEY_CLASSES_ROOT, registry_path.c_str(), KEY_READ); - if (key.Valid()) { - DWORD size = 0; - key.ReadValue(NULL, NULL, &size, NULL); - if (size > 2) { - // ShellExecute crashes the process when the command is empty. - // We check for "2" because it always returns the trailing NULL. - return true; - } - } - - return false; -} - -bool HandleExternalProtocol(const GURL& gurl) { - if (!HasExternalHandler(gurl.scheme())) - return false; - - const std::string& address = gurl.spec(); - if (address.length() > kMaxAddressLengthChars) - return false; - - ShellExecuteA(NULL, "open", address.c_str(), NULL, NULL, SW_SHOWNORMAL); - - return true; -} - -} // namespace ExternalProtocolHandler diff --git a/cef1/libcef/geolocation_client.cc b/cef1/libcef/geolocation_client.cc deleted file mode 100644 index ab709f069..000000000 --- a/cef1/libcef/geolocation_client.cc +++ /dev/null @@ -1,355 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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 "libcef/geolocation_client.h" -#include "libcef/browser_impl.h" -#include "libcef/cef_context.h" -#include "libcef/cef_thread.h" - -// Allow access to content internals. -#define CONTENT_IMPLEMENTATION 1 - -#include "base/bind.h" -#include "base/logging.h" -#include "content/browser/geolocation/geolocation_observer.h" -#include "content/browser/geolocation/geolocation_provider.h" -#include "content/browser/geolocation/location_provider.h" -#include "content/public/browser/access_token_store.h" -#include "content/public/browser/content_browser_client.h" -#include "content/public/common/geoposition.h" -#include "content/public/common/content_client.h" -#include "content/public/common/content_switches.h" -#include "net/url_request/url_request_context_getter.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebGeolocationPermissionRequest.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebGeolocationPermissionRequestManager.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebGeolocationClient.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebGeolocationPosition.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebGeolocationError.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" -#include "webkit/user_agent/user_agent.h" - -using WebKit::WebGeolocationController; -using WebKit::WebGeolocationError; -using WebKit::WebGeolocationPermissionRequest; -using WebKit::WebGeolocationPermissionRequestManager; -using WebKit::WebGeolocationPosition; - -namespace { - -class CefURLRequestContextGetter : public net::URLRequestContextGetter { - public: - CefURLRequestContextGetter() {} - - virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE { - return _Context->request_context(); - } - - virtual scoped_refptr - GetNetworkTaskRunner() const OVERRIDE { - return CefThread::GetMessageLoopProxyForThread(CefThread::IO); - } - - private: - DISALLOW_COPY_AND_ASSIGN(CefURLRequestContextGetter); -}; - -// In-memory store for access tokens used by geolocation. -class CefAccessTokenStore : public content::AccessTokenStore { - public: - CefAccessTokenStore() {} - - virtual void LoadAccessTokens( - const LoadAccessTokensCallbackType& callback) OVERRIDE { - if (!request_context_getter_) - request_context_getter_ = new CefURLRequestContextGetter; - callback.Run(access_token_set_, request_context_getter_); - } - - virtual void SaveAccessToken( - const GURL& server_url, const string16& access_token) OVERRIDE { - access_token_set_[server_url] = access_token; - } - - private: - AccessTokenSet access_token_set_; - scoped_refptr request_context_getter_; - - DISALLOW_COPY_AND_ASSIGN(CefAccessTokenStore); -}; - -// Stub implementation of ContentClient. -class CefContentClient : public content::ContentClient { - public: - CefContentClient() {} - - virtual std::string GetUserAgent() const OVERRIDE { - return webkit_glue::GetUserAgent(GURL()); - } -}; - -// Stub implementation of ContentBrowserClient. -class CefContentBrowserClient : public content::ContentBrowserClient { - public: - CefContentBrowserClient() {} - - virtual content::AccessTokenStore* CreateAccessTokenStore() OVERRIDE { - return new CefAccessTokenStore(); - } -}; - -void NotifyArbitratorPermissionGranted() { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - content::GeolocationProvider::GetInstance()->OnPermissionGranted(); -} - -} // namespace - - -// CefGeolocationCallback implementation. -class CefGeolocationCallbackImpl : public CefGeolocationCallback { - public: - CefGeolocationCallbackImpl(CefGeolocationClient* client, int bridge_id) - : client_(client), - bridge_id_(bridge_id) {} - - virtual void Continue(bool allow) OVERRIDE { - if (CefThread::CurrentlyOn(CefThread::UI)) { - if (client_) { - client_->OnPermissionSet(bridge_id_, allow); - client_ = NULL; - } - } else { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefGeolocationCallbackImpl::Continue, this, allow)); - } - } - - private: - scoped_refptr client_; - int bridge_id_; - - IMPLEMENT_REFCOUNTING(CefGeolocationCallbackImpl); -}; - - -CefGeolocationClient::CefGeolocationClient(CefBrowserImpl* browser) - : browser_(browser), - pending_permissions_(new WebGeolocationPermissionRequestManager()), - enable_high_accuracy_(false), - updating_(false), - location_provider_(NULL) { -} - -CefGeolocationClient::~CefGeolocationClient() {} - -// static -void CefGeolocationClient::InitializeEnvironment() { - // GeolocationArbitrator uses ContentClient to retrieve the AccessTokenStore. - // Simulate the necessary interfaces here. - if (!content::GetContentClient()) { - static CefContentClient content_client; - static CefContentBrowserClient browser_client; - content::SetContentClient(&content_client); - content::SetBrowserClientForTesting(&browser_client); - } -} - -void CefGeolocationClient::geolocationDestroyed() { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - controller_.reset(); - DCHECK(!updating_); -} - -void CefGeolocationClient::startUpdating() { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - CefThread::PostTask(CefThread::IO, FROM_HERE, - base::Bind(&CefGeolocationClient::OnStartUpdating, this, - enable_high_accuracy_)); - updating_ = true; -} - -void CefGeolocationClient::stopUpdating() { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - CefThread::PostTask(CefThread::IO, FROM_HERE, - base::Bind(&CefGeolocationClient::OnStopUpdating, this)); - updating_ = false; -} - -void CefGeolocationClient::setEnableHighAccuracy(bool enable_high_accuracy) { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - // GeolocationController calls setEnableHighAccuracy(true) before - // startUpdating in response to the first high-accuracy Geolocation - // subscription. When the last high-accuracy Geolocation unsubscribes - // it calls setEnableHighAccuracy(false) after stopUpdating. - bool has_changed = enable_high_accuracy_ != enable_high_accuracy; - enable_high_accuracy_ = enable_high_accuracy; - // We have a different accuracy requirement. Request browser to update. - if (updating_ && has_changed) - startUpdating(); -} - -void CefGeolocationClient::setController( - WebGeolocationController* controller) { - controller_.reset(controller); -} - -bool CefGeolocationClient::lastPosition(WebGeolocationPosition&) { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - // The latest position is stored in the browser, not the renderer, so we - // would have to fetch it synchronously to give a good value here. The - // WebCore::GeolocationController already caches the last position it - // receives, so there is not much benefit to more position caching here. - return false; -} - -void CefGeolocationClient::requestPermission( - const WebGeolocationPermissionRequest& permissionRequest) { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - int bridge_id = pending_permissions_->add(permissionRequest); - GURL origin = GURL(permissionRequest.securityOrigin().toString()); - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = - client->GetGeolocationHandler(); - if (handler.get()) { - CefRefPtr callbackPtr( - new CefGeolocationCallbackImpl(this, bridge_id)); - - handler->OnRequestGeolocationPermission(browser_, origin.spec(), - bridge_id, callbackPtr.get()); - return; - } - } - - // Disallow geolocation access by default. - OnPermissionSet(bridge_id, false); -} - -void CefGeolocationClient::cancelPermissionRequest( - const WebGeolocationPermissionRequest& permissionRequest) { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - int bridge_id; - if (!pending_permissions_->remove(permissionRequest, bridge_id)) - return; - GURL origin = GURL(permissionRequest.securityOrigin().toString()); - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = - client->GetGeolocationHandler(); - if (handler.get()) { - handler->OnCancelGeolocationPermission(browser_, origin.spec(), - bridge_id); - } - } -} - -void CefGeolocationClient::OnStartUpdating(bool enable_high_accuracy) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - InitializeEnvironment(); - - if (!location_provider_) - location_provider_ = content::GeolocationProvider::GetInstance(); - - // Re-add to re-establish our options, in case they changed. - location_provider_->AddObserver( - this, content::GeolocationObserverOptions(enable_high_accuracy)); -} - -void CefGeolocationClient::OnStopUpdating() { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - if (location_provider_) { - location_provider_->RemoveObserver(this); - location_provider_ = NULL; - } -} - -void CefGeolocationClient::OnLocationUpdate( - const content::Geoposition& position) { - DCHECK(CefThread::CurrentlyOn(CefThread::IO)); - - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefGeolocationClient::OnPositionUpdated, this, position)); -} - -// Permission for using geolocation has been set. -void CefGeolocationClient::OnPermissionSet(int bridge_id, bool is_allowed) { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - WebGeolocationPermissionRequest permissionRequest; - if (!pending_permissions_->remove(bridge_id, permissionRequest)) - return; - permissionRequest.setIsAllowed(is_allowed); - - if (is_allowed) { - CefThread::PostTask( - CefThread::IO, FROM_HERE, - base::Bind(&NotifyArbitratorPermissionGranted)); - } -} - -// We have an updated geolocation position or error code. -void CefGeolocationClient::OnPositionUpdated( - const content::Geoposition& geoposition) { - DCHECK(CefThread::CurrentlyOn(CefThread::UI)); - - // It is possible for the browser process to have queued an update message - // before receiving the stop updating message. - if (!updating_) - return; - - if (geoposition.Validate()) { - controller_->positionChanged( - WebGeolocationPosition( - geoposition.timestamp.ToDoubleT(), - geoposition.latitude, geoposition.longitude, - geoposition.accuracy, - // Lowest point on land is at approximately -400 meters. - geoposition.altitude > -10000., - geoposition.altitude, - geoposition.altitude_accuracy >= 0., - geoposition.altitude_accuracy, - geoposition.heading >= 0. && geoposition.heading <= 360., - geoposition.heading, - geoposition.speed >= 0., - geoposition.speed)); - } else { - WebGeolocationError::Error code; - switch (geoposition.error_code) { - case content::Geoposition::ERROR_CODE_PERMISSION_DENIED: - code = WebGeolocationError::ErrorPermissionDenied; - break; - case content::Geoposition::ERROR_CODE_POSITION_UNAVAILABLE: - code = WebGeolocationError::ErrorPositionUnavailable; - break; - default: - NOTREACHED() << geoposition.error_code; - return; - } - controller_->errorOccurred( - WebGeolocationError( - code, WebKit::WebString::fromUTF8(geoposition.error_message))); - } -} - - -// Extract from content/public/common/content_switches.cc. - -namespace switches { - -const char kExperimentalLocationFeatures[] = "experimental-location-features"; - -} // namespace switches diff --git a/cef1/libcef/geolocation_client.h b/cef1/libcef/geolocation_client.h deleted file mode 100644 index 26665208c..000000000 --- a/cef1/libcef/geolocation_client.h +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_GEOLOCATION_CLIENT_H_ -#define CEF_LIBCEF_GEOLOCATION_CLIENT_H_ -#pragma once - -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" -#include "content/browser/geolocation/geolocation_observer.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebGeolocationClient.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebGeolocationController.h" - -class CefBrowserImpl; -class CefGeolocationCallbackImpl; - -namespace content { -class GeolocationProvider; -struct Geoposition; -} - -namespace WebKit { -class WebGeolocationController; -class WebGeolocationPermissionRequest; -class WebGeolocationPermissionRequestManager; -class WebGeolocationPosition; -} - -// Delegate for Geolocation messages used by WebKit. -class CefGeolocationClient - : public WebKit::WebGeolocationClient, - public content::GeolocationObserver, - public base::RefCountedThreadSafe { - public: - explicit CefGeolocationClient(CefBrowserImpl* browser); - virtual ~CefGeolocationClient(); - - static void InitializeEnvironment(); - - private: - friend class CefGeolocationCallbackImpl; - - // WebGeolocationClient methods. - virtual void geolocationDestroyed() OVERRIDE; - virtual void startUpdating() OVERRIDE; - virtual void stopUpdating() OVERRIDE; - virtual void setEnableHighAccuracy(bool enable_high_accuracy) OVERRIDE; - virtual void setController( - WebKit::WebGeolocationController* controller) OVERRIDE; - virtual bool lastPosition(WebKit::WebGeolocationPosition& position) OVERRIDE; - virtual void requestPermission( - const WebKit::WebGeolocationPermissionRequest& permissionRequest) - OVERRIDE; - virtual void cancelPermissionRequest( - const WebKit::WebGeolocationPermissionRequest& permissionRequest) - OVERRIDE; - - // Called to continue processing on the IO thread. - void OnStartUpdating(bool enable_high_accuracy); - void OnStopUpdating(); - - // GeolocationObserver methods. - virtual void OnLocationUpdate(const content::Geoposition& position) OVERRIDE; - - // Permission for using geolocation has been set. - void OnPermissionSet(int bridge_id, bool is_allowed); - - // We have an updated geolocation position or error code. - void OnPositionUpdated(const content::Geoposition& geoposition); - - // The following members are only accessed on the UI thread. - - // The |browser_| pointer is guaranteed to outlive this object. - CefBrowserImpl* browser_; - - // The controller_ is valid for the lifetime of the underlying - // WebCore::GeolocationController. geolocationDestroyed() is - // invoked when the underlying object is destroyed. - scoped_ptr controller_; - - scoped_ptr - pending_permissions_; - bool enable_high_accuracy_; - bool updating_; - - // The following members are only accessed on the IO thread. - - // Only set whilst we are registered with the arbitrator. - content::GeolocationProvider* location_provider_; - - DISALLOW_COPY_AND_ASSIGN(CefGeolocationClient); -}; - -#endif // CEF_LIBCEF_GEOLOCATION_CLIENT_H_ diff --git a/cef1/libcef/geolocation_impl.cc b/cef1/libcef/geolocation_impl.cc deleted file mode 100644 index e5fd884ff..000000000 --- a/cef1/libcef/geolocation_impl.cc +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 "include/cef_geolocation.h" -#include "libcef/cef_context.h" -#include "libcef/cef_thread.h" -#include "libcef/cef_time_util.h" -#include "libcef/geolocation_client.h" -#include "base/logging.h" -#include "content/browser/geolocation/geolocation_provider.h" -#include "content/public/common/geoposition.h" - -namespace { - -void SetPosition(const content::Geoposition& source, CefGeoposition& target) { - target.latitude = source.latitude; - target.longitude = source.longitude; - target.altitude = source.altitude; - target.accuracy = source.accuracy; - target.altitude_accuracy = source.altitude_accuracy; - target.heading = source.heading; - target.speed = source.speed; - cef_time_from_basetime(source.timestamp, target.timestamp); - - switch (source.error_code) { - case content::Geoposition::ERROR_CODE_NONE: - target.error_code = GEOPOSITON_ERROR_NONE; - break; - case content::Geoposition::ERROR_CODE_PERMISSION_DENIED: - target.error_code = GEOPOSITON_ERROR_PERMISSION_DENIED; - break; - case content::Geoposition::ERROR_CODE_POSITION_UNAVAILABLE: - target.error_code = GEOPOSITON_ERROR_POSITION_UNAVAILABLE; - break; - case content::Geoposition::ERROR_CODE_TIMEOUT: - target.error_code = GEOPOSITON_ERROR_TIMEOUT; - break; - } - - CefString(&target.error_message) = source.error_message; -} - -void LocationCallback(CefRefPtr callback, - const content::Geoposition& position) { - if (CefThread::CurrentlyOn(CefThread::UI)) { - CefGeoposition cef_position; - SetPosition(position, cef_position); - callback->OnLocationUpdate(cef_position); - } else { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(LocationCallback, callback, position)); - } -} - -} // namespace - -bool CefGetGeolocation(CefRefPtr callback) { - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return false; - } - - if (!callback.get()) { - NOTREACHED() << "invalid parameter"; - return false; - } - - if (CefThread::CurrentlyOn(CefThread::IO)) { - CefGeolocationClient::InitializeEnvironment(); - content::GeolocationProvider* provider = - content::GeolocationProvider::GetInstance(); - if (provider) { - provider->RequestCallback(base::Bind(LocationCallback, callback)); - return true; - } - return false; - } else { - CefThread::PostTask(CefThread::IO, FROM_HERE, - base::Bind(base::IgnoreResult(CefGetGeolocation), callback)); - return true; - } -} diff --git a/cef1/libcef/http_header_utils.cc b/cef1/libcef/http_header_utils.cc deleted file mode 100644 index 1fb4648a6..000000000 --- a/cef1/libcef/http_header_utils.cc +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/http_header_utils.h" -#include "net/http/http_response_headers.h" -#include "net/http/http_util.h" - -using net::HttpResponseHeaders; - -namespace HttpHeaderUtils { - -std::string GenerateHeaders(const HeaderMap& map) { - std::string headers; - - for (HeaderMap::const_iterator header = map.begin(); - header != map.end(); - ++header) { - const CefString& key = header->first; - const CefString& value = header->second; - - if (!key.empty()) { - // Delimit with "\r\n". - if (!headers.empty()) - headers += "\r\n"; - - headers += std::string(key) + ": " + std::string(value); - } - } - - return headers; -} - -void ParseHeaders(const std::string& header_str, HeaderMap& map) { - // Parse the request header values - std::string headerStr = "HTTP/1.1 200 OK\n"; - headerStr += header_str; - scoped_refptr headers = - new HttpResponseHeaders(net::HttpUtil::AssembleRawHeaders( - headerStr.c_str(), headerStr.length())); - void* iter = NULL; - std::string name, value; - while (headers->EnumerateHeaderLines(&iter, &name, &value)) - map.insert(std::make_pair(name, value)); -} - -} // namespace HttpHeaderUtils diff --git a/cef1/libcef/http_header_utils.h b/cef1/libcef/http_header_utils.h deleted file mode 100644 index ab381cff4..000000000 --- a/cef1/libcef/http_header_utils.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_HTTP_HEADER_UTILS_H_ -#define CEF_LIBCEF_HTTP_HEADER_UTILS_H_ -#pragma once - -#include - -#include "include/cef_request.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebHTTPHeaderVisitor.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" - -namespace HttpHeaderUtils { - -typedef CefRequest::HeaderMap HeaderMap; - -class HeaderVisitor : public WebKit::WebHTTPHeaderVisitor { - public: - explicit HeaderVisitor(HeaderMap* map) : map_(map) {} - - virtual void visitHeader(const WebKit::WebString& name, - const WebKit::WebString& value) { - map_->insert(std::make_pair(string16(name), string16(value))); - } - - private: - HeaderMap* map_; -}; - -std::string GenerateHeaders(const HeaderMap& map); -void ParseHeaders(const std::string& header_str, HeaderMap& map); - -}; // namespace HttpHeaderUtils - -#endif // CEF_LIBCEF_HTTP_HEADER_UTILS_H_ diff --git a/cef1/libcef/nplugin_impl.cc b/cef1/libcef/nplugin_impl.cc deleted file mode 100644 index 454324f7f..000000000 --- a/cef1/libcef/nplugin_impl.cc +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "include/cef_nplugin.h" -#include "libcef/cef_context.h" -#include "libcef/cef_thread.h" - -#include "base/bind.h" -#include "base/strings/string_split.h" -#include "base/utf_string_conversions.h" -#include "webkit/plugins/npapi/plugin_list.h" - -namespace { - -void UIT_RegisterPlugin(CefPluginInfo* plugin_info) { - REQUIRE_UIT(); - - webkit::WebPluginInfo info; - - info.path = base::FilePath(CefString(&plugin_info->unique_name)); - info.name = CefString(&plugin_info->display_name); - info.version = CefString(&plugin_info->version); - info.desc = CefString(&plugin_info->description); - - typedef std::vector VectorType; - VectorType mime_types, file_extensions, descriptions, file_extensions_parts; - base::SplitString(CefString(&plugin_info->mime_types), '|', &mime_types); - base::SplitString(CefString(&plugin_info->file_extensions), '|', - &file_extensions); - base::SplitString(CefString(&plugin_info->type_descriptions), '|', - &descriptions); - - for (size_t i = 0; i < mime_types.size(); ++i) { - webkit::WebPluginMimeType mimeType; - - mimeType.mime_type = mime_types[i]; - - if (file_extensions.size() > i) { - base::SplitString(file_extensions[i], ',', &file_extensions_parts); - VectorType::const_iterator it = file_extensions_parts.begin(); - for (; it != file_extensions_parts.end(); ++it) - mimeType.file_extensions.push_back(*(it)); - file_extensions_parts.clear(); - } - - if (descriptions.size() > i) - mimeType.description = UTF8ToUTF16(descriptions[i]); - - info.mime_types.push_back(mimeType); - } - - webkit::npapi::PluginEntryPoints entry_points; -#if !defined(OS_POSIX) || defined(OS_MACOSX) - entry_points.np_getentrypoints = plugin_info->np_getentrypoints; -#endif - entry_points.np_initialize = plugin_info->np_initialize; - entry_points.np_shutdown = plugin_info->np_shutdown; - - webkit::npapi::PluginList::Singleton()->RegisterInternalPluginWithEntryPoints( - info, true, entry_points); - - delete plugin_info; -} - -} // namespace - -bool CefRegisterPlugin(const CefPluginInfo& plugin_info) { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return false; - } - - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(UIT_RegisterPlugin, new CefPluginInfo(plugin_info))); - - return true; -} diff --git a/cef1/libcef/origin_whitelist_impl.cc b/cef1/libcef/origin_whitelist_impl.cc deleted file mode 100644 index 93db1b53a..000000000 --- a/cef1/libcef/origin_whitelist_impl.cc +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "include/cef_origin_whitelist.h" -#include "libcef/cef_context.h" -#include "libcef/cef_thread.h" - -#include "base/bind.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityPolicy.h" - -using WebKit::WebSecurityPolicy; -using WebKit::WebString; - -bool CefAddCrossOriginWhitelistEntry(const CefString& source_origin, - const CefString& target_protocol, - const CefString& target_domain, - bool allow_target_subdomains) { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED(); - return false; - } - - std::string source_url = source_origin; - GURL gurl = GURL(source_url); - if (gurl.is_empty() || !gurl.is_valid()) { - NOTREACHED() << "Invalid source_origin URL: " << source_url; - return false; - } - - if (CefThread::CurrentlyOn(CefThread::UI)) { - std::string target_protocol_str = target_protocol; - std::string target_domain_str = target_domain; - WebSecurityPolicy::addOriginAccessWhitelistEntry( - gurl, - WebString::fromUTF8(target_protocol_str), - WebString::fromUTF8(target_domain_str), - allow_target_subdomains); - } else { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(base::IgnoreResult(&CefAddCrossOriginWhitelistEntry), - source_origin, target_protocol, target_domain, - allow_target_subdomains)); - } - - return true; -} - -bool CefRemoveCrossOriginWhitelistEntry(const CefString& source_origin, - const CefString& target_protocol, - const CefString& target_domain, - bool allow_target_subdomains) { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED(); - return false; - } - - std::string source_url = source_origin; - GURL gurl = GURL(source_url); - if (gurl.is_empty() || !gurl.is_valid()) { - NOTREACHED() << "Invalid source_origin URL: " << source_url; - return false; - } - - if (CefThread::CurrentlyOn(CefThread::UI)) { - std::string target_protocol_str = target_protocol; - std::string target_domain_str = target_domain; - WebSecurityPolicy::removeOriginAccessWhitelistEntry( - gurl, - WebString::fromUTF8(target_protocol_str), - WebString::fromUTF8(target_domain_str), - allow_target_subdomains); - } else { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(base::IgnoreResult(&CefRemoveCrossOriginWhitelistEntry), - source_origin, target_protocol, target_domain, - allow_target_subdomains)); - } - - return true; -} - -bool CefClearCrossOriginWhitelist() { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED(); - return false; - } - - if (CefThread::CurrentlyOn(CefThread::UI)) { - WebSecurityPolicy::resetOriginAccessWhitelists(); - } else { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(base::IgnoreResult(&CefClearCrossOriginWhitelist))); - } - - return true; -} diff --git a/cef1/libcef/printing/print_settings.cc b/cef1/libcef/printing/print_settings.cc deleted file mode 100644 index 216b2e287..000000000 --- a/cef1/libcef/printing/print_settings.cc +++ /dev/null @@ -1,266 +0,0 @@ -// Copyright (c) 2006-2008 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 "libcef/printing/print_settings.h" - -#include "base/atomic_sequence_num.h" -#include "base/logging.h" -#include "printing/units.h" - -namespace printing { - -// Global SequenceNumber used for generating unique cookie values. -static base::AtomicSequenceNumber cookie_seq; - -PageMeasurements::PageMeasurements() - : page_type(PT_LETTER), - page_length(0.0f), - page_width(0.0f) { -} - -void PageMeasurements::Clear() { - page_type = PT_LETTER; - page_length = 0.0f; - page_width = 0.0f; -} - -bool PageMeasurements::Equals(const PageMeasurements& rhs) const { - return page_type == rhs.page_type && - page_length == rhs.page_length && - page_width == rhs.page_width; -} - -PrintSettings::PrintSettings() - : min_shrink(1.25), - max_shrink(2.0), - desired_dpi(72), - selection_only(false), - to_file(false), - dpi_(0), - landscape(false) { - ResetRequestedPageMargins(); -} - -void PrintSettings::Clear() { - ranges.clear(); - min_shrink = 1.25; - max_shrink = 2.; - desired_dpi = 72; - selection_only = false; - to_file = false; - printer_name_.clear(); - device_name_.clear(); - page_setup_pixels_.Clear(); - dpi_ = 0; - landscape = false; - page_measurements.Clear(); - ResetRequestedPageMargins(); -} - -void PrintSettings::ResetRequestedPageMargins() { - // Initial requested margins to = 1.0cm = ~2/5 of inch - const int margin_printer_units = - ConvertUnit(1000, kHundrethsMMPerInch, desired_dpi); - // Initial requested header/footer margins to = 0.5cm = ~1/5 of inch - const int header_footer_margins = - ConvertUnit(500, kHundrethsMMPerInch, desired_dpi); - requested_margins.header = header_footer_margins; - requested_margins.footer = header_footer_margins; - requested_margins.left = margin_printer_units; - requested_margins.top = margin_printer_units; - requested_margins.right = margin_printer_units; - requested_margins.bottom = margin_printer_units; -} - -#ifdef WIN32 -void PrintSettings::Init(HDC hdc, - const DEVMODE& dev_mode, - const PageRanges& new_ranges, - const CefString& new_device_name, - bool print_selection_only, - bool print_to_file) { - DCHECK(hdc); - printer_name_ = std::wstring(dev_mode.dmDeviceName); - device_name_ = new_device_name; - ranges = new_ranges; - landscape = dev_mode.dmOrientation == DMORIENT_LANDSCAPE; - selection_only = print_selection_only; - to_file = print_to_file; - - bool is_custom_paper = true; - if (dev_mode.dmFields & DM_PAPERSIZE) { - switch (dev_mode.dmPaperSize) { - case DMPAPER_LETTER: - page_measurements.page_type = PT_LETTER; - is_custom_paper = false; - break; - case DMPAPER_LEGAL: - page_measurements.page_type = PT_LEGAL; - is_custom_paper = false; - break; - case DMPAPER_EXECUTIVE: - page_measurements.page_type = PT_EXECUTIVE; - is_custom_paper = false; - break; - case DMPAPER_A3: - page_measurements.page_type = PT_A3; - is_custom_paper = false; - break; - case DMPAPER_A4: - page_measurements.page_type = PT_A4; - is_custom_paper = false; - break; - default: - // We'll translate it as a custom paper size. - break; - } - } - - dpi_ = GetDeviceCaps(hdc, LOGPIXELSX); - // No printer device is known to advertise different dpi in X and Y axis; even - // the fax device using the 200x100 dpi setting. It's ought to break so many - // applications that it's not even needed to care about. WebKit doesn't - // support different dpi settings in X and Y axis. - DCHECK_EQ(dpi_, GetDeviceCaps(hdc, LOGPIXELSY)); - - DCHECK_EQ(GetDeviceCaps(hdc, SCALINGFACTORX), 0); - DCHECK_EQ(GetDeviceCaps(hdc, SCALINGFACTORY), 0); - - // Initialize page_setup_pixels_. - gfx::Size physical_size_pixels(GetDeviceCaps(hdc, PHYSICALWIDTH), - GetDeviceCaps(hdc, PHYSICALHEIGHT)); - gfx::Rect printable_area_pixels(GetDeviceCaps(hdc, PHYSICALOFFSETX), - GetDeviceCaps(hdc, PHYSICALOFFSETY), - GetDeviceCaps(hdc, HORZRES), - GetDeviceCaps(hdc, VERTRES)); - - if (is_custom_paper) { - page_measurements.page_length = ConvertUnitDouble( - static_cast(physical_size_pixels.height()), - static_cast(dpi_), - static_cast(desired_dpi)); - page_measurements.page_width = ConvertUnitDouble( - static_cast(physical_size_pixels.width()), - static_cast(dpi_), - static_cast(desired_dpi)); - if (landscape) { - double temp = page_measurements.page_length; - page_measurements.page_length = page_measurements.page_width; - page_measurements.page_width = temp; - } - } - SetPrinterPrintableArea(physical_size_pixels, printable_area_pixels); -} -#endif - -void PrintSettings::SetPrinterPrintableArea( - gfx::Size const& physical_size_pixels, - gfx::Rect const& printable_area_pixels) { - - // Hard-code text_height = 0.5cm = ~1/5 of inch - const int text_height = ConvertUnit(500, kHundrethsMMPerInch, dpi_); - - // Start by setting the user configuration - page_setup_pixels_.Init(physical_size_pixels, - printable_area_pixels, - text_height); - - // Now adjust requested margins to the appropriate dpi. - PageMargins margins; - margins.header = ConvertUnit(requested_margins.header, desired_dpi, dpi_); - margins.footer = ConvertUnit(requested_margins.footer, desired_dpi, dpi_); - margins.left = ConvertUnit(requested_margins.left, desired_dpi, dpi_); - margins.top = ConvertUnit(requested_margins.top, desired_dpi, dpi_); - margins.right = ConvertUnit(requested_margins.right, desired_dpi, dpi_); - margins.bottom = ConvertUnit(requested_margins.bottom, desired_dpi, dpi_); - page_setup_pixels_.SetRequestedMargins(margins); -} - -void PrintSettings::RenderParams(PrintParams* params) const { - DCHECK(params); - params->printable_size.SetSize(page_setup_pixels_.content_area().width(), - page_setup_pixels_.content_area().height()); - params->dpi = dpi_; - // Currently hardcoded at 1.25. See PrintSettings' constructor. - params->min_shrink = min_shrink; - // Currently hardcoded at 2.0. See PrintSettings' constructor. - params->max_shrink = max_shrink; - // Currently hardcoded at 72dpi. See PrintSettings' constructor. - params->desired_dpi = desired_dpi; - // Always use an invalid cookie. - params->document_cookie = 0; - params->selection_only = selection_only; - params->to_file = to_file; -} - -bool PrintSettings::Equals(const PrintSettings& rhs) const { - // Do not test the display device name (printer_name_) for equality since it - // may sometimes be chopped off at 30 chars. As long as device_name is the - // same, that's fine. - return ranges == rhs.ranges && - min_shrink == rhs.min_shrink && - max_shrink == rhs.max_shrink && - desired_dpi == rhs.desired_dpi && - device_name_ == rhs.device_name_ && - page_setup_pixels_.Equals(rhs.page_setup_pixels_) && - dpi_ == rhs.dpi_ && - landscape == rhs.landscape && - page_measurements.Equals(rhs.page_measurements) && - requested_margins.Equals(rhs.requested_margins); -} - -int PrintSettings::NewCookie() { - // A cookie of 0 is used to mark a document as unassigned, count from 1. - return cookie_seq.GetNext() + 1; -} - -void PrintSettings::UpdatePrintOptions(cef_print_options_t& print_options) { - print_options.page_orientation = (landscape) ? LANDSCAPE : PORTRAIT; - print_options.paper_metrics.paper_type = page_measurements.page_type; - - if (page_measurements.page_type == PT_CUSTOM) { - print_options.paper_metrics.length = ConvertUnitDouble( - page_measurements.page_length, desired_dpi, 1); - print_options.paper_metrics.width = ConvertUnitDouble( - page_measurements.page_width, desired_dpi, 1); - } - print_options.paper_margins.left = ConvertUnitDouble( - requested_margins.left, desired_dpi, 1); - print_options.paper_margins.top = ConvertUnitDouble( - requested_margins.top, desired_dpi, 1); - print_options.paper_margins.right = ConvertUnitDouble( - requested_margins.right, desired_dpi, 1); - print_options.paper_margins.bottom = ConvertUnitDouble( - requested_margins.bottom, desired_dpi, 1); - print_options.paper_margins.header = ConvertUnitDouble( - requested_margins.header, desired_dpi, 1); - print_options.paper_margins.footer = ConvertUnitDouble( - requested_margins.footer, desired_dpi, 1); -} -void PrintSettings::UpdateFromPrintOptions( - const cef_print_options_t& print_options) { - landscape = print_options.page_orientation == LANDSCAPE; - page_measurements.page_type = print_options.paper_metrics.paper_type; - if (page_measurements.page_type == PT_CUSTOM) { - page_measurements.page_length = ConvertUnitDouble( - print_options.paper_metrics.length, 1, desired_dpi); - page_measurements.page_width = ConvertUnitDouble( - print_options.paper_metrics.width, 1, desired_dpi); - } - requested_margins.left = static_cast(ConvertUnitDouble( - print_options.paper_margins.left, 1, desired_dpi)); - requested_margins.top = static_cast(ConvertUnitDouble( - print_options.paper_margins.top, 1, desired_dpi)); - requested_margins.right = static_cast(ConvertUnitDouble( - print_options.paper_margins.right, 1, desired_dpi)); - requested_margins.bottom = static_cast(ConvertUnitDouble( - print_options.paper_margins.bottom, 1, desired_dpi)); - requested_margins.header = static_cast(ConvertUnitDouble( - print_options.paper_margins.header, 1, desired_dpi)); - requested_margins.footer = static_cast(ConvertUnitDouble( - print_options.paper_margins.footer, 1, desired_dpi)); -} - -} // namespace printing - diff --git a/cef1/libcef/printing/print_settings.h b/cef1/libcef/printing/print_settings.h deleted file mode 100644 index d1f2335ac..000000000 --- a/cef1/libcef/printing/print_settings.h +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright (c) 2006-2008 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. - -#ifndef CEF_LIBCEF_PRINTING_PRINT_SETTINGS_H_ -#define CEF_LIBCEF_PRINTING_PRINT_SETTINGS_H_ -#pragma once - -#include "include/internal/cef_types.h" - -#include "printing/page_range.h" -#include "printing/page_setup.h" -#include "ui/gfx/rect.h" - -typedef struct HDC__* HDC; -typedef struct _devicemodeW DEVMODE; - -namespace printing { - -// Parameters for a render request. -struct PrintParams { - // In pixels according to dpi_x and dpi_y. - gfx::Size printable_size; - - // Specifies dots per inch. - double dpi; - - // Minimum shrink factor. See PrintSettings::min_shrink for more information. - double min_shrink; - - // Maximum shrink factor. See PrintSettings::max_shrink for more information. - double max_shrink; - - // Desired apparent dpi on paper. - int desired_dpi; - - // Cookie for the document to ensure correctness. - int document_cookie; - - // Indicates if the user only wants to print the current selection. - bool selection_only; - - // Indicates if the user wants to print to file. - bool to_file; - - // Warning: do not compare document_cookie. - bool Equals(const PrintParams& rhs) const { - return printable_size == rhs.printable_size && - dpi == rhs.dpi && - min_shrink == rhs.min_shrink && - max_shrink == rhs.max_shrink && - desired_dpi == rhs.desired_dpi && - selection_only == rhs.selection_only && - to_file == rhs.to_file; - } -}; - -// Page measurements information. -class PageMeasurements { - public: - PageMeasurements(); - void Clear(); - - // Equality operator. - bool Equals(const PageMeasurements& rhs) const; - - enum cef_paper_type_t page_type; - // Page length and width represented in inches. - // These should be filled in if page_type is PT_CUSTOM. - double page_length; - double page_width; -}; - -// OS-independent print settings. -class PrintSettings { - public: - PrintSettings(); - - // Reinitialize the settings to the default values. - void Clear(); - -#ifdef WIN32 - // Reads the settings from the selected device context. Calculates derived - // values like printable_area_. - void Init(HDC hdc, - const DEVMODE& dev_mode, - const PageRanges& new_ranges, - const CefString& new_device_name, - bool selection_only, - bool to_file); -#endif - - // Set printer printable area in pixels. - void SetPrinterPrintableArea(gfx::Size const& physical_size_pixels, - gfx::Rect const& printable_area_pixels); - - // Initializes the print parameters that needs to be sent to the renderer - // process. - void RenderParams(PrintParams* params) const; - - // Equality operator. - // NOTE: printer_name is NOT tested for equality since it doesn't affect the - // output. - bool Equals(const PrintSettings& rhs) const; - - const CefString& printer_name() const { return printer_name_; } - void set_device_name(const CefString& device_name) { - device_name_ = device_name; - } - const CefString& device_name() const { return device_name_; } - int dpi() const { return dpi_; } - const PageSetup& page_setup_pixels() const { return page_setup_pixels_; } - - void UpdatePrintOptions(cef_print_options_t& print_options); - void UpdateFromPrintOptions(const cef_print_options_t& print_options); - - // Multi-page printing. Each PageRange describes a from-to page combination. - // This permits printing selected pages only. - PageRanges ranges; - - // By imaging to a width a little wider than the available pixels, thin pages - // will be scaled down a little, matching the way they print in IE and Camino. - // This lets them use fewer sheets than they would otherwise, which is - // presumably why other browsers do this. Wide pages will be scaled down more - // than this. - double min_shrink; - - // This number determines how small we are willing to reduce the page content - // in order to accommodate the widest line. If the page would have to be - // reduced smaller to make the widest line fit, we just clip instead (this - // behavior matches MacIE and Mozilla, at least) - double max_shrink; - - // Desired visible dots per inch rendering for output. Printing should be - // scaled to ScreenDpi/dpix*desired_dpi. - int desired_dpi; - - // Indicates if the user only wants to print the current selection. - bool selection_only; - - // Indicates if the user wants to print to file. - bool to_file; - - // Cookie generator. It is used to initialize PrintedDocument with its - // associated PrintSettings, to be sure that each generated PrintedPage is - // correctly associated with its corresponding PrintedDocument. - static int NewCookie(); - - // Requested Page Margins in pixels based on desired_dpi. - // These are in terms of desired_dpi since printer dpi may vary. - PageMargins requested_margins; - - // Is the orientation landscape or portrait. - bool landscape; - - // Page Measurements. - PageMeasurements page_measurements; - - private: - void ResetRequestedPageMargins(); - ////////////////////////////////////////////////////////////////////////////// - // Settings that can't be changed without side-effects. - - // Printer name as shown to the user. - CefString printer_name_; - - // Printer device name as opened by the OS. - CefString device_name_; - - // Page setup in pixel units, dpi adjusted. - PageSetup page_setup_pixels_; - - // Printer's device effective dots per inch in both axis. - int dpi_; -}; - -} // namespace printing - -#endif // CEF_LIBCEF_PRINTING_PRINT_SETTINGS_H_ - diff --git a/cef1/libcef/printing/win_printing_context.cc b/cef1/libcef/printing/win_printing_context.cc deleted file mode 100644 index 571f523dd..000000000 --- a/cef1/libcef/printing/win_printing_context.cc +++ /dev/null @@ -1,606 +0,0 @@ -// Copyright (c) 2006-2008 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 "libcef/printing/win_printing_context.h" - -#include - -#include "base/file_util.h" -#include "base/i18n/time_formatting.h" -#include "base/message_loop.h" -#include "base/time.h" -#include "skia/ext/bitmap_platform_device_win.h" - -#include "printing/units.h" - -using base::Time; - -namespace { - -// Retrieves the content of a GetPrinter call. -void GetPrinterHelper(HANDLE printer, int level, scoped_array* buffer) { - DWORD buf_size = 0; - GetPrinter(printer, level, NULL, 0, &buf_size); - if (buf_size) { - buffer->reset(new uint8[buf_size]); - memset(buffer->get(), 0, buf_size); - if (!GetPrinter(printer, level, buffer->get(), buf_size, &buf_size)) { - buffer->reset(); - } - } -} - -} // namespace - -namespace printing { - -PrintingContext::PrintingContext() - : hdc_(NULL), -#ifndef NDEBUG - page_number_(-1), -#endif - dialog_box_(NULL), - dialog_box_dismissed_(false), - abort_printing_(false), - in_print_job_(false) { -} - -PrintingContext::~PrintingContext() { - ResetSettings(); -} - -PrintingContext::Result PrintingContext::AskUserForSettings( - HWND window, - int max_pages, - bool has_selection) { - DCHECK(window); - DCHECK(!in_print_job_); - dialog_box_dismissed_ = false; - // Show the OS-dependent dialog box. - // If the user press - // - OK, the settings are reset and reinitialized with the new settings. OK is - // returned. - // - Apply then Cancel, the settings are reset and reinitialized with the new - // settings. CANCEL is returned. - // - Cancel, the settings are not changed, the previous setting, if it was - // initialized before, are kept. CANCEL is returned. - // On failure, the settings are reset and FAILED is returned. - PRINTDLGEX dialog_options = { sizeof(PRINTDLGEX) }; - dialog_options.hwndOwner = window; - // Disable options we don't support currently. - // TODO(maruel): Reuse the previously loaded settings! - dialog_options.Flags = PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE | - PD_NOCURRENTPAGE; - if (!has_selection) - dialog_options.Flags |= PD_NOSELECTION; - - PRINTPAGERANGE ranges[32]; - dialog_options.nStartPage = START_PAGE_GENERAL; - if (max_pages) { - // Default initialize to print all the pages. - memset(ranges, 0, sizeof(ranges)); - ranges[0].nFromPage = 1; - ranges[0].nToPage = max_pages; - dialog_options.nPageRanges = 1; - dialog_options.nMaxPageRanges = arraysize(ranges); - dialog_options.nMinPage = 1; - dialog_options.nMaxPage = max_pages; - dialog_options.lpPageRanges = ranges; - } else { - // No need to bother, we don't know how many pages are available. - dialog_options.Flags |= PD_NOPAGENUMS; - } - - // Adjust the default dev mode for the printdlg settings. - DEVMODE dev_mode; - memset(&dev_mode, 0, sizeof(dev_mode)); - dev_mode.dmSpecVersion = DM_SPECVERSION; - dev_mode.dmSize = sizeof(DEVMODE); - AdjustDevMode(dev_mode); - - dialog_options.hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE)); - DEVMODE* locked_dev_mode = - reinterpret_cast(GlobalLock(dialog_options.hDevMode)); - memcpy(locked_dev_mode, &dev_mode, sizeof(DEVMODE)); - GlobalUnlock(dialog_options.hDevMode); - { - if (PrintDlgEx(&dialog_options) != S_OK) { - ResetSettings(); - return FAILED; - } - } - return ParseDialogResultEx(dialog_options); -} - -PrintingContext::Result PrintingContext::UseDefaultSettings() { - DCHECK(!in_print_job_); - - PRINTDLG dialog_options = { sizeof(PRINTDLG) }; - dialog_options.Flags = PD_RETURNDC | PD_RETURNDEFAULT; - if (PrintDlg(&dialog_options) == 0) { - ResetSettings(); - return FAILED; - } - return ParseDialogResult(dialog_options); -} - -void PrintingContext::AdjustDevMode(DEVMODE& dev_mode) { - dev_mode.dmFields |= DM_ORIENTATION; - dev_mode.dmOrientation = - (settings_.landscape) ? DMORIENT_LANDSCAPE : DMORIENT_PORTRAIT; - - dev_mode.dmFields |= DM_PAPERSIZE; - switch (settings_.page_measurements.page_type) { - case PT_LETTER: - dev_mode.dmPaperSize = DMPAPER_LETTER; - break; - case PT_LEGAL: - dev_mode.dmPaperSize = DMPAPER_LEGAL; - break; - case PT_EXECUTIVE: - dev_mode.dmPaperSize = DMPAPER_EXECUTIVE; - break; - case PT_A3: - dev_mode.dmPaperSize = DMPAPER_A3; - break; - case PT_A4: - dev_mode.dmPaperSize = DMPAPER_A4; - break; - case PT_CUSTOM: - { - dev_mode.dmPaperSize = DMPAPER_USER; - dev_mode.dmFields |= DM_PAPERLENGTH | DM_PAPERWIDTH; - DCHECK_GT(settings_.page_measurements.page_length, 0); - DCHECK_GT(settings_.page_measurements.page_width, 0); - // Convert from desired_dpi to tenths of a mm. - dev_mode.dmPaperLength = - static_cast(ConvertUnitDouble( // NOLINT(runtime/int) - abs(settings_.page_measurements.page_length), - 10.0 * settings_.desired_dpi, - static_cast(kHundrethsMMPerInch)) + 0.5); - dev_mode.dmPaperWidth = - static_cast(ConvertUnitDouble( // NOLINT(runtime/int) - abs(settings_.page_measurements.page_width), - 10.0 * settings_.desired_dpi, - static_cast(kHundrethsMMPerInch)) + 0.5); - break; - } - default: - // We shouldn't ever hit this case. - DCHECK(false); - dev_mode.dmPaperSize = DMPAPER_LETTER; - break; - } -} - -PrintingContext::Result PrintingContext::Init() { - DCHECK(!in_print_job_); - TCHAR printername[512]; - DWORD size = sizeof(printername)-1; - if (GetDefaultPrinter(printername, &size)) { - return Init(CefString(printername), false); - } - return FAILED; -} - -PrintingContext::Result PrintingContext::InitWithSettings( - const PrintSettings& settings) { - DCHECK(!in_print_job_); - settings_ = settings; - - return Init(settings_.device_name(), true); -} - -PrintingContext::Result PrintingContext::Init(const CefString& device_name, - bool adjust_dev_mode) { - HANDLE printer; - std::wstring deviceNameStr = device_name; - if (!OpenPrinter(const_cast(deviceNameStr.c_str()), - &printer, - NULL)) - return FAILED; - - Result status = OK; - - if (!GetPrinterSettings(printer, device_name, adjust_dev_mode)) - status = FAILED; - - // Close the printer after retrieving the context. - ClosePrinter(printer); - - if (status != OK) - ResetSettings(); - return status; -} - -void PrintingContext::ResetSettings() { - if (hdc_ != NULL) { - DeleteDC(hdc_); - hdc_ = NULL; - } - settings_.Clear(); - in_print_job_ = false; - -#ifndef NDEBUG - page_number_ = -1; -#endif -} - -PrintingContext::Result PrintingContext::NewDocument( - const CefString& document_name) { - DCHECK(!in_print_job_); - if (!hdc_) - return OnError(); - - // Set the flag used by the AbortPrintJob dialog procedure. - abort_printing_ = false; - - in_print_job_ = true; - - // Register the application's AbortProc function with GDI. - if (SP_ERROR == SetAbortProc(hdc_, &AbortProc)) - return OnError(); - - DOCINFO di = { sizeof(DOCINFO) }; - std::wstring documentNameStr = document_name; - di.lpszDocName = documentNameStr.c_str(); - - wchar_t szFileName[MAX_PATH] = L""; - if (settings_.to_file) { - // Prompt for the file name to use for the printed output. - OPENFILENAME ofn = { sizeof(ofn) }; - - ofn.lpstrFilter = L"PostScript Files (*.ps)\0*.ps\0All Files (*.*)\0*.*\0"; - ofn.lpstrFile = szFileName; - ofn.nMaxFile = MAX_PATH; - ofn.Flags = OFN_EXPLORER | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | - OFN_NOREADONLYRETURN | OFN_ENABLESIZING; - ofn.lpstrDefExt = L"ps"; - - if (GetSaveFileName(&ofn)) - di.lpszOutput = szFileName; - else - return OnError(); - } - - DCHECK_EQ(base::MessageLoop::current()->NestableTasksAllowed(), false); - // Begin a print job by calling the StartDoc function. - // NOTE: StartDoc() starts a message loop. That causes a lot of problems with - // IPC. Make sure recursive task processing is disabled. - if (StartDoc(hdc_, &di) <= 0) - return OnError(); - -#ifndef NDEBUG - page_number_ = 0; -#endif - return OK; -} - -PrintingContext::Result PrintingContext::NewPage() { - if (abort_printing_) - return CANCEL; - DCHECK(in_print_job_); - - // Inform the driver that the application is about to begin sending data. - if (StartPage(hdc_) <= 0) - return OnError(); - -#ifndef NDEBUG - ++page_number_; -#endif - - return OK; -} - -PrintingContext::Result PrintingContext::PageDone() { - if (abort_printing_) - return CANCEL; - DCHECK(in_print_job_); - - if (EndPage(hdc_) <= 0) - return OnError(); - return OK; -} - -PrintingContext::Result PrintingContext::DocumentDone() { - if (abort_printing_) - return CANCEL; - DCHECK(in_print_job_); - - // Inform the driver that document has ended. - if (EndDoc(hdc_) <= 0) - return OnError(); - - ResetSettings(); - return OK; -} - -void PrintingContext::Cancel() { - abort_printing_ = true; - in_print_job_ = false; - if (hdc_) - CancelDC(hdc_); - DismissDialog(); -} - -void PrintingContext::DismissDialog() { - if (dialog_box_) { - DestroyWindow(dialog_box_); - dialog_box_dismissed_ = true; - } -} - -PrintingContext::Result PrintingContext::OnError() { - // This will close hdc_ and clear settings_. - ResetSettings(); - return abort_printing_ ? CANCEL : FAILED; -} - -// static -BOOL PrintingContext::AbortProc(HDC hdc, int nCode) { - if (nCode) { - // TODO(maruel): Need a way to find the right instance to set. Should - // leverage PrintJobManager here? - // abort_printing_ = true; - } - return true; -} - -bool PrintingContext::InitializeSettings(const DEVMODE& dev_mode, - const CefString& new_device_name, - const PRINTPAGERANGE* ranges, - int number_ranges, - bool selection_only, - bool to_file) { - skia::InitializeDC(hdc_); - DCHECK(GetDeviceCaps(hdc_, CLIPCAPS)); - DCHECK(GetDeviceCaps(hdc_, RASTERCAPS) & RC_STRETCHDIB); - DCHECK(GetDeviceCaps(hdc_, RASTERCAPS) & RC_BITMAP64); - // Some printers don't advertise these. - // DCHECK(GetDeviceCaps(hdc_, RASTERCAPS) & RC_SCALING); - // DCHECK(GetDeviceCaps(hdc_, SHADEBLENDCAPS) & SB_CONST_ALPHA); - // DCHECK(GetDeviceCaps(hdc_, SHADEBLENDCAPS) & SB_PIXEL_ALPHA); - - // StretchDIBits() support is needed for printing. - if (!(GetDeviceCaps(hdc_, RASTERCAPS) & RC_STRETCHDIB) || - !(GetDeviceCaps(hdc_, RASTERCAPS) & RC_BITMAP64)) { - NOTREACHED(); - ResetSettings(); - return false; - } - - DCHECK(!in_print_job_); - DCHECK(hdc_); - PageRanges ranges_vector; - if (!selection_only) { - // Convert the PRINTPAGERANGE array to a PrintSettings::PageRanges vector. - ranges_vector.reserve(number_ranges); - for (int i = 0; i < number_ranges; ++i) { - PageRange range; - // Transfer from 1-based to 0-based. - range.from = ranges[i].nFromPage - 1; - range.to = ranges[i].nToPage - 1; - ranges_vector.push_back(range); - } - } - settings_.Init(hdc_, - dev_mode, - ranges_vector, - new_device_name, - selection_only, - to_file); - return true; -} - -bool PrintingContext::GetPrinterSettings(HANDLE printer, - const CefString& device_name, - bool adjust_dev_mode) { - DCHECK(!in_print_job_); - scoped_array buffer; - - // A PRINTER_INFO_9 structure specifying the per-user default printer - // settings. - GetPrinterHelper(printer, 9, &buffer); - if (buffer.get()) { - PRINTER_INFO_9* info_9 = reinterpret_cast(buffer.get()); - if (info_9->pDevMode != NULL) { - if (adjust_dev_mode) - AdjustDevMode(*info_9->pDevMode); - if (!AllocateContext(device_name, info_9->pDevMode)) { - ResetSettings(); - return false; - } - return InitializeSettings(*info_9->pDevMode, device_name, NULL, 0, false, - false); - } - buffer.reset(); - } - - // A PRINTER_INFO_8 structure specifying the global default printer settings. - GetPrinterHelper(printer, 8, &buffer); - if (buffer.get()) { - PRINTER_INFO_8* info_8 = reinterpret_cast(buffer.get()); - if (info_8->pDevMode != NULL) { - if (adjust_dev_mode) - AdjustDevMode(*info_8->pDevMode); - if (!AllocateContext(device_name, info_8->pDevMode)) { - ResetSettings(); - return false; - } - return InitializeSettings(*info_8->pDevMode, device_name, NULL, 0, false, - false); - } - buffer.reset(); - } - - // A PRINTER_INFO_2 structure specifying the driver's default printer - // settings. - GetPrinterHelper(printer, 2, &buffer); - if (buffer.get()) { - PRINTER_INFO_2* info_2 = reinterpret_cast(buffer.get()); - if (info_2->pDevMode != NULL) { - if (adjust_dev_mode) - AdjustDevMode(*info_2->pDevMode); - if (!AllocateContext(device_name, info_2->pDevMode)) { - ResetSettings(); - return false; - } - return InitializeSettings(*info_2->pDevMode, device_name, NULL, 0, false, - false); - } - buffer.reset(); - } - // Failed to retrieve the printer settings. - ResetSettings(); - return false; -} - -bool PrintingContext::AllocateContext(const CefString& printer_name, - const DEVMODE* dev_mode) { - std::wstring printerNameStr = printer_name; - hdc_ = CreateDC(L"WINSPOOL", printerNameStr.c_str(), NULL, dev_mode); - DCHECK(hdc_); - return hdc_ != NULL; -} - -PrintingContext::Result PrintingContext::ParseDialogResultEx( - const PRINTDLGEX& dialog_options) { - // If the user clicked OK or Apply then Cancel, but not only Cancel. - if (dialog_options.dwResultAction != PD_RESULT_CANCEL) { - PageMargins requested_margins = settings_.requested_margins; - // Start fresh except for page margins since that isn't controlled by this - // dialog. - ResetSettings(); - settings_.requested_margins = requested_margins; - - DEVMODE* dev_mode = NULL; - if (dialog_options.hDevMode) { - dev_mode = - reinterpret_cast(GlobalLock(dialog_options.hDevMode)); - DCHECK(dev_mode); - } - - std::wstring device_name; - if (dialog_options.hDevNames) { - DEVNAMES* dev_names = - reinterpret_cast(GlobalLock(dialog_options.hDevNames)); - DCHECK(dev_names); - if (dev_names) { - device_name = - reinterpret_cast( - reinterpret_cast(dev_names) + - dev_names->wDeviceOffset); - GlobalUnlock(dialog_options.hDevNames); - } - } - - bool success = false; - if (dev_mode && !device_name.empty()) { - hdc_ = dialog_options.hDC; - PRINTPAGERANGE* page_ranges = NULL; - DWORD num_page_ranges = 0; - bool print_selection_only = false; - bool print_to_file = false; - if (dialog_options.Flags & PD_PAGENUMS) { - page_ranges = dialog_options.lpPageRanges; - num_page_ranges = dialog_options.nPageRanges; - } - if (dialog_options.Flags & PD_SELECTION) { - print_selection_only = true; - } - if (dialog_options.Flags & PD_PRINTTOFILE) { - print_to_file = true; - } - success = InitializeSettings(*dev_mode, - device_name, - page_ranges, - num_page_ranges, - print_selection_only, - print_to_file); - } - - if (!success && dialog_options.hDC) { - DeleteDC(dialog_options.hDC); - hdc_ = NULL; - } - - if (dev_mode) { - GlobalUnlock(dialog_options.hDevMode); - } - } else { - if (dialog_options.hDC) { - DeleteDC(dialog_options.hDC); - } - } - - if (dialog_options.hDevMode != NULL) - GlobalFree(dialog_options.hDevMode); - if (dialog_options.hDevNames != NULL) - GlobalFree(dialog_options.hDevNames); - - switch (dialog_options.dwResultAction) { - case PD_RESULT_PRINT: - return hdc_ ? OK : FAILED; - case PD_RESULT_APPLY: - return hdc_ ? CANCEL : FAILED; - case PD_RESULT_CANCEL: - return CANCEL; - default: - return FAILED; - } -} - -PrintingContext::Result PrintingContext::ParseDialogResult( - const PRINTDLG& dialog_options) { - // If the user clicked OK or Apply then Cancel, but not only Cancel. - // Start fresh. - ResetSettings(); - - DEVMODE* dev_mode = NULL; - if (dialog_options.hDevMode) { - dev_mode = - reinterpret_cast(GlobalLock(dialog_options.hDevMode)); - DCHECK(dev_mode); - } - - std::wstring device_name; - if (dialog_options.hDevNames) { - DEVNAMES* dev_names = - reinterpret_cast(GlobalLock(dialog_options.hDevNames)); - DCHECK(dev_names); - if (dev_names) { - device_name = - reinterpret_cast( - reinterpret_cast(dev_names) + - dev_names->wDeviceOffset); - GlobalUnlock(dialog_options.hDevNames); - } - } - - bool success = false; - if (dev_mode && !device_name.empty()) { - hdc_ = dialog_options.hDC; - success = InitializeSettings(*dev_mode, device_name, NULL, 0, false, - false); - } - - if (!success && dialog_options.hDC) { - DeleteDC(dialog_options.hDC); - hdc_ = NULL; - } - - if (dev_mode) { - GlobalUnlock(dialog_options.hDevMode); - } - - if (dialog_options.hDevMode != NULL) - GlobalFree(dialog_options.hDevMode); - if (dialog_options.hDevNames != NULL) - GlobalFree(dialog_options.hDevNames); - - return hdc_ ? OK : FAILED; -} - -} // namespace printing - diff --git a/cef1/libcef/printing/win_printing_context.h b/cef1/libcef/printing/win_printing_context.h deleted file mode 100644 index 1326d2f8e..000000000 --- a/cef1/libcef/printing/win_printing_context.h +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright (c) 2006-2008 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. - -#ifndef CEF_LIBCEF_PRINTING_WIN_PRINTING_CONTEXT_H_ -#define CEF_LIBCEF_PRINTING_WIN_PRINTING_CONTEXT_H_ -#pragma once - -#include -#include -#include - -#include "libcef/printing/print_settings.h" -#include "base/basictypes.h" - -namespace printing { - -// Describe the user selected printing context for Windows. This includes the -// OS-dependent UI to ask the user about the print settings. This class directly -// talk to the printer and manages the document and pages breaks. -class PrintingContext { - public: - // Tri-state result for user behavior-dependent functions. - enum Result { - OK, - CANCEL, - FAILED, - }; - - PrintingContext(); - ~PrintingContext(); - - // Asks the user what printer and format should be used to print. Updates the - // context with the select device settings. - Result AskUserForSettings(HWND window, int max_pages, bool has_selection); - - // Selects the user's default printer and format. Updates the context with the - // default device settings. - Result UseDefaultSettings(); - - // Initializes with printer default's settings. - Result Init(); - - // Initializes with predefined settings. - Result InitWithSettings(const PrintSettings& settings); - - // Reinitializes the settings to uninitialized for object reuse. - void ResetSettings(); - - // Does platform specific setup of the printer before the printing. Signal the - // printer that a document is about to be spooled. - // Warning: This function enters a message loop. That may cause side effects - // like IPC message processing! Some printers have side-effects on this call - // like virtual printers that ask the user for the path of the saved document; - // for example a PDF printer. - Result NewDocument(const CefString& document_name); - - // Starts a new page. - Result NewPage(); - - // Closes the printed page. - Result PageDone(); - - // Closes the printing job. After this call the object is ready to start a new - // document. - Result DocumentDone(); - - // Cancels printing. Can be used in a multithreaded context. Takes effect - // immediately. - void Cancel(); - - // Dismiss the Print... dialog box if shown. - void DismissDialog(); - - HDC context() { - return hdc_; - } - - const PrintSettings& settings() const { - return settings_; - } - - private: - // Class that manages the PrintDlgEx() callbacks. This is meant to be a - // temporary object used during the Print... dialog display. - class CallbackHandler; - - // Does bookkeeping when an error occurs. - PrintingContext::Result OnError(); - - // Used in response to the user canceling the printing. - static BOOL CALLBACK AbortProc(HDC hdc, int nCode); - - // Reads the settings from the selected device context. Updates settings_ and - // its margins. - bool InitializeSettings(const DEVMODE& dev_mode, - const CefString& new_device_name, - const PRINTPAGERANGE* ranges, - int number_ranges, - bool selection_only, - bool to_file); - - // Retrieves the printer's default low-level settings. hdc_ is allocated with - // this call. - bool GetPrinterSettings(HANDLE printer, - const CefString& device_name, - bool adjust_dev_mode); - - // Allocates the HDC for a specific DEVMODE. - bool AllocateContext(const CefString& printer_name, - const DEVMODE* dev_mode); - - // Updates printer dev_mode with settings_ - void PrintingContext::AdjustDevMode(DEVMODE& dev_mode); - - // Initializes the hdc_ either with setting_ or with just printer defaults. - Result Init(const CefString& device_name, bool adjust_dev_mode); - - // Parses the result of a PRINTDLGEX result. - Result ParseDialogResultEx(const PRINTDLGEX& dialog_options); - Result ParseDialogResult(const PRINTDLG& dialog_options); - - // The selected printer context. - HDC hdc_; - - // Complete print context settings. - PrintSettings settings_; - -#ifndef NDEBUG - // Current page number in the print job. - int page_number_; -#endif - - // The dialog box for the time it is shown. - volatile HWND dialog_box_; - - // The dialog box has been dismissed. - volatile bool dialog_box_dismissed_; - - // Is a print job being done. - volatile bool in_print_job_; - - // Did the user cancel the print job. - volatile bool abort_printing_; - - DISALLOW_EVIL_CONSTRUCTORS(PrintingContext); -}; - -} // namespace printing - -#endif // CEF_LIBCEF_PRINTING_WIN_PRINTING_CONTEXT_H_ diff --git a/cef1/libcef/request_impl.cc b/cef1/libcef/request_impl.cc deleted file mode 100644 index 010ec4e68..000000000 --- a/cef1/libcef/request_impl.cc +++ /dev/null @@ -1,614 +0,0 @@ -// Copyright (c) 2008-2009 The Chromium Embedded Framework 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 "libcef/request_impl.h" - -#include -#include - -#include "libcef/cef_thread.h" -#include "libcef/http_header_utils.h" - -#include "base/logging.h" -#include "net/base/upload_data.h" -#include "net/base/upload_data_stream.h" -#include "net/base/upload_element_reader.h" -#include "net/base/upload_bytes_element_reader.h" -#include "net/base/upload_file_element_reader.h" -#include "net/http/http_request_headers.h" -#include "net/url_request/url_request.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURLRequest.h" - -using WebKit::WebHTTPBody; -using WebKit::WebString; -using WebKit::WebURL; -using WebKit::WebURLRequest; - -namespace { - -// A subclass of net::UploadBytesElementReader that keeps the associated -// UploadElement alive until the request completes. -class BytesElementReader : public net::UploadBytesElementReader { - public: - explicit BytesElementReader(scoped_ptr element) - : net::UploadBytesElementReader(element->bytes(), - element->bytes_length()), - element_(element.Pass()) { - DCHECK_EQ(net::UploadElement::TYPE_BYTES, element_->type()); - } - - virtual ~BytesElementReader() {} - - private: - scoped_ptr element_; - - DISALLOW_COPY_AND_ASSIGN(BytesElementReader); -}; - -// A subclass of net::UploadFileElementReader that keeps the associated -// UploadElement alive until the request completes. -class FileElementReader : public net::UploadFileElementReader { - public: - explicit FileElementReader(scoped_ptr element) - : net::UploadFileElementReader( - CefThread::GetMessageLoopProxyForThread(CefThread::FILE), - element->file_path(), - element->file_range_offset(), - element->file_range_length(), - element->expected_file_modification_time()), - element_(element.Pass()) { - DCHECK_EQ(net::UploadElement::TYPE_FILE, element_->type()); - } - - virtual ~FileElementReader() {} - - private: - scoped_ptr element_; - - DISALLOW_COPY_AND_ASSIGN(FileElementReader); -}; - -} // namespace - - -CefRefPtr CefRequest::CreateRequest() { - CefRefPtr request(new CefRequestImpl()); - return request; -} - -CefRequestImpl::CefRequestImpl() - : method_("GET"), - flags_(WUR_FLAG_NONE) { -} - -CefString CefRequestImpl::GetURL() { - AutoLock lock_scope(this); - return url_; -} - -void CefRequestImpl::SetURL(const CefString& url) { - AutoLock lock_scope(this); - url_ = url; -} - -CefString CefRequestImpl::GetMethod() { - AutoLock lock_scope(this); - return method_; -} - -void CefRequestImpl::SetMethod(const CefString& method) { - AutoLock lock_scope(this); - method_ = method; -} - -CefRefPtr CefRequestImpl::GetPostData() { - AutoLock lock_scope(this); - return postdata_; -} - -void CefRequestImpl::SetPostData(CefRefPtr postData) { - AutoLock lock_scope(this); - postdata_ = postData; -} - -void CefRequestImpl::GetHeaderMap(HeaderMap& headerMap) { - AutoLock lock_scope(this); - headerMap = headermap_; -} - -void CefRequestImpl::SetHeaderMap(const HeaderMap& headerMap) { - AutoLock lock_scope(this); - headermap_ = headerMap; -} - -void CefRequestImpl::Set(const CefString& url, - const CefString& method, - CefRefPtr postData, - const HeaderMap& headerMap) { - AutoLock lock_scope(this); - url_ = url; - method_ = method; - postdata_ = postData; - headermap_ = headerMap; -} - -void CefRequestImpl::Set(net::URLRequest* request) { - AutoLock lock_scope(this); - - url_ = request->url().spec(); - method_ = request->method(); - - net::HttpRequestHeaders headers = request->extra_request_headers(); - - // URLRequest::SetReferrer ensures that we do not send username and password - // fields in the referrer. - GURL referrer(request->referrer()); - - // Strip Referer from request_info_.extra_headers to prevent, e.g., plugins - // from overriding headers that are controlled using other means. Otherwise a - // plugin could set a referrer although sending the referrer is inhibited. - headers.RemoveHeader(net::HttpRequestHeaders::kReferer); - - // Our consumer should have made sure that this is a safe referrer. See for - // instance WebCore::FrameLoader::HideReferrer. - if (referrer.is_valid()) - headers.SetHeader(net::HttpRequestHeaders::kReferer, referrer.spec()); - - // Transfer request headers - GetHeaderMap(headers, headermap_); - - // Transfer post data, if any - const net::UploadDataStream* data = request->get_upload(); - if (data) { - postdata_ = CefPostData::CreatePostData(); - static_cast(postdata_.get())->Set(*data); - } -} - -void CefRequestImpl::Set(const WebKit::WebURLRequest& request) { - DCHECK(!request.isNull()); - AutoLock lock_scope(this); - - url_ = request.url().spec().utf16(); - method_ = request.httpMethod(); - - const WebHTTPBody& body = request.httpBody(); - if (!body.isNull()) { - postdata_ = new CefPostDataImpl(); - static_cast(postdata_.get())->Set(body); - } else if (postdata_.get()) { - postdata_ = NULL; - } - - headermap_.clear(); - GetHeaderMap(request, headermap_); - - int flags = WUR_FLAG_NONE; - if (request.cachePolicy() == WebURLRequest::ReloadIgnoringCacheData) - flags |= WUR_FLAG_SKIP_CACHE; - if (request.allowStoredCredentials()) - flags |= WUR_FLAG_ALLOW_CACHED_CREDENTIALS; - if (request.allowCookies()) - flags |= WUR_FLAG_ALLOW_COOKIES; - if (request.reportUploadProgress()) - flags |= WUR_FLAG_REPORT_UPLOAD_PROGRESS; - if (request.reportLoadTiming()) - flags |= WUR_FLAG_REPORT_LOAD_TIMING; - if (request.reportRawHeaders()) - flags |= WUR_FLAG_REPORT_RAW_HEADERS; - flags_ = static_cast(flags); - - first_party_for_cookies_ = request.firstPartyForCookies().spec().utf16(); -} - -#define SETBOOLFLAG(obj, flags, method, FLAG) \ - obj.method((flags & (FLAG)) == (FLAG)) - -void CefRequestImpl::Get(WebKit::WebURLRequest& request) { - request.initialize(); - AutoLock lock_scope(this); - - std::string urlStr(url_); - GURL gurl = GURL(urlStr); - request.setURL(WebURL(gurl)); - - std::string method(method_); - request.setHTTPMethod(WebString::fromUTF8(method.c_str())); - request.setTargetType(WebURLRequest::TargetIsMainFrame); - - WebHTTPBody body; - if (postdata_.get()) { - body.initialize(); - static_cast(postdata_.get())->Get(body); - request.setHTTPBody(body); - } - - SetHeaderMap(headermap_, request); - - request.setCachePolicy((flags_ & WUR_FLAG_SKIP_CACHE) ? - WebURLRequest::ReloadIgnoringCacheData : - WebURLRequest::UseProtocolCachePolicy); - - SETBOOLFLAG(request, flags_, setAllowStoredCredentials, - WUR_FLAG_ALLOW_CACHED_CREDENTIALS); - SETBOOLFLAG(request, flags_, setAllowCookies, - WUR_FLAG_ALLOW_COOKIES); - SETBOOLFLAG(request, flags_, setReportUploadProgress, - WUR_FLAG_REPORT_UPLOAD_PROGRESS); - SETBOOLFLAG(request, flags_, setReportLoadTiming, - WUR_FLAG_REPORT_LOAD_TIMING); - SETBOOLFLAG(request, flags_, setReportRawHeaders, - WUR_FLAG_REPORT_RAW_HEADERS); - - if (!first_party_for_cookies_.empty()) { - std::string cookiesStr(first_party_for_cookies_); - GURL gurl = GURL(cookiesStr); - request.setFirstPartyForCookies(WebURL(gurl)); - } -} - -CefRequest::RequestFlags CefRequestImpl::GetFlags() { - AutoLock lock_scope(this); - return flags_; -} -void CefRequestImpl::SetFlags(RequestFlags flags) { - AutoLock lock_scope(this); - flags_ = flags; -} - -CefString CefRequestImpl::GetFirstPartyForCookies() { - AutoLock lock_scope(this); - return first_party_for_cookies_; -} -void CefRequestImpl::SetFirstPartyForCookies(const CefString& url) { - AutoLock lock_scope(this); - first_party_for_cookies_ = url; -} - -// static -void CefRequestImpl::GetHeaderMap(const net::HttpRequestHeaders& headers, - HeaderMap& map) { - net::HttpRequestHeaders::Iterator it(headers); - do { - map.insert(std::make_pair(it.name(), it.value())); - } while (it.GetNext()); -} - -// static -void CefRequestImpl::GetHeaderMap(const WebKit::WebURLRequest& request, - HeaderMap& map) { - HttpHeaderUtils::HeaderVisitor visitor(&map); - request.visitHTTPHeaderFields(&visitor); -} - -// static -void CefRequestImpl::SetHeaderMap(const HeaderMap& map, - WebKit::WebURLRequest& request) { - HeaderMap::const_iterator it = map.begin(); - for (; it != map.end(); ++it) - request.setHTTPHeaderField(string16(it->first), string16(it->second)); -} - -CefRefPtr CefPostData::CreatePostData() { - CefRefPtr postdata(new CefPostDataImpl()); - return postdata; -} - -CefPostDataImpl::CefPostDataImpl() { -} - -size_t CefPostDataImpl::GetElementCount() { - AutoLock lock_scope(this); - return elements_.size(); -} - -void CefPostDataImpl::GetElements(ElementVector& elements) { - AutoLock lock_scope(this); - elements = elements_; -} - -bool CefPostDataImpl::RemoveElement(CefRefPtr element) { - AutoLock lock_scope(this); - - ElementVector::iterator it = elements_.begin(); - for (; it != elements_.end(); ++it) { - if (it->get() == element.get()) { - elements_.erase(it); - return true; - } - } - - return false; -} - -bool CefPostDataImpl::AddElement(CefRefPtr element) { - bool found = false; - - AutoLock lock_scope(this); - - // check that the element isn't already in the list before adding - ElementVector::const_iterator it = elements_.begin(); - for (; it != elements_.end(); ++it) { - if (it->get() == element.get()) { - found = true; - break; - } - } - - if (!found) - elements_.push_back(element); - - return !found; -} - -void CefPostDataImpl::RemoveElements() { - AutoLock lock_scope(this); - elements_.clear(); -} - -void CefPostDataImpl::Set(const net::UploadData& data) { - AutoLock lock_scope(this); - - CefRefPtr postelem; - - const ScopedVector& elements = data.elements(); - ScopedVector::const_iterator it = elements.begin(); - for (; it != elements.end(); ++it) { - postelem = CefPostDataElement::CreatePostDataElement(); - static_cast(postelem.get())->Set(**it); - AddElement(postelem); - } -} - -void CefPostDataImpl::Set(const net::UploadDataStream& data_stream) { - AutoLock lock_scope(this); - - CefRefPtr postelem; - - const ScopedVector& elements = - data_stream.element_readers(); - ScopedVector::const_iterator it = elements.begin(); - for (; it != elements.end(); ++it) { - postelem = CefPostDataElement::CreatePostDataElement(); - static_cast(postelem.get())->Set(**it); - AddElement(postelem); - } -} - -void CefPostDataImpl::Get(net::UploadData& data) { - AutoLock lock_scope(this); - - ScopedVector data_elements; - ElementVector::iterator it = elements_.begin(); - for (; it != elements_.end(); ++it) { - net::UploadElement* element = new net::UploadElement(); - static_cast(it->get())->Get(*element); - data_elements.push_back(element); - } - data.swap_elements(&data_elements); -} - -net::UploadDataStream* CefPostDataImpl::Get() { - AutoLock lock_scope(this); - - ScopedVector element_readers; - ElementVector::const_iterator it = elements_.begin(); - for (; it != elements_.end(); ++it) { - element_readers.push_back( - static_cast(it->get())->Get()); - } - - return new net::UploadDataStream(&element_readers, 0); -} - -void CefPostDataImpl::Set(const WebKit::WebHTTPBody& data) { - AutoLock lock_scope(this); - - CefRefPtr postelem; - WebKit::WebHTTPBody::Element element; - size_t size = data.elementCount(); - for (size_t i = 0; i < size; ++i) { - if (data.elementAt(i, element)) { - postelem = CefPostDataElement::CreatePostDataElement(); - static_cast(postelem.get())->Set(element); - AddElement(postelem); - } - } -} - -void CefPostDataImpl::Get(WebKit::WebHTTPBody& data) { - AutoLock lock_scope(this); - - WebKit::WebHTTPBody::Element element; - ElementVector::iterator it = elements_.begin(); - for (; it != elements_.end(); ++it) { - static_cast(it->get())->Get(element); - if (element.type == WebKit::WebHTTPBody::Element::TypeData) { - data.appendData(element.data); - } else if (element.type == WebKit::WebHTTPBody::Element::TypeFile) { - data.appendFile(element.filePath); - } else { - NOTREACHED(); - } - } -} - -CefRefPtr CefPostDataElement::CreatePostDataElement() { - CefRefPtr element(new CefPostDataElementImpl()); - return element; -} - -CefPostDataElementImpl::CefPostDataElementImpl() { - type_ = PDE_TYPE_EMPTY; - memset(&data_, 0, sizeof(data_)); -} - -CefPostDataElementImpl::~CefPostDataElementImpl() { - SetToEmpty(); -} - -void CefPostDataElementImpl::SetToEmpty() { - AutoLock lock_scope(this); - if (type_ == PDE_TYPE_BYTES) - free(data_.bytes.bytes); - else if (type_ == PDE_TYPE_FILE) - cef_string_clear(&data_.filename); - type_ = PDE_TYPE_EMPTY; - memset(&data_, 0, sizeof(data_)); -} - -void CefPostDataElementImpl::SetToFile(const CefString& fileName) { - AutoLock lock_scope(this); - // Clear any data currently in the element - SetToEmpty(); - - // Assign the new data - type_ = PDE_TYPE_FILE; - cef_string_copy(fileName.c_str(), fileName.length(), &data_.filename); -} - -void CefPostDataElementImpl::SetToBytes(size_t size, const void* bytes) { - AutoLock lock_scope(this); - // Clear any data currently in the element - SetToEmpty(); - - // Assign the new data - void* data = malloc(size); - DCHECK(data != NULL); - if (data == NULL) - return; - - memcpy(data, bytes, size); - - type_ = PDE_TYPE_BYTES; - data_.bytes.bytes = data; - data_.bytes.size = size; -} - -CefPostDataElement::Type CefPostDataElementImpl::GetType() { - AutoLock lock_scope(this); - return type_; -} - -CefString CefPostDataElementImpl::GetFile() { - AutoLock lock_scope(this); - DCHECK(type_ == PDE_TYPE_FILE); - CefString filename; - if (type_ == PDE_TYPE_FILE) - filename.FromString(data_.filename.str, data_.filename.length, false); - return filename; -} - -size_t CefPostDataElementImpl::GetBytesCount() { - AutoLock lock_scope(this); - DCHECK(type_ == PDE_TYPE_BYTES); - size_t size = 0; - if (type_ == PDE_TYPE_BYTES) - size = data_.bytes.size; - return size; -} - -size_t CefPostDataElementImpl::GetBytes(size_t size, void* bytes) { - AutoLock lock_scope(this); - DCHECK(type_ == PDE_TYPE_BYTES); - size_t rv = 0; - if (type_ == PDE_TYPE_BYTES) { - rv = (size < data_.bytes.size ? size : data_.bytes.size); - memcpy(bytes, data_.bytes.bytes, rv); - } - return rv; -} - -void CefPostDataElementImpl::Set(const net::UploadElement& element) { - AutoLock lock_scope(this); - - if (element.type() == net::UploadElement::TYPE_BYTES) { - SetToBytes(element.bytes_length(), element.bytes()); - } else if (element.type() == net::UploadElement::TYPE_FILE) { - SetToFile(element.file_path().value()); - } else { - NOTREACHED(); - } -} - -void CefPostDataElementImpl::Set( - const net::UploadElementReader& element_reader) { - AutoLock lock_scope(this); - - const net::UploadBytesElementReader* bytes_reader = - element_reader.AsBytesReader(); - if (bytes_reader) { - SetToBytes(bytes_reader->length(), bytes_reader->bytes()); - return; - } - - const net::UploadFileElementReader* file_reader = - element_reader.AsFileReader(); - if (file_reader) { - SetToFile(file_reader->path().value()); - return; - } - - NOTREACHED(); -} - -void CefPostDataElementImpl::Get(net::UploadElement& element) { - AutoLock lock_scope(this); - - if (type_ == PDE_TYPE_BYTES) { - element.SetToBytes(static_cast(data_.bytes.bytes), data_.bytes.size); - } else if (type_ == PDE_TYPE_FILE) { - base::FilePath path = base::FilePath(CefString(&data_.filename)); - element.SetToFilePath(path); - } else { - NOTREACHED(); - } -} - -net::UploadElementReader* CefPostDataElementImpl::Get() { - AutoLock lock_scope(this); - - if (type_ == PDE_TYPE_BYTES) { - net::UploadElement* element = new net::UploadElement(); - element->SetToBytes(static_cast(data_.bytes.bytes), - data_.bytes.size); - return new BytesElementReader(make_scoped_ptr(element)); - } else if (type_ == PDE_TYPE_FILE) { - net::UploadElement* element = new net::UploadElement(); - base::FilePath path = base::FilePath(CefString(&data_.filename)); - element->SetToFilePath(path); - return new FileElementReader(make_scoped_ptr(element)); - } else { - NOTREACHED(); - return NULL; - } -} - -void CefPostDataElementImpl::Set(const WebKit::WebHTTPBody::Element& element) { - AutoLock lock_scope(this); - - if (element.type == WebKit::WebHTTPBody::Element::TypeData) { - SetToBytes(element.data.size(), - static_cast(element.data.data())); - } else if (element.type == WebKit::WebHTTPBody::Element::TypeFile) { - SetToFile(string16(element.filePath)); - } else { - NOTREACHED(); - } -} - -void CefPostDataElementImpl::Get(WebKit::WebHTTPBody::Element& element) { - AutoLock lock_scope(this); - - if (type_ == PDE_TYPE_BYTES) { - element.type = WebKit::WebHTTPBody::Element::TypeData; - element.data.assign( - static_cast(data_.bytes.bytes), data_.bytes.size); - } else if (type_ == PDE_TYPE_FILE) { - element.type = WebKit::WebHTTPBody::Element::TypeFile; - element.filePath.assign(string16(CefString(&data_.filename))); - } else { - NOTREACHED(); - } -} diff --git a/cef1/libcef/request_impl.h b/cef1/libcef/request_impl.h deleted file mode 100644 index 0fd1514c8..000000000 --- a/cef1/libcef/request_impl.h +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright (c) 2008-2009 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_REQUEST_IMPL_H_ -#define CEF_LIBCEF_REQUEST_IMPL_H_ -#pragma once - -#include "include/cef_request.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebHTTPBody.h" - -namespace net { -class HttpRequestHeaders; -class UploadData; -class UploadDataStream; -class UploadElement; -class UploadElementReader; -class URLRequest; -}; - -namespace WebKit { -class WebURLRequest; -} - -// Implementation of CefRequest -class CefRequestImpl : public CefRequest { - public: - CefRequestImpl(); - ~CefRequestImpl() {} - - virtual CefString GetURL() OVERRIDE; - virtual void SetURL(const CefString& url) OVERRIDE; - virtual CefString GetMethod() OVERRIDE; - virtual void SetMethod(const CefString& method) OVERRIDE; - virtual CefRefPtr GetPostData() OVERRIDE; - virtual void SetPostData(CefRefPtr postData) OVERRIDE; - virtual void GetHeaderMap(HeaderMap& headerMap) OVERRIDE; - virtual void SetHeaderMap(const HeaderMap& headerMap) OVERRIDE; - virtual void Set(const CefString& url, - const CefString& method, - CefRefPtr postData, - const HeaderMap& headerMap) OVERRIDE; - virtual RequestFlags GetFlags() OVERRIDE; - virtual void SetFlags(RequestFlags flags) OVERRIDE; - virtual CefString GetFirstPartyForCookies() OVERRIDE; - virtual void SetFirstPartyForCookies(const CefString& url) OVERRIDE; - - void Set(net::URLRequest* request); - void Set(const WebKit::WebURLRequest& request); - void Get(WebKit::WebURLRequest& request); - - static void GetHeaderMap(const net::HttpRequestHeaders& headers, - HeaderMap& map); - static void GetHeaderMap(const WebKit::WebURLRequest& request, - HeaderMap& map); - static void SetHeaderMap(const HeaderMap& map, - WebKit::WebURLRequest& request); - - protected: - CefString url_; - CefString method_; - CefRefPtr postdata_; - HeaderMap headermap_; - - // The below methods are used by WebURLRequest. - RequestFlags flags_; - CefString first_party_for_cookies_; - - IMPLEMENT_REFCOUNTING(CefRequestImpl); - IMPLEMENT_LOCKING(CefRequestImpl); -}; - -// Implementation of CefPostData -class CefPostDataImpl : public CefPostData { - public: - CefPostDataImpl(); - ~CefPostDataImpl() {} - - virtual size_t GetElementCount() OVERRIDE; - virtual void GetElements(ElementVector& elements) OVERRIDE; - virtual bool RemoveElement(CefRefPtr element) OVERRIDE; - virtual bool AddElement(CefRefPtr element) OVERRIDE; - virtual void RemoveElements(); - - void Set(const net::UploadData& data); - void Set(const net::UploadDataStream& data_stream); - void Get(net::UploadData& data); - net::UploadDataStream* Get(); - void Set(const WebKit::WebHTTPBody& data); - void Get(WebKit::WebHTTPBody& data); - - protected: - ElementVector elements_; - - IMPLEMENT_REFCOUNTING(CefPostDataImpl); - IMPLEMENT_LOCKING(CefPostDataImpl); -}; - -// Implementation of CefPostDataElement -class CefPostDataElementImpl : public CefPostDataElement { - public: - CefPostDataElementImpl(); - ~CefPostDataElementImpl(); - - virtual void SetToEmpty() OVERRIDE; - virtual void SetToFile(const CefString& fileName) OVERRIDE; - virtual void SetToBytes(size_t size, const void* bytes) OVERRIDE; - virtual Type GetType() OVERRIDE; - virtual CefString GetFile() OVERRIDE; - virtual size_t GetBytesCount() OVERRIDE; - virtual size_t GetBytes(size_t size, void* bytes) OVERRIDE; - - void* GetBytes() { return data_.bytes.bytes; } - - void Set(const net::UploadElement& element); - void Set(const net::UploadElementReader& element_reader); - void Get(net::UploadElement& element); - net::UploadElementReader* Get(); - void Set(const WebKit::WebHTTPBody::Element& element); - void Get(WebKit::WebHTTPBody::Element& element); - - protected: - Type type_; - union { - struct { - void* bytes; - size_t size; - } bytes; - cef_string_t filename; - } data_; - - IMPLEMENT_REFCOUNTING(CefPostDataElementImpl); - IMPLEMENT_LOCKING(CefPostDataElementImpl); -}; - -#endif // CEF_LIBCEF_REQUEST_IMPL_H_ diff --git a/cef1/libcef/response_impl.cc b/cef1/libcef/response_impl.cc deleted file mode 100644 index 02aa1b095..000000000 --- a/cef1/libcef/response_impl.cc +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/response_impl.h" -#include "libcef/http_header_utils.h" - -#include "base/logging.h" -#include "base/stringprintf.h" -#include "net/http/http_response_headers.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURLResponse.h" - -CefResponseImpl::CefResponseImpl() - : status_code_(0) { -} - -CefResponseImpl::CefResponseImpl(const WebKit::WebURLResponse &response) { - DCHECK(!response.isNull()); - - WebKit::WebString str; - status_code_ = response.httpStatusCode(); - str = response.httpStatusText(); - status_text_ = CefString(str); - str = response.mimeType(); - mime_type_ = CefString(str); - - HttpHeaderUtils::HeaderVisitor visitor(&header_map_); - response.visitHTTPHeaderFields(&visitor); -} - -int CefResponseImpl::GetStatus() { - AutoLock lock_scope(this); - return status_code_; -} - -void CefResponseImpl::SetStatus(int status) { - AutoLock lock_scope(this); - status_code_ = status; -} - -CefString CefResponseImpl::GetStatusText() { - AutoLock lock_scope(this); - return status_text_; -} - -void CefResponseImpl::SetStatusText(const CefString& statusText) { - AutoLock lock_scope(this); - status_text_ = statusText; -} - -CefString CefResponseImpl::GetMimeType() { - AutoLock lock_scope(this); - return mime_type_; -} - -void CefResponseImpl::SetMimeType(const CefString& mimeType) { - AutoLock lock_scope(this); - mime_type_ = mimeType; -} - -CefString CefResponseImpl::GetHeader(const CefString& name) { - AutoLock lock_scope(this); - - CefString value; - - HeaderMap::const_iterator it = header_map_.find(name); - if (it != header_map_.end()) - value = it->second; - - return value; -} - -void CefResponseImpl::GetHeaderMap(HeaderMap& map) { - AutoLock lock_scope(this); - map = header_map_; -} - -void CefResponseImpl::SetHeaderMap(const HeaderMap& headerMap) { - AutoLock lock_scope(this); - header_map_ = headerMap; -} - -net::HttpResponseHeaders* CefResponseImpl::GetResponseHeaders() { - AutoLock lock_scope(this); - - std::string response; - std::string status_text; - - if (status_text_.empty()) - status_text = (status_code_ == 200)?"OK":"ERROR"; - else - status_text = status_text_; - - base::SStringPrintf(&response, "HTTP/1.1 %d %s", status_code_, - status_text.c_str()); - if (header_map_.size() > 0) { - for (HeaderMap::const_iterator header = header_map_.begin(); - header != header_map_.end(); - ++header) { - const CefString& key = header->first; - const CefString& value = header->second; - - if (!key.empty()) { - // Delimit with "\0" as required by net::HttpResponseHeaders. - std::string key_str(key); - std::string value_str(value); - base::StringAppendF(&response, "%c%s: %s", '\0', key_str.c_str(), - value_str.c_str()); - } - } - } - - return new net::HttpResponseHeaders(response); -} diff --git a/cef1/libcef/response_impl.h b/cef1/libcef/response_impl.h deleted file mode 100644 index e4c7a49de..000000000 --- a/cef1/libcef/response_impl.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_RESPONSE_IMPL_H_ -#define CEF_LIBCEF_RESPONSE_IMPL_H_ -#pragma once - -#include "include/cef_response.h" - -namespace net { -class HttpResponseHeaders; -} -namespace WebKit { -class WebURLResponse; -}; - -// Implementation of CefResponse. -class CefResponseImpl : public CefResponse { - public: - CefResponseImpl(); - explicit CefResponseImpl(const WebKit::WebURLResponse& response); - ~CefResponseImpl() {} - - // CefResponse API - virtual int GetStatus(); - virtual void SetStatus(int status); - virtual CefString GetStatusText(); - virtual void SetStatusText(const CefString& statusText); - virtual CefString GetMimeType(); - virtual void SetMimeType(const CefString& mimeType); - virtual CefString GetHeader(const CefString& name); - virtual void GetHeaderMap(HeaderMap& headerMap); - virtual void SetHeaderMap(const HeaderMap& headerMap); - - net::HttpResponseHeaders* GetResponseHeaders(); - - protected: - int status_code_; - CefString status_text_; - CefString mime_type_; - HeaderMap header_map_; - - IMPLEMENT_REFCOUNTING(CefResponseImpl); - IMPLEMENT_LOCKING(CefResponseImpl); -}; - -#endif // CEF_LIBCEF_RESPONSE_IMPL_H_ diff --git a/cef1/libcef/scheme_impl.cc b/cef1/libcef/scheme_impl.cc deleted file mode 100644 index 751d0aeb7..000000000 --- a/cef1/libcef/scheme_impl.cc +++ /dev/null @@ -1,775 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2009 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 - -#include "include/cef_scheme.h" -#include "libcef/browser_devtools_scheme_handler.h" -#include "libcef/browser_impl.h" -#include "libcef/browser_resource_loader_bridge.h" -#include "libcef/cef_context.h" -#include "libcef/cef_thread.h" -#include "libcef/request_impl.h" -#include "libcef/response_impl.h" - -#include "base/bind.h" -#include "base/lazy_instance.h" -#include "base/logging.h" -#include "base/message_loop.h" -#include "base/string_util.h" -#include "base/synchronization/lock.h" -#include "googleurl/src/url_util.h" -#include "net/base/completion_callback.h" -#include "net/base/load_flags.h" -#include "net/cookies/cookie_monster.h" -#include "net/base/io_buffer.h" -#include "net/base/upload_data.h" -#include "net/http/http_response_headers.h" -#include "net/http/http_util.h" -#include "net/url_request/http_user_agent_settings.h" -#include "net/url_request/url_request.h" -#include "net/url_request/url_request_about_job.h" -#include "net/url_request/url_request_data_job.h" -#include "net/url_request/url_request_error_job.h" -#include "net/url_request/url_request_file_job.h" -#include "net/url_request/url_request_filter.h" -#include "net/url_request/url_request_ftp_job.h" -#include "net/url_request/url_request_http_job.h" -#include "net/url_request/url_request_job.h" -#include "net/url_request/url_request_job_factory_impl.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityPolicy.h" - -using net::URLRequestStatus; -using WebKit::WebSecurityPolicy; -using WebKit::WebString; - -namespace { - -bool IsStandardScheme(const std::string& scheme) { - url_parse::Component scheme_comp(0, scheme.length()); - return url_util::IsStandard(scheme.c_str(), scheme_comp); -} - -// Copied from net/url_request/url_request_job_manager.cc. -struct SchemeToFactory { - const char* scheme; - net::URLRequest::ProtocolFactory* factory; -}; -static const SchemeToFactory kBuiltinFactories[] = { - { "http", net::URLRequestHttpJob::Factory }, - { "https", net::URLRequestHttpJob::Factory }, - { "file", net::URLRequestFileJob::Factory }, - { "ftp", net::URLRequestFtpJob::Factory }, - { "about", net::URLRequestAboutJob::Factory }, - { "data", net::URLRequestDataJob::Factory }, -}; - -bool IsBuiltinScheme(const std::string& scheme) { - for (size_t i = 0; i < arraysize(kBuiltinFactories); ++i) - if (LowerCaseEqualsASCII(scheme, kBuiltinFactories[i].scheme)) - return true; - return false; -} - -net::URLRequestJob* GetBuiltinSchemeRequestJob( - net::URLRequest* request, - net::NetworkDelegate* network_delegate, - const std::string& scheme) { - // See if the request should be handled by a built-in protocol factory. - for (size_t i = 0; i < arraysize(kBuiltinFactories); ++i) { - if (scheme == kBuiltinFactories[i].scheme) { - net::URLRequestJob* job = - (kBuiltinFactories[i].factory)(request, network_delegate, scheme); - DCHECK(job); // The built-in factories are not expected to fail! - return job; - } - } - - return NULL; -} - -bool SetHeaderIfMissing(CefRequest::HeaderMap& headerMap, - const std::string& name, - const std::string& value) { - if (value.empty()) - return false; - - CefRequest::HeaderMap::const_iterator it = headerMap.find(name); - if (it == headerMap.end()) { - headerMap.insert(std::make_pair(name, value)); - return true; - } - - return false; -} - - -// net::URLRequestJob implementation. -class CefUrlRequestJob : public net::URLRequestJob { - public: - CefUrlRequestJob(net::URLRequest* request, - net::NetworkDelegate* network_delegate, - CefRefPtr handler) - : net::URLRequestJob(request, network_delegate), - handler_(handler), - remaining_bytes_(0), - response_cookies_save_index_(0), - ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { - } - - virtual ~CefUrlRequestJob() { - } - - virtual void Start() OVERRIDE { - REQUIRE_IOT(); - - cef_request_ = CefRequest::CreateRequest(); - - // Populate the request data. - static_cast(cef_request_.get())->Set(request_); - - // Add default headers if not already specified. - const net::URLRequestContext* context = request_->context(); - if (context) { - CefRequest::HeaderMap headerMap; - cef_request_->GetHeaderMap(headerMap); - bool changed = false; - - const net::HttpUserAgentSettings* ua_settings = - context->http_user_agent_settings(); - if (ua_settings) { - if (SetHeaderIfMissing(headerMap, - net::HttpRequestHeaders::kAcceptLanguage, - ua_settings->GetAcceptLanguage())) { - changed = true; - } - - if (SetHeaderIfMissing(headerMap, - net::HttpRequestHeaders::kUserAgent, - ua_settings->GetUserAgent(request_->url()))) { - changed = true; - } - } - - if (changed) - cef_request_->SetHeaderMap(headerMap); - } - - AddCookieHeaderAndStart(); - } - - void AddCookieHeaderAndStart() { - // No matter what, we want to report our status as IO pending since we will - // be notifying our consumer asynchronously via OnStartCompleted. - SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); - - // If the request was destroyed, then there is no more work to do. - if (!request_) - return; - - net::CookieStore* cookie_store = - request_->context()->cookie_store(); - if (cookie_store && - !(request_->load_flags() & net::LOAD_DO_NOT_SEND_COOKIES)) { - net::CookieMonster* cookie_monster = cookie_store->GetCookieMonster(); - if (cookie_monster) { - cookie_monster->GetAllCookiesForURLAsync( - request_->url(), - base::Bind(&CefUrlRequestJob::CheckCookiePolicyAndLoad, - weak_factory_.GetWeakPtr())); - } else { - DoLoadCookies(); - } - } else { - DoStartTransaction(); - } - } - - void DoLoadCookies() { - net::CookieOptions options; - options.set_include_httponly(); - request_->context()->cookie_store()->GetCookiesWithOptionsAsync( - request_->url(), options, - base::Bind(&CefUrlRequestJob::OnCookiesLoaded, - weak_factory_.GetWeakPtr())); - } - - void CheckCookiePolicyAndLoad( - const net::CookieList& cookie_list) { - if (CanGetCookies(cookie_list)) - DoLoadCookies(); - else - DoStartTransaction(); - } - - void OnCookiesLoaded( - const std::string& cookie_line) { - if (!cookie_line.empty()) { - CefRequest::HeaderMap headerMap; - cef_request_->GetHeaderMap(headerMap); - headerMap.insert( - std::make_pair(net::HttpRequestHeaders::kCookie, cookie_line)); - cef_request_->SetHeaderMap(headerMap); - } - DoStartTransaction(); - } - - void DoStartTransaction() { - // We may have been canceled while retrieving cookies. - if (GetStatus().is_success()) { - StartTransaction(); - } else { - NotifyCanceled(); - } - } - - void StartTransaction() { - if (!callback_) - callback_ = new Callback(this); - - // Protect against deletion of this object. - base::WeakPtr weak_ptr(weak_factory_.GetWeakPtr()); - - // Handler can decide whether to process the request. - bool rv = handler_->ProcessRequest(cef_request_, callback_.get()); - if (weak_ptr.get() && !rv) { - // Cancel the request. - NotifyCanceled(); - } - } - - virtual void Kill() OVERRIDE { - REQUIRE_IOT(); - - // Notify the handler that the request has been canceled. - handler_->Cancel(); - - if (callback_) { - callback_->Detach(); - callback_ = NULL; - } - - net::URLRequestJob::Kill(); - } - - virtual bool ReadRawData(net::IOBuffer* dest, int dest_size, int *bytes_read) - OVERRIDE { - REQUIRE_IOT(); - - DCHECK_NE(dest_size, 0); - DCHECK(bytes_read); - - if (remaining_bytes_ == 0) { - // No more data to read. - *bytes_read = 0; - return true; - } else if (remaining_bytes_ > 0 && remaining_bytes_ < dest_size) { - // The handler knows the content size beforehand. - dest_size = static_cast(remaining_bytes_); - } - - // Read response data from the handler. - bool rv = handler_->ReadResponse(dest->data(), dest_size, *bytes_read, - callback_.get()); - if (!rv) { - // The handler has indicated completion of the request. - *bytes_read = 0; - return true; - } else if (*bytes_read == 0) { - if (!GetStatus().is_io_pending()) { - // Report our status as IO pending. - SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); - callback_->SetDestination(dest, dest_size); - } - return false; - } else if (*bytes_read > dest_size) { - // Normalize the return value. - *bytes_read = dest_size; - } - - if (remaining_bytes_ > 0) - remaining_bytes_ -= *bytes_read; - - // Continue calling this method. - return true; - } - - virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE { - REQUIRE_IOT(); - - info->headers = GetResponseHeaders(); - } - - virtual bool IsRedirectResponse(GURL* location, int* http_status_code) - OVERRIDE { - REQUIRE_IOT(); - - if (redirect_url_.is_valid()) { - // Redirect to the new URL. - *http_status_code = 303; - location->Swap(&redirect_url_); - return true; - } - - if (response_.get()) { - // Check for HTTP 302 or HTTP 303 redirect. - int status = response_->GetStatus(); - if (status == 302 || status == 303) { - CefResponse::HeaderMap headerMap; - response_->GetHeaderMap(headerMap); - CefRequest::HeaderMap::iterator iter = headerMap.find("Location"); - if (iter != headerMap.end()) { - GURL new_url = GURL(std::string(iter->second)); - *http_status_code = status; - location->Swap(&new_url); - return true; - } - } - } - - return false; - } - - virtual bool GetMimeType(std::string* mime_type) const OVERRIDE { - REQUIRE_IOT(); - - if (response_.get()) - *mime_type = response_->GetMimeType(); - return true; - } - - CefRefPtr handler_; - CefRefPtr response_; - - private: - void SendHeaders() { - REQUIRE_IOT(); - - // We may have been orphaned... - if (!request()) - return; - - response_ = new CefResponseImpl(); - remaining_bytes_ = 0; - - CefString redirectUrl; - - // Get header information from the handler. - handler_->GetResponseHeaders(response_, remaining_bytes_, redirectUrl); - if (!redirectUrl.empty()) { - std::string redirectUrlStr = redirectUrl; - redirect_url_ = GURL(redirectUrlStr); - } - - if (remaining_bytes_ > 0) - set_expected_content_size(remaining_bytes_); - - // Continue processing the request. - SaveCookiesAndNotifyHeadersComplete(); - } - - net::HttpResponseHeaders* GetResponseHeaders() { - DCHECK(response_); - if (!response_headers_.get()) { - CefResponseImpl* responseImpl = - static_cast(response_.get()); - response_headers_ = responseImpl->GetResponseHeaders(); - } - return response_headers_; - } - - void SaveCookiesAndNotifyHeadersComplete() { - if (request_->load_flags() & net::LOAD_DO_NOT_SAVE_COOKIES) { - SetStatus(URLRequestStatus()); // Clear the IO_PENDING status - NotifyHeadersComplete(); - return; - } - - response_cookies_.clear(); - response_cookies_save_index_ = 0; - - FetchResponseCookies(&response_cookies_); - - // Now, loop over the response cookies, and attempt to persist each. - SaveNextCookie(); - } - - void SaveNextCookie() { - if (response_cookies_save_index_ == response_cookies_.size()) { - response_cookies_.clear(); - response_cookies_save_index_ = 0; - SetStatus(URLRequestStatus()); // Clear the IO_PENDING status - NotifyHeadersComplete(); - return; - } - - // No matter what, we want to report our status as IO pending since we will - // be notifying our consumer asynchronously via OnStartCompleted. - SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); - - net::CookieOptions options; - options.set_include_httponly(); - if (CanSetCookie( - response_cookies_[response_cookies_save_index_], &options)) { - request_->context()->cookie_store()->SetCookieWithOptionsAsync( - request_->url(), response_cookies_[response_cookies_save_index_], - options, base::Bind(&CefUrlRequestJob::OnCookieSaved, - weak_factory_.GetWeakPtr())); - return; - } - - CookieHandled(); - } - - void OnCookieSaved(bool cookie_status) { - CookieHandled(); - } - - void CookieHandled() { - response_cookies_save_index_++; - // We may have been canceled within OnSetCookie. - if (GetStatus().is_success()) { - SaveNextCookie(); - } else { - NotifyCanceled(); - } - } - - void FetchResponseCookies( - std::vector* cookies) { - const std::string name = "Set-Cookie"; - std::string value; - - void* iter = NULL; - net::HttpResponseHeaders* headers = GetResponseHeaders(); - while (headers->EnumerateHeader(&iter, name, &value)) { - if (!value.empty()) - cookies->push_back(value); - } - } - - // Client callback for asynchronous response continuation. - class Callback : public CefSchemeHandlerCallback { - public: - explicit Callback(CefUrlRequestJob* job) - : job_(job), - dest_(NULL), - dest_size_() {} - - virtual void HeadersAvailable() OVERRIDE { - if (CefThread::CurrentlyOn(CefThread::IO)) { - // Currently on IO thread. - if (job_ && !job_->has_response_started()) { - // Send header information. - job_->SendHeaders(); - } - } else { - // Execute this method on the IO thread. - CefThread::PostTask(CefThread::IO, FROM_HERE, - base::Bind(&Callback::HeadersAvailable, this)); - } - } - - virtual void BytesAvailable() OVERRIDE { - if (CefThread::CurrentlyOn(CefThread::IO)) { - // Currently on IO thread. - if (job_ && job_->has_response_started() && - job_->GetStatus().is_io_pending()) { - // Read the bytes. They should be available but, if not, wait again. - int bytes_read = 0; - if (job_->ReadRawData(dest_, dest_size_, &bytes_read)) { - if (bytes_read > 0) { - // Clear the IO_PENDING status. - job_->SetStatus(URLRequestStatus()); - - // Notify about the available bytes. - job_->NotifyReadComplete(bytes_read); - - dest_ = NULL; - dest_size_ = 0; - } else { - // All done. - job_->NotifyDone(URLRequestStatus()); - } - } else if (!job_->GetStatus().is_io_pending()) { - // Failed due to an error. - NOTREACHED() << - "ReadRawData returned false without setting IO as pending"; - job_->NotifyDone(URLRequestStatus()); - } - } - } else { - // Execute this method on the IO thread. - CefThread::PostTask(CefThread::IO, FROM_HERE, - base::Bind(&Callback::BytesAvailable, this)); - } - } - - virtual void Cancel() OVERRIDE { - if (CefThread::CurrentlyOn(CefThread::IO)) { - // Currently on IO thread. - if (job_) - job_->Kill(); - } else { - // Execute this method on the IO thread. - CefThread::PostTask(CefThread::IO, FROM_HERE, - base::Bind(&Callback::Cancel, this)); - } - } - - void Detach() { - REQUIRE_IOT(); - job_ = NULL; - } - - void SetDestination(net::IOBuffer* dest, int dest_size) { - dest_ = dest; - dest_size_ = dest_size; - } - - static bool ImplementsThreadSafeReferenceCounting() { return true; } - - private: - CefUrlRequestJob* job_; - - net::IOBuffer* dest_; - int dest_size_; - - IMPLEMENT_REFCOUNTING(Callback); - }; - - GURL redirect_url_; - int64 remaining_bytes_; - CefRefPtr cef_request_; - CefRefPtr callback_; - scoped_refptr response_headers_; - std::vector response_cookies_; - size_t response_cookies_save_index_; - base::WeakPtrFactory weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(CefUrlRequestJob); -}; - - -// Class that manages the CefSchemeHandlerFactory instances. -class CefUrlRequestManager { - protected: - // Class used for creating URLRequestJob instances. The lifespan of this - // object is managed by URLRequestJobFactory. - class ProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { - public: - explicit ProtocolHandler(const std::string& scheme) - : scheme_(scheme) {} - - // From net::URLRequestJobFactory::ProtocolHandler - virtual net::URLRequestJob* MaybeCreateJob( - net::URLRequest* request, - net::NetworkDelegate* network_delegate) const OVERRIDE { - REQUIRE_IOT(); - return CefUrlRequestManager::GetInstance()->GetRequestJob( - request, network_delegate, scheme_); - } - - private: - std::string scheme_; - }; - - public: - CefUrlRequestManager() {} - - // Retrieve the singleton instance. - static CefUrlRequestManager* GetInstance(); - - bool AddFactory(const std::string& scheme, - const std::string& domain, - CefRefPtr factory) { - if (!factory.get()) { - RemoveFactory(scheme, domain); - return true; - } - - REQUIRE_IOT(); - - std::string scheme_lower = StringToLowerASCII(scheme); - std::string domain_lower = StringToLowerASCII(domain); - - // Hostname is only supported for standard schemes. - if (!IsStandardScheme(scheme_lower)) - domain_lower.clear(); - - handler_map_[make_pair(scheme_lower, domain_lower)] = factory; - - net::URLRequestJobFactoryImpl* job_factory = - _Context->request_context()->job_factory_impl(); - - job_factory->SetProtocolHandler(scheme_lower, - new ProtocolHandler(scheme_lower)); - - return true; - } - - void RemoveFactory(const std::string& scheme, - const std::string& domain) { - REQUIRE_IOT(); - - std::string scheme_lower = StringToLowerASCII(scheme); - std::string domain_lower = StringToLowerASCII(domain); - - // Hostname is only supported for standard schemes. - if (!IsStandardScheme(scheme_lower)) - domain_lower.clear(); - - HandlerMap::iterator iter = - handler_map_.find(make_pair(scheme_lower, domain_lower)); - if (iter != handler_map_.end()) - handler_map_.erase(iter); - } - - // Clear all the existing URL handlers and unregister the ProtocolFactory. - void ClearFactories() { - REQUIRE_IOT(); - - net::URLRequestJobFactoryImpl* job_factory = - _Context->request_context()->job_factory_impl(); - - // Unregister with the ProtocolFactory. - std::set schemes; - for (HandlerMap::const_iterator i = handler_map_.begin(); - i != handler_map_.end(); ++i) { - schemes.insert(i->first.first); - } - for (std::set::const_iterator scheme = schemes.begin(); - scheme != schemes.end(); ++scheme) { - job_factory->SetProtocolHandler(*scheme, NULL); - } - - handler_map_.clear(); - } - - private: - // Retrieve the matching handler factory, if any. |scheme| will already be in - // lower case. - CefRefPtr GetHandlerFactory( - net::URLRequest* request, const std::string& scheme) { - CefRefPtr factory; - - if (request->url().is_valid() && IsStandardScheme(scheme)) { - // Check for a match with a domain first. - const std::string& domain = request->url().host(); - - HandlerMap::iterator i = handler_map_.find(make_pair(scheme, domain)); - if (i != handler_map_.end()) - factory = i->second; - } - - if (!factory.get()) { - // Check for a match with no specified domain. - HandlerMap::iterator i = - handler_map_.find(make_pair(scheme, std::string())); - if (i != handler_map_.end()) - factory = i->second; - } - - return factory; - } - - // Create the job that will handle the request. |scheme| will already be in - // lower case. - net::URLRequestJob* GetRequestJob(net::URLRequest* request, - net::NetworkDelegate* network_delegate, - const std::string& scheme) { - net::URLRequestJob* job = NULL; - CefRefPtr factory = - GetHandlerFactory(request, scheme); - if (factory) { - // Call the handler factory to create the handler for the request. - CefRefPtr requestPtr(new CefRequestImpl()); - static_cast(requestPtr.get())->Set(request); - CefRefPtr browser = - BrowserResourceLoaderBridge::GetBrowserForRequest(request); - CefRefPtr handler = - factory->Create(browser.get(), scheme, requestPtr); - if (handler.get()) - job = new CefUrlRequestJob(request, network_delegate, handler); - } - - if (!job && IsBuiltinScheme(scheme)) { - // Give the built-in scheme handler a chance to handle the request. - job = GetBuiltinSchemeRequestJob(request, network_delegate, scheme); - } - -#ifndef NDEBUG - if (job) - DLOG(INFO) << "CefUrlRequestManager hit for " << request->url().spec(); -#endif - - return job; - } - - // Map (scheme, domain) to factories. This map will only be accessed on the IO - // thread. - typedef std::map, - CefRefPtr > HandlerMap; - HandlerMap handler_map_; - - // Set of registered schemes. This set may be accessed from multiple threads. - typedef std::set SchemeSet; - SchemeSet scheme_set_; - base::Lock scheme_set_lock_; - - DISALLOW_EVIL_CONSTRUCTORS(CefUrlRequestManager); -}; - -base::LazyInstance g_manager = LAZY_INSTANCE_INITIALIZER; - -CefUrlRequestManager* CefUrlRequestManager::GetInstance() { - return g_manager.Pointer(); -} - -} // namespace - - -bool CefRegisterSchemeHandlerFactory( - const CefString& scheme_name, - const CefString& domain_name, - CefRefPtr factory) { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return false; - } - - if (CefThread::CurrentlyOn(CefThread::IO)) { - return CefUrlRequestManager::GetInstance()->AddFactory(scheme_name, - domain_name, - factory); - } else { - CefThread::PostTask(CefThread::IO, FROM_HERE, - base::Bind(base::IgnoreResult(&CefRegisterSchemeHandlerFactory), - scheme_name, domain_name, factory)); - return true; - } -} - -bool CefClearSchemeHandlerFactories() { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return false; - } - - if (CefThread::CurrentlyOn(CefThread::IO)) { - CefUrlRequestManager::GetInstance()->ClearFactories(); - - // Re-register the DevTools scheme handler. - RegisterDevToolsSchemeHandler(); - } else { - CefThread::PostTask(CefThread::IO, FROM_HERE, - base::Bind(base::IgnoreResult(&CefClearSchemeHandlerFactories))); - } - - return true; -} diff --git a/cef1/libcef/scheme_registrar_impl.cc b/cef1/libcef/scheme_registrar_impl.cc deleted file mode 100644 index 71b003a99..000000000 --- a/cef1/libcef/scheme_registrar_impl.cc +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "libcef/scheme_registrar_impl.h" - -#include - -#include "base/logging.h" -#include "base/string_util.h" -#include "googleurl/src/url_util.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityPolicy.h" - -CefSchemeRegistrarImpl::CefSchemeRegistrarImpl() - : supported_thread_id_(base::PlatformThread::CurrentId()) { -} - -bool CefSchemeRegistrarImpl::AddCustomScheme( - const CefString& scheme_name, - bool is_standard, - bool is_local, - bool is_display_isolated) { - if (!VerifyContext()) - return false; - - std::string scheme_lower = StringToLowerASCII(scheme_name.ToString()); - if (is_standard) { - url_parse::Component scheme_comp(0, scheme_lower.length()); - if (!url_util::IsStandard(scheme_lower.c_str(), scheme_comp)) - url_util::AddStandardScheme(scheme_lower.c_str()); - } - - SchemeInfo info = {scheme_lower, is_local, is_display_isolated}; - scheme_info_list_.push_back(info); - - return true; -} - -void CefSchemeRegistrarImpl::RegisterWithWebKit() { - if (scheme_info_list_.empty()) - return; - - // Register the custom schemes. - SchemeInfoList::const_iterator it = scheme_info_list_.begin(); - for (; it != scheme_info_list_.end(); ++it) { - const SchemeInfo& info = *it; - if (info.is_local) { - WebKit::WebSecurityPolicy::registerURLSchemeAsLocal( - WebKit::WebString::fromUTF8(info.scheme_name)); - } - if (info.is_display_isolated) { - WebKit::WebSecurityPolicy::registerURLSchemeAsDisplayIsolated( - WebKit::WebString::fromUTF8(info.scheme_name)); - } - } -} - -bool CefSchemeRegistrarImpl::VerifyRefCount() { - return (GetRefCt() == 1); -} - -void CefSchemeRegistrarImpl::Detach() { - DCHECK_EQ(base::PlatformThread::CurrentId(), supported_thread_id_); - url_util::LockStandardSchemes(); - supported_thread_id_ = base::kInvalidThreadId; -} - -bool CefSchemeRegistrarImpl::VerifyContext() { - if (base::PlatformThread::CurrentId() != supported_thread_id_) { - // This object should only be accessed from the thread that created it. - NOTREACHED(); - return false; - } - - return true; -} diff --git a/cef1/libcef/scheme_registrar_impl.h b/cef1/libcef/scheme_registrar_impl.h deleted file mode 100644 index ca14cbbcf..000000000 --- a/cef1/libcef/scheme_registrar_impl.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that can -// be found in the LICENSE file. - -#ifndef CEF_LIBCEF_SCHEME_REGISTRAR_IMPL_H_ -#define CEF_LIBCEF_SCHEME_REGISTRAR_IMPL_H_ -#pragma once - -#include -#include - -#include "include/cef_scheme.h" - -#include "base/threading/platform_thread.h" - -class CefSchemeRegistrarImpl : public CefSchemeRegistrar { - public: - CefSchemeRegistrarImpl(); - - // CefSchemeRegistrar methods. - virtual bool AddCustomScheme(const CefString& scheme_name, - bool is_standard, - bool is_local, - bool is_display_isolated) OVERRIDE; - - void RegisterWithWebKit(); - - // Verify that only a single reference exists to all CefSchemeRegistrarImpl - // objects. - bool VerifyRefCount(); - - void Detach(); - - private: - // Verify that the object is being accessed from the correct thread. - bool VerifyContext(); - - base::PlatformThreadId supported_thread_id_; - - // Custom schemes that need to be registered with WebKit. - struct SchemeInfo { - std::string scheme_name; - bool is_local; - bool is_display_isolated; - }; - typedef std::list SchemeInfoList; - SchemeInfoList scheme_info_list_; - - IMPLEMENT_REFCOUNTING(CefSchemeRegistrarImpl); - DISALLOW_COPY_AND_ASSIGN(CefSchemeRegistrarImpl); -}; - -#endif // CEF_LIBCEF_SCHEME_REGISTRAR_IMPL_H_ diff --git a/cef1/libcef/simple_clipboard_impl.cc b/cef1/libcef/simple_clipboard_impl.cc deleted file mode 100644 index 4c956777d..000000000 --- a/cef1/libcef/simple_clipboard_impl.cc +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) 2011 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 "libcef/simple_clipboard_impl.h" - -#include "base/lazy_instance.h" -#include "base/stl_util.h" -#include "base/string16.h" -#include "googleurl/src/gurl.h" -#include "third_party/skia/include/core/SkBitmap.h" -#include "third_party/zlib/zlib.h" -#include "ui/base/clipboard/clipboard.h" -#include "ui/gfx/codec/png_codec.h" -#include "ui/gfx/size.h" -#include "webkit/glue/webkit_glue.h" - -SimpleClipboardClient::SimpleClipboardClient() { -} - -SimpleClipboardClient::~SimpleClipboardClient() { -} - -ui::Clipboard* SimpleClipboardClient::GetClipboard() { - return ui::Clipboard::GetForCurrentThread(); -} - -uint64 SimpleClipboardClient::GetSequenceNumber(ui::Clipboard::Buffer buffer) { - return GetClipboard()->GetSequenceNumber(buffer); -} - -bool SimpleClipboardClient::IsFormatAvailable( - const ui::Clipboard::FormatType& format, - ui::Clipboard::Buffer buffer) { - return GetClipboard()->IsFormatAvailable(format, buffer); -} - -void SimpleClipboardClient::Clear(ui::Clipboard::Buffer buffer) { - GetClipboard()->Clear(buffer); -} - -void SimpleClipboardClient::ReadAvailableTypes(ui::Clipboard::Buffer buffer, - std::vector* types, - bool* contains_filenames) { - return GetClipboard()->ReadAvailableTypes(buffer, types, - contains_filenames); -} - -void SimpleClipboardClient::ReadText(ui::Clipboard::Buffer buffer, - string16* result) { - GetClipboard()->ReadText(buffer, result); -} - -void SimpleClipboardClient::ReadAsciiText(ui::Clipboard::Buffer buffer, - std::string* result) { - GetClipboard()->ReadAsciiText(buffer, result); -} - -void SimpleClipboardClient::ReadHTML(ui::Clipboard::Buffer buffer, - string16* markup, - GURL* url, uint32* fragment_start, - uint32* fragment_end) { - std::string url_str; - GetClipboard()->ReadHTML(buffer, markup, url ? &url_str : NULL, - fragment_start, fragment_end); - if (url) - *url = GURL(url_str); -} - -void SimpleClipboardClient::ReadRTF(ui::Clipboard::Buffer buffer, - std::string* result) { - GetClipboard()->ReadRTF(buffer, result); -} - -void SimpleClipboardClient::ReadImage(ui::Clipboard::Buffer buffer, - std::string* data) { - SkBitmap bitmap = GetClipboard()->ReadImage(buffer); - if (bitmap.isNull()) - return; - - std::vector png_data; - SkAutoLockPixels lock(bitmap); - if (gfx::PNGCodec::EncodeWithCompressionLevel( - static_cast(bitmap.getPixels()), - gfx::PNGCodec::FORMAT_BGRA, - gfx::Size(bitmap.width(), bitmap.height()), - bitmap.rowBytes(), - false, - std::vector(), - Z_BEST_SPEED, - &png_data)) { - data->assign(reinterpret_cast(vector_as_array(&png_data)), - png_data.size()); - } -} - -void SimpleClipboardClient::ReadCustomData(ui::Clipboard::Buffer buffer, - const string16& type, - string16* data) { - GetClipboard()->ReadCustomData(buffer, type, data); -} - -void SimpleClipboardClient::ReadData(const ui::Clipboard::FormatType& format, - std::string* data) { - GetClipboard()->ReadData(format, data); -} - -webkit_glue::ClipboardClient::WriteContext* -SimpleClipboardClient::CreateWriteContext() { - return NULL; -} diff --git a/cef1/libcef/simple_clipboard_impl.h b/cef1/libcef/simple_clipboard_impl.h deleted file mode 100644 index 3707965ba..000000000 --- a/cef1/libcef/simple_clipboard_impl.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_SIMPLE_CLIPBOARD_IMPL_H_ -#define CEF_LIBCEF_SIMPLE_CLIPBOARD_IMPL_H_ -#pragma once - -#include -#include - -#include "base/compiler_specific.h" -#include "webkit/glue/clipboard_client.h" - -class SimpleClipboardClient : public webkit_glue::ClipboardClient { - public: - SimpleClipboardClient(); - virtual ~SimpleClipboardClient(); - - virtual ui::Clipboard* GetClipboard() OVERRIDE; - virtual uint64 GetSequenceNumber(ui::Clipboard::Buffer buffer) OVERRIDE; - virtual bool IsFormatAvailable(const ui::Clipboard::FormatType& format, - ui::Clipboard::Buffer buffer) OVERRIDE; - virtual void Clear(ui::Clipboard::Buffer buffer) OVERRIDE; - virtual void ReadAvailableTypes(ui::Clipboard::Buffer buffer, - std::vector* types, - bool* contains_filenames) OVERRIDE; - virtual void ReadText(ui::Clipboard::Buffer buffer, - string16* result) OVERRIDE; - virtual void ReadAsciiText(ui::Clipboard::Buffer buffer, - std::string* result) OVERRIDE; - virtual void ReadHTML(ui::Clipboard::Buffer buffer, string16* markup, - GURL* url, uint32* fragment_start, - uint32* fragment_end) OVERRIDE; - virtual void ReadRTF(ui::Clipboard::Buffer buffer, - std::string* result) OVERRIDE; - virtual void ReadImage(ui::Clipboard::Buffer buffer, - std::string* data) OVERRIDE; - virtual void ReadCustomData(ui::Clipboard::Buffer buffer, - const string16& type, - string16* data) OVERRIDE; - virtual void ReadData(const ui::Clipboard::FormatType& format, - std::string* data) OVERRIDE; - virtual WriteContext* CreateWriteContext() OVERRIDE; -}; - -#endif // CEF_LIBCEF_SIMPLE_CLIPBOARD_IMPL_H_ diff --git a/cef1/libcef/sqlite_diagnostics_stub.cc b/cef1/libcef/sqlite_diagnostics_stub.cc deleted file mode 100644 index 453cb5d3b..000000000 --- a/cef1/libcef/sqlite_diagnostics_stub.cc +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 "content/public/common/url_constants.h" - -namespace chrome { - -// Used by ClearOnExitPolicy -const char kHttpScheme[] = "http"; -const char kHttpsScheme[] = "https"; - -} // namespace chrome - -namespace content { - -// Used by ClearOnExitPolicy -const char kStandardSchemeSeparator[] = "://"; - -} // namespace content diff --git a/cef1/libcef/stream_impl.cc b/cef1/libcef/stream_impl.cc deleted file mode 100644 index 2f5afee1a..000000000 --- a/cef1/libcef/stream_impl.cc +++ /dev/null @@ -1,309 +0,0 @@ -// Copyright (c) 2008 The Chromium Embedded Framework 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 "libcef/stream_impl.h" -#include -#include "base/logging.h" - -// Static functions - -CefRefPtr CefStreamReader::CreateForFile( - const CefString& fileName) { - CefRefPtr reader; - std::string fileNameStr = fileName; - FILE* file = fopen(fileNameStr.c_str(), "rb"); - if (file) - reader = new CefFileReader(file, true); - return reader; -} - -CefRefPtr CefStreamReader::CreateForData(void* data, - size_t size) { - DCHECK(data != NULL); - DCHECK(size > 0); // NOLINT(readability/check) - CefRefPtr reader; - if (data && size > 0) - reader = new CefBytesReader(data, size, true); - return reader; -} - -CefRefPtr CefStreamReader::CreateForHandler( - CefRefPtr handler) { - DCHECK(handler.get()); - CefRefPtr reader; - if (handler.get()) - reader = new CefHandlerReader(handler); - return reader; -} - -CefRefPtr CefStreamWriter::CreateForFile( - const CefString& fileName) { - DCHECK(!fileName.empty()); - CefRefPtr writer; - std::string fileNameStr = fileName; - FILE* file = fopen(fileNameStr.c_str(), "wb"); - if (file) - writer = new CefFileWriter(file, true); - return writer; -} - -CefRefPtr CefStreamWriter::CreateForHandler( - CefRefPtr handler) { - DCHECK(handler.get()); - CefRefPtr writer; - if (handler.get()) - writer = new CefHandlerWriter(handler); - return writer; -} - - -// CefFileReader - -CefFileReader::CefFileReader(FILE* file, bool close) - : close_(close), file_(file) { -} - -CefFileReader::~CefFileReader() { - AutoLock lock_scope(this); - if (close_) - fclose(file_); -} - -size_t CefFileReader::Read(void* ptr, size_t size, size_t n) { - AutoLock lock_scope(this); - return fread(ptr, size, n, file_); -} - -int CefFileReader::Seek(int64 offset, int whence) { - AutoLock lock_scope(this); -#if defined(OS_WIN) - return _fseeki64(file_, offset, whence); -#else - return fseek(file_, offset, whence); -#endif -} - -int64 CefFileReader::Tell() { - AutoLock lock_scope(this); -#if defined(OS_WIN) - return _ftelli64(file_); -#else - return ftell(file_); -#endif -} - -int CefFileReader::Eof() { - AutoLock lock_scope(this); - return feof(file_); -} - - -// CefFileWriter - -CefFileWriter::CefFileWriter(FILE* file, bool close) - : file_(file), - close_(close) { -} - -CefFileWriter::~CefFileWriter() { - AutoLock lock_scope(this); - if (close_) - fclose(file_); -} - -size_t CefFileWriter::Write(const void* ptr, size_t size, size_t n) { - AutoLock lock_scope(this); - return (size_t)fwrite(ptr, size, n, file_); -} - -int CefFileWriter::Seek(int64 offset, int whence) { - AutoLock lock_scope(this); - return fseek(file_, offset, whence); -} - -int64 CefFileWriter::Tell() { - AutoLock lock_scope(this); - return ftell(file_); -} - -int CefFileWriter::Flush() { - AutoLock lock_scope(this); - return fflush(file_); -} - - -// CefBytesReader - -CefBytesReader::CefBytesReader(void* data, int64 datasize, bool copy) - : data_(NULL), - datasize_(0), - copy_(false), - offset_(0) { - SetData(data, datasize, copy); -} - -CefBytesReader::~CefBytesReader() { - SetData(NULL, 0, false); -} - -size_t CefBytesReader::Read(void* ptr, size_t size, size_t n) { - AutoLock lock_scope(this); - size_t s = (datasize_ - offset_) / size; - size_t ret = (n < s ? n : s); - memcpy(ptr, (reinterpret_cast(data_)) + offset_, ret * size); - offset_ += ret * size; - return ret; -} - -int CefBytesReader::Seek(int64 offset, int whence) { - int rv = -1L; - AutoLock lock_scope(this); - switch (whence) { - case SEEK_CUR: - if (offset_ + offset > datasize_ || offset_ + offset < 0) - break; - offset_ += offset; - rv = 0; - break; - case SEEK_END: { - int64 offset_abs = abs(offset); - if (offset_abs > datasize_) - break; - offset_ = datasize_ - offset_abs; - rv = 0; - break; - } - case SEEK_SET: - if (offset > datasize_ || offset < 0) - break; - offset_ = offset; - rv = 0; - break; - } - - return rv; -} - -int64 CefBytesReader::Tell() { - AutoLock lock_scope(this); - return offset_; -} - -int CefBytesReader::Eof() { - AutoLock lock_scope(this); - return (offset_ >= datasize_); -} - -void CefBytesReader::SetData(void* data, int64 datasize, bool copy) { - AutoLock lock_scope(this); - if (copy_) - free(data_); - - copy_ = copy; - offset_ = 0; - datasize_ = datasize; - - if (copy) { - data_ = malloc(datasize); - DCHECK(data_ != NULL); - if (data_) - memcpy(data_, data, datasize); - } else { - data_ = data; - } -} - - -// CefBytesWriter - -CefBytesWriter::CefBytesWriter(size_t grow) - : grow_(grow), - datasize_(grow), - offset_(0) { - DCHECK(grow > 0); // NOLINT(readability/check) - data_ = malloc(grow); - DCHECK(data_ != NULL); -} - -CefBytesWriter::~CefBytesWriter() { - AutoLock lock_scope(this); - if (data_) - free(data_); -} - -size_t CefBytesWriter::Write(const void* ptr, size_t size, size_t n) { - AutoLock lock_scope(this); - size_t rv; - if (offset_ + static_cast(size * n) >= datasize_ && - Grow(size * n) == 0) { - rv = 0; - } else { - memcpy(reinterpret_cast(data_) + offset_, ptr, size * n); - offset_ += size * n; - rv = n; - } - - return rv; -} - -int CefBytesWriter::Seek(int64 offset, int whence) { - int rv = -1L; - AutoLock lock_scope(this); - switch (whence) { - case SEEK_CUR: - if (offset_ + offset > datasize_ || offset_ + offset < 0) - break; - offset_ += offset; - rv = 0; - break; - case SEEK_END: { - int64 offset_abs = abs(offset); - if (offset_abs > datasize_) - break; - offset_ = datasize_ - offset_abs; - rv = 0; - break; - } - case SEEK_SET: - if (offset > datasize_ || offset < 0) - break; - offset_ = offset; - rv = 0; - break; - } - - return rv; -} - -int64 CefBytesWriter::Tell() { - AutoLock lock_scope(this); - return offset_; -} - -int CefBytesWriter::Flush() { - return 0; -} - -std::string CefBytesWriter::GetDataString() { - AutoLock lock_scope(this); - std::string str(reinterpret_cast(data_), offset_); - return str; -} - -size_t CefBytesWriter::Grow(size_t size) { - AutoLock lock_scope(this); - size_t rv; - size_t s = (size > grow_ ? size : grow_); - void* tmp = realloc(data_, datasize_ + s); - DCHECK(tmp != NULL); - if (tmp) { - data_ = tmp; - datasize_ += s; - rv = datasize_; - } else { - rv = 0; - } - - return rv; -} diff --git a/cef1/libcef/stream_impl.h b/cef1/libcef/stream_impl.h deleted file mode 100644 index 034baa7d9..000000000 --- a/cef1/libcef/stream_impl.h +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright (c) 2008 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_STREAM_IMPL_H_ -#define CEF_LIBCEF_STREAM_IMPL_H_ -#pragma once - -#include -#include -#include "include/cef_stream.h" - -// Implementation of CefStreamReader for files. -class CefFileReader : public CefStreamReader { - public: - CefFileReader(FILE* file, bool close); - virtual ~CefFileReader(); - - virtual size_t Read(void* ptr, size_t size, size_t n) OVERRIDE; - virtual int Seek(int64 offset, int whence) OVERRIDE; - virtual int64 Tell() OVERRIDE; - virtual int Eof() OVERRIDE; - - protected: - bool close_; - FILE* file_; - - IMPLEMENT_REFCOUNTING(CefFileReader); - IMPLEMENT_LOCKING(CefFileReader); -}; - -// Implementation of CefStreamWriter for files. -class CefFileWriter : public CefStreamWriter { - public: - CefFileWriter(FILE* file, bool close); - virtual ~CefFileWriter(); - - virtual size_t Write(const void* ptr, size_t size, size_t n) OVERRIDE; - virtual int Seek(int64 offset, int whence) OVERRIDE; - virtual int64 Tell() OVERRIDE; - virtual int Flush() OVERRIDE; - - protected: - FILE* file_; - bool close_; - - IMPLEMENT_REFCOUNTING(CefFileWriter); - IMPLEMENT_LOCKING(CefFileWriter); -}; - -// Implementation of CefStreamReader for byte buffers. -class CefBytesReader : public CefStreamReader { - public: - CefBytesReader(void* data, int64 datasize, bool copy); - virtual ~CefBytesReader(); - - virtual size_t Read(void* ptr, size_t size, size_t n) OVERRIDE; - virtual int Seek(int64 offset, int whence) OVERRIDE; - virtual int64 Tell() OVERRIDE; - virtual int Eof() OVERRIDE; - - void SetData(void* data, int64 datasize, bool copy); - - void* GetData() { return data_; } - size_t GetDataSize() { return offset_; } - - protected: - void* data_; - int64 datasize_; - bool copy_; - int64 offset_; - - IMPLEMENT_REFCOUNTING(CefBytesReader); - IMPLEMENT_LOCKING(CefBytesReader); -}; - -// Implementation of CefStreamWriter for byte buffers. -class CefBytesWriter : public CefStreamWriter { - public: - explicit CefBytesWriter(size_t grow); - virtual ~CefBytesWriter(); - - virtual size_t Write(const void* ptr, size_t size, size_t n) OVERRIDE; - virtual int Seek(int64 offset, int whence) OVERRIDE; - virtual int64 Tell() OVERRIDE; - virtual int Flush() OVERRIDE; - - void* GetData() { return data_; } - int64 GetDataSize() { return offset_; } - std::string GetDataString(); - - protected: - size_t Grow(size_t size); - - size_t grow_; - void* data_; - int64 datasize_; - int64 offset_; - - IMPLEMENT_REFCOUNTING(CefBytesWriter); - IMPLEMENT_LOCKING(CefBytesWriter); -}; - -// Implementation of CefStreamReader for handlers. -class CefHandlerReader : public CefStreamReader { - public: - explicit CefHandlerReader(CefRefPtr handler) - : handler_(handler) {} - - virtual size_t Read(void* ptr, size_t size, size_t n) OVERRIDE { - return handler_->Read(ptr, size, n); - } - virtual int Seek(int64 offset, int whence) OVERRIDE { - return handler_->Seek(offset, whence); - } - virtual int64 Tell() OVERRIDE { - return handler_->Tell(); - } - virtual int Eof() OVERRIDE { - return handler_->Eof(); - } - - protected: - CefRefPtr handler_; - - IMPLEMENT_REFCOUNTING(CefHandlerReader); -}; - -// Implementation of CefStreamWriter for handlers. -class CefHandlerWriter : public CefStreamWriter { - public: - explicit CefHandlerWriter(CefRefPtr handler) - : handler_(handler) {} - - virtual size_t Write(const void* ptr, size_t size, size_t n) OVERRIDE { - return handler_->Write(ptr, size, n); - } - virtual int Seek(int64 offset, int whence) OVERRIDE { - return handler_->Seek(offset, whence); - } - virtual int64 Tell() OVERRIDE { - return handler_->Tell(); - } - virtual int Flush() OVERRIDE { - return handler_->Flush(); - } - - protected: - CefRefPtr handler_; - - IMPLEMENT_REFCOUNTING(CefHandlerWriter); -}; - -#endif // CEF_LIBCEF_STREAM_IMPL_H_ diff --git a/cef1/libcef/task_impl.cc b/cef1/libcef/task_impl.cc deleted file mode 100644 index 65a9045d5..000000000 --- a/cef1/libcef/task_impl.cc +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "include/cef_task.h" -#include "libcef/cef_thread.h" -#include "base/bind.h" - -namespace { - -int GetThreadId(CefThreadId threadId) { - switch (threadId) { - case TID_UI: return CefThread::UI; - case TID_IO: return CefThread::IO; - case TID_FILE: return CefThread::FILE; - }; - NOTREACHED(); - return -1; -} - -} // namespace - -bool CefCurrentlyOn(CefThreadId threadId) { - int id = GetThreadId(threadId); - if (id < 0) - return false; - - return CefThread::CurrentlyOn(static_cast(id)); -} - -bool CefPostTask(CefThreadId threadId, CefRefPtr task) { - int id = GetThreadId(threadId); - if (id < 0) - return false; - - return CefThread::PostTask(static_cast(id), FROM_HERE, - base::Bind(&CefTask::Execute, task, threadId)); -} - -bool CefPostDelayedTask(CefThreadId threadId, CefRefPtr task, - int64 delay_ms) { - int id = GetThreadId(threadId); - if (id < 0) - return false; - - return CefThread::PostDelayedTask(static_cast(id), FROM_HERE, - base::Bind(&CefTask::Execute, task, threadId), - base::TimeDelta::FromMilliseconds(delay_ms)); -} diff --git a/cef1/libcef/tracker.h b/cef1/libcef/tracker.h deleted file mode 100644 index eb122f022..000000000 --- a/cef1/libcef/tracker.h +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_TRACKER_H_ -#define CEF_LIBCEF_TRACKER_H_ -#pragma once - -#include "include/cef_base.h" - -// Class extended by objects that must be tracked. After creating a tracked -// object you should add it to the appropriate track manager. -class CefTrackNode { - public: - CefTrackNode() { - track_next_ = NULL; - track_prev_ = NULL; - } - virtual ~CefTrackNode() { - } - - // Returns true if the object is currently being tracked. - bool IsTracked() { return (track_prev_ || track_next_); } - - private: - CefTrackNode* GetTrackPrev() { return track_prev_; } - void SetTrackPrev(CefTrackNode* base) { track_prev_ = base; } - CefTrackNode* GetTrackNext() { return track_next_; } - void SetTrackNext(CefTrackNode* base) { track_next_ = base; } - - // Insert a new object into the tracking list before this object. - void InsertTrackPrev(CefTrackNode* object) { - if (track_prev_) - track_prev_->SetTrackNext(object); - object->SetTrackNext(this); - object->SetTrackPrev(track_prev_); - track_prev_ = object; - } - - // Insert a new object into the tracking list after this object. - void InsertTrackNext(CefTrackNode* object) { - if (track_next_) - track_next_->SetTrackPrev(object); - object->SetTrackPrev(this); - object->SetTrackNext(track_next_); - track_next_ = object; - } - - // Remove this object from the tracking list. - void RemoveTracking() { - if (track_next_) - track_next_->SetTrackPrev(track_prev_); - if (track_prev_) - track_prev_->SetTrackNext(track_next_); - track_next_ = NULL; - track_prev_ = NULL; - } - - private: - CefTrackNode* track_next_; - CefTrackNode* track_prev_; - - friend class CefTrackManager; -}; - -// Class used to manage tracked objects. A single instance of this class -// should be created for each intended usage. Any objects that have not been -// removed by explicit calls to the Destroy() method will be removed when the -// manager object is destroyed. A manager object can be created as either a -// member variable of another class or by using lazy initialization: -// base::LazyInstance g_singleton = LAZY_INSTANCE_INITIALIZER; -class CefTrackManager : public CefBase { - public: - CefTrackManager() : object_count_(0) {} - virtual ~CefTrackManager() { - DeleteAll(); - } - - // Add an object to be tracked by this manager. - void Add(CefTrackNode* object) { - Lock(); - if (!object->IsTracked()) { - tracker_.InsertTrackNext(object); - ++object_count_; - } - Unlock(); - } - - // Delete an object tracked by this manager. - bool Delete(CefTrackNode* object) { - bool rv = false; - Lock(); - if (object->IsTracked()) { - object->RemoveTracking(); - delete object; - --object_count_; - rv = true; - } - Unlock(); - return rv; - } - - // Delete all objects tracked by this manager. - void DeleteAll() { - Lock(); - CefTrackNode* next; - do { - next = tracker_.GetTrackNext(); - if (next) { - next->RemoveTracking(); - delete next; - } - } while (next != NULL); - object_count_ = 0; - Unlock(); - } - - // Returns the number of objects currently being tracked. - int GetCount() { return object_count_; } - - private: - CefTrackNode tracker_; - int object_count_; - - IMPLEMENT_REFCOUNTING(CefTrackManager); - IMPLEMENT_LOCKING(CefTrackManager); -}; - -#endif // CEF_LIBCEF_TRACKER_H_ diff --git a/cef1/libcef/url_impl.cc b/cef1/libcef/url_impl.cc deleted file mode 100644 index 4ba6818ab..000000000 --- a/cef1/libcef/url_impl.cc +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 -#include "include/cef_url.h" -#include "googleurl/src/gurl.h" - -bool CefParseURL(const CefString& url, - CefURLParts& parts) { - GURL gurl(url.ToString()); - if (!gurl.is_valid()) - return false; - - CefString(&parts.spec).FromString(gurl.spec()); - CefString(&parts.scheme).FromString(gurl.scheme()); - CefString(&parts.username).FromString(gurl.username()); - CefString(&parts.password).FromString(gurl.password()); - CefString(&parts.host).FromString(gurl.host()); - CefString(&parts.port).FromString(gurl.port()); - CefString(&parts.path).FromString(gurl.path()); - CefString(&parts.query).FromString(gurl.query()); - - return true; -} - -bool CefCreateURL(const CefURLParts& parts, - CefString& url) { - std::string spec = CefString(parts.spec.str, parts.spec.length, false); - std::string scheme = CefString(parts.scheme.str, parts.scheme.length, false); - std::string username = - CefString(parts.username.str, parts.username.length, false); - std::string password = - CefString(parts.password.str, parts.password.length, false); - std::string host = CefString(parts.host.str, parts.host.length, false); - std::string port = CefString(parts.port.str, parts.port.length, false); - std::string path = CefString(parts.path.str, parts.path.length, false); - std::string query = CefString(parts.query.str, parts.query.length, false); - - GURL gurl; - if (!spec.empty()) { - gurl = GURL(spec); - } else if (!scheme.empty() && !host.empty()) { - std::stringstream ss; - ss << scheme << "://"; - if (!username.empty()) { - ss << username; - if (!password.empty()) - ss << ":" << password; - ss << "@"; - } - ss << host; - if (!port.empty()) - ss << ":" << port; - if (!path.empty()) - ss << path; - if (!query.empty()) - ss << "?" << query; - gurl = GURL(ss.str()); - } - - if (gurl.is_valid()) { - url = gurl.spec(); - return true; - } - - return false; -} diff --git a/cef1/libcef/v8_impl.cc b/cef1/libcef/v8_impl.cc deleted file mode 100644 index 818b83646..000000000 --- a/cef1/libcef/v8_impl.cc +++ /dev/null @@ -1,1739 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 -#include - -#include "base/compiler_specific.h" - -#include "third_party/WebKit/Source/WebCore/config.h" -MSVC_PUSH_WARNING_LEVEL(0); -#include "Frame.h" // NOLINT(build/include) -#include "ScriptController.h" // NOLINT(build/include) -#include "V8Binding.h" // NOLINT(build/include) -#include "V8RecursionScope.h" // NOLINT(build/include) -MSVC_POP_WARNING(); -#undef LOG - -#include "libcef/v8_impl.h" - -#include "libcef/browser_impl.h" -#include "libcef/cef_context.h" -#include "libcef/tracker.h" - -#include "base/bind.h" -#include "base/lazy_instance.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptController.h" - -#define CEF_REQUIRE_UI_THREAD(var) \ - if (!CefThread::CurrentlyOn(CefThread::UI)) { \ - NOTREACHED() << "called on invalid thread"; \ - return var; \ - } - -#define CEF_REQUIRE_VALID_CONTEXT(var) \ - if (!CONTEXT_STATE_VALID()) { \ - NOTREACHED() << "context not valid"; \ - return var; \ - } - -namespace { - -static const char kCefTrackObject[] = "Cef::TrackObject"; -static const char kCefContextState[] = "Cef::ContextState"; - -// Memory manager. - -class CefV8TrackManager { - public: - CefV8TrackManager() { - const CefSettings& settings = _Context->settings(); - if (settings.context_safety_implementation < 0) - context_safety_impl_ = IMPL_DISABLED; - else if (settings.context_safety_implementation == 1) - context_safety_impl_ = IMPL_VALUE; - else - context_safety_impl_ = IMPL_HASH; - } - - scoped_refptr GetContextState( - v8::Handle context) { - if (context_safety_impl_ == IMPL_DISABLED) - return scoped_refptr(); - - if (context.IsEmpty()) { - if (v8::Context::InContext()) - context = v8::Context::GetCurrent(); - else - return scoped_refptr(); - } - - if (context_safety_impl_ == IMPL_HASH) { - int hash = context->Global()->GetIdentityHash(); - ContextMap::const_iterator it = context_map_.find(hash); - if (it != context_map_.end()) - return it->second; - - scoped_refptr state = new CefV8ContextState(); - context_map_.insert(std::make_pair(hash, state)); - - return state; - } else { - if (context_state_key_.IsEmpty()) { - context_state_key_ = - v8::Persistent::New( - v8::Isolate::GetCurrent(), - v8::String::New(kCefContextState)); - } - - v8::Handle object = context->Global(); - v8::Handle value = object->GetHiddenValue(context_state_key_); - if (!value.IsEmpty()) { - return static_cast( - v8::External::Cast(*value)->Value()); - } - - scoped_refptr state = new CefV8ContextState(); - object->SetHiddenValue(context_state_key_, - v8::External::New(state.get())); - - // Reference will be released in ReleaseContext. - state->AddRef(); - - return state; - } - } - - void ReleaseContext(v8::Handle context) { - if (context_safety_impl_ == IMPL_DISABLED) - return; - - if (context_safety_impl_ == IMPL_HASH) { - int hash = context->Global()->GetIdentityHash(); - ContextMap::iterator it = context_map_.find(hash); - if (it != context_map_.end()) { - it->second->Detach(); - context_map_.erase(it); - } - } else { - if (context_state_key_.IsEmpty()) - return; - - v8::Handle object = context->Global(); - v8::Handle value = object->GetHiddenValue(context_state_key_); - if (value.IsEmpty()) - return; - - scoped_refptr state = - static_cast(v8::External::Cast(*value)->Value()); - state->Detach(); - object->DeleteHiddenValue(context_state_key_); - - // Match the AddRef in GetContextState. - state->Release(); - } - } - - void AddGlobalTrackObject(CefTrackNode* object) { - global_manager_.Add(object); - } - - void DeleteGlobalTrackObject(CefTrackNode* object) { - global_manager_.Delete(object); - } - - private: - enum ContextSafetyImpl { - IMPL_DISABLED, - IMPL_HASH, - IMPL_VALUE, - }; - ContextSafetyImpl context_safety_impl_; - - // Used with IMPL_HASH. - typedef std::map > ContextMap; - ContextMap context_map_; - - // Used with IMPL_VALUE. - v8::Persistent context_state_key_; - - // Used for globally tracked objects that are not associated with a particular - // context. - CefTrackManager global_manager_; -}; - -base::LazyInstance g_v8_tracker = LAZY_INSTANCE_INITIALIZER; - -class V8TrackObject : public CefTrackNode { - public: - V8TrackObject() - : external_memory_(0) { - v8::V8::AdjustAmountOfExternalAllocatedMemory( - static_cast(sizeof(V8TrackObject))); - } - ~V8TrackObject() { - v8::V8::AdjustAmountOfExternalAllocatedMemory( - -static_cast(sizeof(V8TrackObject)) - external_memory_); - } - - inline int GetExternallyAllocatedMemory() { - return external_memory_; - } - - int AdjustExternallyAllocatedMemory(int change_in_bytes) { - int new_value = external_memory_ + change_in_bytes; - if (new_value < 0) { - NOTREACHED() << "External memory usage cannot be less than 0 bytes"; - change_in_bytes = -(external_memory_); - new_value = 0; - } - - if (change_in_bytes != 0) - v8::V8::AdjustAmountOfExternalAllocatedMemory(change_in_bytes); - external_memory_ = new_value; - - return new_value; - } - - inline void SetAccessor(CefRefPtr accessor) { - accessor_ = accessor; - } - - inline CefRefPtr GetAccessor() { - return accessor_; - } - - inline void SetHandler(CefRefPtr handler) { - handler_ = handler; - } - - inline CefRefPtr GetHandler() { - return handler_; - } - - inline void SetUserData(CefRefPtr user_data) { - user_data_ = user_data; - } - - inline CefRefPtr GetUserData() { - return user_data_; - } - - // Attach this track object to the specified V8 object. - void AttachTo(v8::Handle object) { - object->SetHiddenValue(v8::String::New(kCefTrackObject), - v8::External::New(this)); - } - - // Retrieve the track object for the specified V8 object. - static V8TrackObject* Unwrap(v8::Handle object) { - v8::Local value = - object->GetHiddenValue(v8::String::New(kCefTrackObject)); - if (!value.IsEmpty()) - return static_cast(v8::External::Cast(*value)->Value()); - - return NULL; - } - - private: - CefRefPtr accessor_; - CefRefPtr handler_; - CefRefPtr user_data_; - int external_memory_; -}; - -class V8TrackString : public CefTrackNode { - public: - explicit V8TrackString(const std::string& str) : string_(str) {} - const char* GetString() { return string_.c_str(); } - - private: - std::string string_; -}; - - -// Manages the life span of a CefTrackNode associated with a persistent Object -// or Function. -class CefV8MakeWeakParam { - public: - CefV8MakeWeakParam(scoped_refptr context_state, - CefTrackNode* object) - : context_state_(context_state), - object_(object) { - DCHECK(object_); - - v8::V8::AdjustAmountOfExternalAllocatedMemory( - static_cast(sizeof(CefV8MakeWeakParam))); - - if (context_state_.get()) { - // |object_| will be deleted when: - // A. The associated context is released, or - // B. TrackDestructor is called for the weak handle. - DCHECK(context_state_->IsValid()); - context_state_->AddTrackObject(object_); - } else { - // |object_| will be deleted when: - // A. The process shuts down, or - // B. TrackDestructor is called for the weak handle. - g_v8_tracker.Pointer()->AddGlobalTrackObject(object_); - } - } - ~CefV8MakeWeakParam() { - if (context_state_.get()) { - // If the associated context is still valid then delete |object_|. - // Otherwise, |object_| will already have been deleted. - if (context_state_->IsValid()) - context_state_->DeleteTrackObject(object_); - } else { - g_v8_tracker.Pointer()->DeleteGlobalTrackObject(object_); - } - - v8::V8::AdjustAmountOfExternalAllocatedMemory( - -static_cast(sizeof(CefV8MakeWeakParam))); - } - - private: - scoped_refptr context_state_; - CefTrackNode* object_; -}; - -// Callback for weak persistent reference destruction. -void TrackDestructor(v8::Isolate* isolate, - v8::Persistent object, - void* parameter) { - if (parameter) - delete static_cast(parameter); - - object.Dispose(isolate); - object.Clear(); -} - - -// Return the browser associated with the specified WebFrame. -CefRefPtr FindBrowserForFrame(WebKit::WebFrame *frame) { - CefContext::AutoLock lock_scope(_Context); - - CefContext::BrowserList *list = _Context->GetBrowserList(); - CefContext::BrowserList::const_iterator i; - i = list->begin(); - for (; i != list->end(); ++i) { - WebKit::WebFrame* thisframe = i->get()->UIT_GetMainWebFrame(); - if (thisframe == frame) - return i->get(); - } - - return NULL; -} - -// Convert a CefString to a V8::String. -v8::Handle GetV8String(const CefString& str) { -#if defined(CEF_STRING_TYPE_UTF16) - // Already a UTF16 string. - return v8::String::New( - reinterpret_cast( - const_cast(str.c_str())), - str.length()); -#elif defined(CEF_STRING_TYPE_UTF8) - // Already a UTF8 string. - return v8::String::New(const_cast(str.c_str()), str.length()); -#else - // Convert the string to UTF8. - std::string tmpStr = str; - return v8::String::New(tmpStr.c_str(), tmpStr.length()); -#endif -} - -#if defined(CEF_STRING_TYPE_UTF16) -void v8impl_string_dtor(char16* str) { - delete [] str; -} -#elif defined(CEF_STRING_TYPE_UTF8) -void v8impl_string_dtor(char* str) { - delete [] str; -} -#endif - -// Convert a v8::String to CefString. -void GetCefString(v8::Handle str, CefString& out) { - if (str.IsEmpty()) - return; - -#if defined(CEF_STRING_TYPE_WIDE) - // Allocate enough space for a worst-case conversion. - int len = str->Utf8Length(); - if (len == 0) - return; - char* buf = new char[len + 1]; - str->WriteUtf8(buf, len + 1); - - // Perform conversion to the wide type. - cef_string_t* retws = out.GetWritableStruct(); - cef_string_utf8_to_wide(buf, len, retws); - - delete [] buf; -#else // !defined(CEF_STRING_TYPE_WIDE) -#if defined(CEF_STRING_TYPE_UTF16) - int len = str->Length(); - if (len == 0) - return; - char16* buf = new char16[len + 1]; - str->Write(reinterpret_cast(buf), 0, len + 1); -#else - // Allocate enough space for a worst-case conversion. - int len = str->Utf8Length(); - if (len == 0) - return; - char* buf = new char[len + 1]; - str->WriteUtf8(buf, len + 1); -#endif - - // Don't perform an extra string copy. - out.clear(); - cef_string_t* retws = out.GetWritableStruct(); - retws->str = buf; - retws->length = len; - retws->dtor = v8impl_string_dtor; -#endif // !defined(CEF_STRING_TYPE_WIDE) -} - -// V8 function callback. -v8::Handle FunctionCallbackImpl(const v8::Arguments& args) { - v8::HandleScope handle_scope; - - CefV8Handler* handler = - static_cast(v8::External::Cast(*args.Data())->Value()); - - CefV8ValueList params; - for (int i = 0; i < args.Length(); i++) - params.push_back(new CefV8ValueImpl(args[i])); - - CefString func_name; - GetCefString(v8::Handle::Cast(args.Callee()->GetName()), - func_name); - CefRefPtr object = new CefV8ValueImpl(args.This()); - CefRefPtr retval; - CefString exception; - - if (handler->Execute(func_name, object, params, retval, exception)) { - if (!exception.empty()) { - return v8::ThrowException(v8::Exception::Error(GetV8String(exception))); - } else { - CefV8ValueImpl* rv = static_cast(retval.get()); - if (rv) - return rv->GetHandle(true); - } - } - - return v8::Undefined(); -} - -// V8 Accessor callbacks -v8::Handle AccessorGetterCallbackImpl(v8::Local property, - const v8::AccessorInfo& info) { - v8::HandleScope handle_scope; - - v8::Handle obj = info.This(); - - CefRefPtr accessorPtr; - - V8TrackObject* tracker = V8TrackObject::Unwrap(obj); - if (tracker) - accessorPtr = tracker->GetAccessor(); - - if (accessorPtr.get()) { - CefRefPtr retval; - CefRefPtr object = new CefV8ValueImpl(obj); - CefString name, exception; - GetCefString(property, name); - if (accessorPtr->Get(name, object, retval, exception)) { - if (!exception.empty()) { - return v8::ThrowException( - v8::Exception::Error(GetV8String(exception))); - } else { - CefV8ValueImpl* rv = static_cast(retval.get()); - if (rv) - return rv->GetHandle(true); - } - } - } - - return v8::Undefined(); -} - -void AccessorSetterCallbackImpl(v8::Local property, - v8::Local value, - const v8::AccessorInfo& info) { - v8::HandleScope handle_scope; - - v8::Handle obj = info.This(); - - CefRefPtr accessorPtr; - - V8TrackObject* tracker = V8TrackObject::Unwrap(obj); - if (tracker) - accessorPtr = tracker->GetAccessor(); - - if (accessorPtr.get()) { - CefRefPtr object = new CefV8ValueImpl(obj); - CefRefPtr cefValue = new CefV8ValueImpl(value); - CefString name, exception; - GetCefString(property, name); - accessorPtr->Set(name, object, cefValue, exception); - if (!exception.empty()) { - v8::ThrowException(v8::Exception::Error(GetV8String(exception))); - return; - } - } -} - -// V8 extension registration. - -class ExtensionWrapper : public v8::Extension { - public: - ExtensionWrapper(const char* extension_name, - const char* javascript_code, - CefV8Handler* handler) - : v8::Extension(extension_name, javascript_code), handler_(handler) { - if (handler) { - // The reference will be released when the process exits. - V8TrackObject* object = new V8TrackObject; - object->SetHandler(handler); - g_v8_tracker.Pointer()->AddGlobalTrackObject(object); - } - } - - virtual v8::Handle GetNativeFunction( - v8::Handle name) { - if (!handler_) - return v8::Handle(); - - return v8::FunctionTemplate::New(FunctionCallbackImpl, - v8::External::New(handler_)); - } - - void UIT_RegisterExtension() { - WebKit::WebScriptController::registerExtension(this); - } - - void AddRef() {} - void Release() {} - - static bool ImplementsThreadSafeReferenceCounting() { return true; } - - private: - CefV8Handler* handler_; -}; - -class CefV8ExceptionImpl : public CefV8Exception { - public: - explicit CefV8ExceptionImpl(v8::Handle message) - : line_number_(0), - start_position_(0), - end_position_(0), - start_column_(0), - end_column_(0) { - if (message.IsEmpty()) - return; - - GetCefString(message->Get(), message_); - GetCefString(message->GetSourceLine(), source_line_); - - if (!message->GetScriptResourceName().IsEmpty()) - GetCefString(message->GetScriptResourceName()->ToString(), script_); - - line_number_ = message->GetLineNumber(); - start_position_ = message->GetStartPosition(); - end_position_ = message->GetEndPosition(); - start_column_ = message->GetStartColumn(); - end_column_ = message->GetEndColumn(); - } - - virtual CefString GetMessage() OVERRIDE { return message_; } - virtual CefString GetSourceLine() OVERRIDE { return source_line_; } - virtual CefString GetScriptResourceName() OVERRIDE { return script_; } - virtual int GetLineNumber() OVERRIDE { return line_number_; } - virtual int GetStartPosition() OVERRIDE { return start_position_; } - virtual int GetEndPosition() OVERRIDE { return end_position_; } - virtual int GetStartColumn() OVERRIDE { return start_column_; } - virtual int GetEndColumn() OVERRIDE { return end_column_; } - - protected: - CefString message_; - CefString source_line_; - CefString script_; - int line_number_; - int start_position_; - int end_position_; - int start_column_; - int end_column_; - - IMPLEMENT_REFCOUNTING(CefV8ExceptionImpl); -}; - -} // namespace - - -// Global functions. - -void CefV8ReleaseContext(v8::Handle context) { - g_v8_tracker.Pointer()->ReleaseContext(context); -} - -bool CefRegisterExtension(const CefString& extension_name, - const CefString& javascript_code, - CefRefPtr handler) { - // Verify that the context is in a valid state. - CEF_REQUIRE_VALID_CONTEXT(false); - - V8TrackString* name = new V8TrackString(extension_name); - g_v8_tracker.Pointer()->AddGlobalTrackObject(name); - V8TrackString* code = new V8TrackString(javascript_code); - g_v8_tracker.Pointer()->AddGlobalTrackObject(code); - - ExtensionWrapper* wrapper = new ExtensionWrapper(name->GetString(), - code->GetString(), handler.get()); - - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&ExtensionWrapper::UIT_RegisterExtension, wrapper)); - return true; -} - - -// CefV8HandleBase - -CefV8HandleBase::CefV8HandleBase(v8::Handle context) { - isolate_ = - context.IsEmpty() ? v8::Isolate::GetCurrent() : context->GetIsolate(); - context_state_ = g_v8_tracker.Pointer()->GetContextState(context); -} - - -// CefV8Context - -// static -CefRefPtr CefV8Context::GetCurrentContext() { - CefRefPtr context; - CEF_REQUIRE_VALID_CONTEXT(context); - CEF_REQUIRE_UI_THREAD(context); - if (v8::Context::InContext()) { - v8::HandleScope handle_scope; - context = new CefV8ContextImpl(v8::Context::GetCurrent()); - } - return context; -} - -// static -CefRefPtr CefV8Context::GetEnteredContext() { - CefRefPtr context; - CEF_REQUIRE_VALID_CONTEXT(context); - CEF_REQUIRE_UI_THREAD(context); - if (v8::Context::InContext()) { - v8::HandleScope handle_scope; - context = new CefV8ContextImpl(v8::Context::GetEntered()); - } - return context; -} - -// static -bool CefV8Context::InContext() { - CEF_REQUIRE_VALID_CONTEXT(false); - CEF_REQUIRE_UI_THREAD(false); - return v8::Context::InContext(); -} - - -// CefV8ContextImpl - -#define CEF_V8_REQUIRE_VALID_RETURN(ret) \ - if (!handle_->IsValid()) { \ - NOTREACHED() << "V8 handle is not valid"; \ - return ret; \ - } - -#define CEF_V8_REQUIRE_OBJECT_RETURN(ret) \ - CEF_V8_REQUIRE_VALID_RETURN(ret); \ - if (!GetHandle(false)->IsObject()) { \ - NOTREACHED() << "V8 value is not an object"; \ - return ret; \ - } - -#define CEF_V8_REQUIRE_ARRAY_RETURN(ret) \ - CEF_V8_REQUIRE_VALID_RETURN(ret); \ - if (!GetHandle(false)->IsArray()) { \ - NOTREACHED() << "V8 value is not an array"; \ - return ret; \ - } - -#define CEF_V8_REQUIRE_FUNCTION_RETURN(ret) \ - CEF_V8_REQUIRE_VALID_RETURN(ret); \ - if (!GetHandle(false)->IsFunction()) { \ - NOTREACHED() << "V8 value is not a function"; \ - return ret; \ - } - -CefV8ContextImpl::CefV8ContextImpl(v8::Handle context) - : handle_(new Handle(context, context)) -#ifndef NDEBUG - , enter_count_(0) -#endif -{ // NOLINT(whitespace/braces) -} - -CefV8ContextImpl::~CefV8ContextImpl() { - DLOG_ASSERT(0 == enter_count_); -} - -bool CefV8ContextImpl::IsValid() { - CEF_REQUIRE_UI_THREAD(false); - return handle_->IsValid(); -} - -CefRefPtr CefV8ContextImpl::GetBrowser() { - CefRefPtr browser; - CEF_REQUIRE_UI_THREAD(browser); - CEF_V8_REQUIRE_VALID_RETURN(browser); - - WebKit::WebFrame* webframe = GetWebFrame(); - if (webframe) - browser = FindBrowserForFrame(webframe->top()); - - return browser; -} - -CefRefPtr CefV8ContextImpl::GetFrame() { - CefRefPtr frame; - CEF_REQUIRE_UI_THREAD(frame); - CEF_V8_REQUIRE_VALID_RETURN(frame); - - WebKit::WebFrame* webframe = GetWebFrame(); - if (webframe) { - CefRefPtr browser; - browser = FindBrowserForFrame(webframe->top()); - if (browser.get()) - frame = browser->UIT_GetCefFrame(webframe); - } - - return frame; -} - -CefRefPtr CefV8ContextImpl::GetGlobal() { - CEF_REQUIRE_UI_THREAD(NULL); - CEF_V8_REQUIRE_VALID_RETURN(NULL); - - v8::HandleScope handle_scope; - v8::Context::Scope context_scope(GetHandle()); - return new CefV8ValueImpl(GetHandle()->Global()); -} - -bool CefV8ContextImpl::Enter() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - - GetHandle()->Enter(); -#ifndef NDEBUG - ++enter_count_; -#endif - return true; -} - -bool CefV8ContextImpl::Exit() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - - DLOG_ASSERT(enter_count_ > 0); - GetHandle()->Exit(); -#ifndef NDEBUG - --enter_count_; -#endif - return true; -} - -bool CefV8ContextImpl::IsSame(CefRefPtr that) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - - v8::HandleScope handle_scope; - - v8::Local thatHandle; - v8::Local thisHandle = GetContext(); - - CefV8ContextImpl* impl = static_cast(that.get()); - if (impl) - thatHandle = impl->GetContext(); - - return (thisHandle == thatHandle); -} - -bool CefV8ContextImpl::Eval(const CefString& code, - CefRefPtr& retval, - CefRefPtr& exception) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - - if (code.empty()) { - NOTREACHED() << "invalid input parameter"; - return false; - } - - v8::HandleScope handle_scope; - v8::Context::Scope context_scope(GetHandle()); - v8::Local obj = GetHandle()->Global(); - - // Retrieve the eval function. - v8::Local val = obj->Get(v8::String::New("eval")); - if (val.IsEmpty() || !val->IsFunction()) - return false; - - v8::Local func = v8::Local::Cast(val); - v8::Handle code_val = GetV8String(code); - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - v8::Local func_rv; - - retval = NULL; - exception = NULL; - - // Execute the function call using the ScriptController so that inspector - // instrumentation works. - RefPtr frame = WebCore::toFrameIfNotDetached(GetHandle()); - DCHECK(frame); - if (frame && - frame->script()->canExecuteScripts(WebCore::AboutToExecuteScript)) { - func_rv = frame->script()->callFunction(func, obj, 1, &code_val); - } - - if (try_catch.HasCaught()) { - exception = new CefV8ExceptionImpl(try_catch.Message()); - return false; - } else if (!func_rv.IsEmpty()) { - retval = new CefV8ValueImpl(func_rv); - } - return true; -} - -v8::Local CefV8ContextImpl::GetContext() { - return v8::Local::New(GetHandle()); -} - -WebKit::WebFrame* CefV8ContextImpl::GetWebFrame() { - v8::HandleScope handle_scope; - v8::Context::Scope context_scope(GetHandle()); - WebKit::WebFrame* frame = WebKit::WebFrame::frameForCurrentContext(); - return frame; -} - - -// CefV8ValueImpl::Handle - -CefV8ValueImpl::Handle::~Handle() { - // Persist the handle (call MakeWeak) if: - // A. The handle has been passed into a V8 function or used as a return value - // from a V8 callback, and - // B. The associated context, if any, is still valid. - if (should_persist_ && (!context_state_.get() || context_state_->IsValid())) { - handle_.MakeWeak( - isolate(), - (tracker_ ? new CefV8MakeWeakParam(context_state_, tracker_) : NULL), - TrackDestructor); - } else { - handle_.Dispose(isolate()); - handle_.Clear(); - - if (tracker_) - delete tracker_; - } - tracker_ = NULL; -} - - -// CefV8Value - -// static -CefRefPtr CefV8Value::CreateUndefined() { - CEF_REQUIRE_VALID_CONTEXT(NULL); - CEF_REQUIRE_UI_THREAD(NULL); - v8::HandleScope handle_scope; - return new CefV8ValueImpl(v8::Undefined()); -} - -// static -CefRefPtr CefV8Value::CreateNull() { - CEF_REQUIRE_VALID_CONTEXT(NULL); - CEF_REQUIRE_UI_THREAD(NULL); - v8::HandleScope handle_scope; - return new CefV8ValueImpl(v8::Null()); -} - -// static -CefRefPtr CefV8Value::CreateBool(bool value) { - CEF_REQUIRE_VALID_CONTEXT(NULL); - CEF_REQUIRE_UI_THREAD(NULL); - v8::HandleScope handle_scope; - return new CefV8ValueImpl(v8::Boolean::New(value)); -} - -// static -CefRefPtr CefV8Value::CreateInt(int32 value) { - CEF_REQUIRE_VALID_CONTEXT(NULL); - CEF_REQUIRE_UI_THREAD(NULL); - v8::HandleScope handle_scope; - return new CefV8ValueImpl(v8::Int32::New(value)); -} - -// static -CefRefPtr CefV8Value::CreateUInt(uint32 value) { - CEF_REQUIRE_VALID_CONTEXT(NULL); - CEF_REQUIRE_UI_THREAD(NULL); - v8::HandleScope handle_scope; - return new CefV8ValueImpl(v8::Int32::NewFromUnsigned(value)); -} - -// static -CefRefPtr CefV8Value::CreateDouble(double value) { - CEF_REQUIRE_VALID_CONTEXT(NULL); - CEF_REQUIRE_UI_THREAD(NULL); - v8::HandleScope handle_scope; - return new CefV8ValueImpl(v8::Number::New(value)); -} - -// static -CefRefPtr CefV8Value::CreateDate(const CefTime& date) { - CEF_REQUIRE_VALID_CONTEXT(NULL); - CEF_REQUIRE_UI_THREAD(NULL); - v8::HandleScope handle_scope; - // Convert from seconds to milliseconds. - return new CefV8ValueImpl(v8::Date::New(date.GetDoubleT() * 1000)); -} - -// static -CefRefPtr CefV8Value::CreateString(const CefString& value) { - CEF_REQUIRE_VALID_CONTEXT(NULL); - CEF_REQUIRE_UI_THREAD(NULL); - v8::HandleScope handle_scope; - return new CefV8ValueImpl(GetV8String(value)); -} - -// static -CefRefPtr CefV8Value::CreateObject( - CefRefPtr accessor) { - CEF_REQUIRE_VALID_CONTEXT(NULL); - CEF_REQUIRE_UI_THREAD(NULL); - - v8::HandleScope handle_scope; - - v8::Local context = v8::Context::GetCurrent(); - if (context.IsEmpty()) { - NOTREACHED() << "not currently in a V8 context"; - return NULL; - } - - // Create the new V8 object. - v8::Local obj = v8::Object::New(); - - // Create a tracker object that will cause the user data and/or accessor - // reference to be released when the V8 object is destroyed. - V8TrackObject* tracker = new V8TrackObject; - tracker->SetAccessor(accessor); - - // Attach the tracker object. - tracker->AttachTo(obj); - - return new CefV8ValueImpl(obj, tracker); -} - -// static -CefRefPtr CefV8Value::CreateArray(int length) { - CEF_REQUIRE_VALID_CONTEXT(NULL); - CEF_REQUIRE_UI_THREAD(NULL); - - v8::HandleScope handle_scope; - - v8::Local context = v8::Context::GetCurrent(); - if (context.IsEmpty()) { - NOTREACHED() << "not currently in a V8 context"; - return NULL; - } - - // Create a tracker object that will cause the user data reference to be - // released when the V8 object is destroyed. - V8TrackObject* tracker = new V8TrackObject; - - // Create the new V8 array. - v8::Local arr = v8::Array::New(length); - - // Attach the tracker object. - tracker->AttachTo(arr); - - return new CefV8ValueImpl(arr, tracker); -} - -// static -CefRefPtr CefV8Value::CreateFunction( - const CefString& name, - CefRefPtr handler) { - CEF_REQUIRE_VALID_CONTEXT(NULL); - CEF_REQUIRE_UI_THREAD(NULL); - - if (!handler.get()) { - NOTREACHED() << "invalid parameter"; - return NULL; - } - - v8::HandleScope handle_scope; - - v8::Local context = v8::Context::GetCurrent(); - if (context.IsEmpty()) { - NOTREACHED() << "not currently in a V8 context"; - return NULL; - } - - // Create a new V8 function template. - v8::Local tmpl = v8::FunctionTemplate::New(); - - v8::Local data = v8::External::New(handler.get()); - - // Set the function handler callback. - tmpl->SetCallHandler(FunctionCallbackImpl, data); - - // Retrieve the function object and set the name. - v8::Local func = tmpl->GetFunction(); - if (func.IsEmpty()) { - NOTREACHED() << "failed to create V8 function"; - return NULL; - } - - func->SetName(GetV8String(name)); - - // Create a tracker object that will cause the user data and/or handler - // reference to be released when the V8 object is destroyed. - V8TrackObject* tracker = new V8TrackObject; - tracker->SetHandler(handler); - - // Attach the tracker object. - tracker->AttachTo(func); - - // Create the CefV8ValueImpl and provide a tracker object that will cause - // the handler reference to be released when the V8 object is destroyed. - return new CefV8ValueImpl(func, tracker); -} - - -// CefV8ValueImpl - -CefV8ValueImpl::CefV8ValueImpl(v8::Handle value, - CefTrackNode* tracker) - : handle_(new Handle(v8::Handle(), value, tracker)), - rethrow_exceptions_(false) { -} - -CefV8ValueImpl::~CefV8ValueImpl() { -} - - -bool CefV8ValueImpl::IsValid() { - CEF_REQUIRE_UI_THREAD(false); - return handle_->IsValid(); -} - -bool CefV8ValueImpl::IsUndefined() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - return GetHandle(false)->IsUndefined(); -} - -bool CefV8ValueImpl::IsNull() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - return GetHandle(false)->IsNull(); -} - -bool CefV8ValueImpl::IsBool() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - return (GetHandle(false)->IsBoolean() || GetHandle(false)->IsTrue() || - GetHandle(false)->IsFalse()); -} - -bool CefV8ValueImpl::IsInt() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - return GetHandle(false)->IsInt32(); -} - -bool CefV8ValueImpl::IsUInt() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - return GetHandle(false)->IsUint32(); -} - -bool CefV8ValueImpl::IsDouble() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - return GetHandle(false)->IsNumber(); -} - -bool CefV8ValueImpl::IsDate() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - return GetHandle(false)->IsDate(); -} - -bool CefV8ValueImpl::IsString() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - return GetHandle(false)->IsString(); -} - -bool CefV8ValueImpl::IsObject() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - return GetHandle(false)->IsObject(); -} - -bool CefV8ValueImpl::IsArray() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - return GetHandle(false)->IsArray(); -} - -bool CefV8ValueImpl::IsFunction() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - return GetHandle(false)->IsFunction(); -} - -bool CefV8ValueImpl::IsSame(CefRefPtr that) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - - v8::HandleScope handle_scope; - - v8::Handle thatHandle; - v8::Handle thisHandle = GetHandle(false); - - CefV8ValueImpl* impl = static_cast(that.get()); - if (impl) - thatHandle = impl->GetHandle(false); - - return (thisHandle == thatHandle); -} - -bool CefV8ValueImpl::GetBoolValue() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - if (GetHandle(false)->IsTrue()) { - return true; - } else if (GetHandle(false)->IsFalse()) { - return false; - } else { - v8::HandleScope handle_scope; - v8::Local val = GetHandle(false)->ToBoolean(); - return val->Value(); - } -} - -int32 CefV8ValueImpl::GetIntValue() { - CEF_REQUIRE_UI_THREAD(0); - CEF_V8_REQUIRE_VALID_RETURN(0); - v8::HandleScope handle_scope; - v8::Local val = GetHandle(false)->ToInt32(); - return val->Value(); -} - -uint32 CefV8ValueImpl::GetUIntValue() { - CEF_REQUIRE_UI_THREAD(0); - CEF_V8_REQUIRE_VALID_RETURN(0); - v8::HandleScope handle_scope; - v8::Local val = GetHandle(false)->ToUint32(); - return val->Value(); -} - -double CefV8ValueImpl::GetDoubleValue() { - CEF_REQUIRE_UI_THREAD(0.); - CEF_V8_REQUIRE_VALID_RETURN(0.); - v8::HandleScope handle_scope; - v8::Local val = GetHandle(false)->ToNumber(); - return val->Value(); -} - -CefTime CefV8ValueImpl::GetDateValue() { - CEF_REQUIRE_UI_THREAD(CefTime(0.)); - CEF_V8_REQUIRE_VALID_RETURN(CefTime(0.)); - v8::HandleScope handle_scope; - v8::Local val = GetHandle(false)->ToNumber(); - // Convert from milliseconds to seconds. - return CefTime(val->Value() / 1000); -} - -CefString CefV8ValueImpl::GetStringValue() { - CefString rv; - CEF_REQUIRE_UI_THREAD(rv); - CEF_V8_REQUIRE_VALID_RETURN(rv); - v8::HandleScope handle_scope; - GetCefString(GetHandle(false)->ToString(), rv); - return rv; -} - -bool CefV8ValueImpl::IsUserCreated() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - V8TrackObject* tracker = V8TrackObject::Unwrap(obj); - return (tracker != NULL); -} - -bool CefV8ValueImpl::HasException() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - return (last_exception_.get() != NULL); -} - -CefRefPtr CefV8ValueImpl::GetException() { - CEF_REQUIRE_UI_THREAD(NULL); - CEF_V8_REQUIRE_OBJECT_RETURN(NULL); - - return last_exception_; -} - -bool CefV8ValueImpl::ClearException() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - last_exception_ = NULL; - return true; -} - -bool CefV8ValueImpl::WillRethrowExceptions() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - return rethrow_exceptions_; -} - -bool CefV8ValueImpl::SetRethrowExceptions(bool rethrow) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - rethrow_exceptions_ = rethrow; - return true; -} - -bool CefV8ValueImpl::HasValue(const CefString& key) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - return obj->Has(GetV8String(key)); -} - -bool CefV8ValueImpl::HasValue(int index) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - if (index < 0) { - NOTREACHED() << "invalid input parameter"; - return false; - } - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - return obj->Has(index); -} - -bool CefV8ValueImpl::DeleteValue(const CefString& key) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - bool del = obj->Delete(GetV8String(key)); - return (!HasCaught(try_catch) && del); -} - -bool CefV8ValueImpl::DeleteValue(int index) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - if (index < 0) { - NOTREACHED() << "invalid input parameter"; - return false; - } - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - bool del = obj->Delete(index); - return (!HasCaught(try_catch) && del); -} - -CefRefPtr CefV8ValueImpl::GetValue(const CefString& key) { - CEF_REQUIRE_UI_THREAD(NULL); - CEF_V8_REQUIRE_OBJECT_RETURN(NULL); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - v8::Local value = obj->Get(GetV8String(key)); - if (!HasCaught(try_catch) && !value.IsEmpty()) - return new CefV8ValueImpl(value); - return NULL; -} - -CefRefPtr CefV8ValueImpl::GetValue(int index) { - CEF_REQUIRE_UI_THREAD(NULL); - CEF_V8_REQUIRE_OBJECT_RETURN(NULL); - - if (index < 0) { - NOTREACHED() << "invalid input parameter"; - return NULL; - } - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - v8::Local value = obj->Get(v8::Number::New(index)); - if (!HasCaught(try_catch) && !value.IsEmpty()) - return new CefV8ValueImpl(value); - return NULL; -} - -bool CefV8ValueImpl::SetValue(const CefString& key, - CefRefPtr value, - PropertyAttribute attribute) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - CefV8ValueImpl* impl = static_cast(value.get()); - if (impl) { - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - bool set = obj->Set(GetV8String(key), impl->GetHandle(true), - static_cast(attribute)); - return (!HasCaught(try_catch) && set); - } else { - NOTREACHED() << "invalid input parameter"; - return false; - } -} - -bool CefV8ValueImpl::SetValue(int index, CefRefPtr value) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - if (index < 0) { - NOTREACHED() << "invalid input parameter"; - return false; - } - - CefV8ValueImpl* impl = static_cast(value.get()); - if (impl) { - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - bool set = obj->Set(index, impl->GetHandle(true)); - return (!HasCaught(try_catch) && set); - } else { - NOTREACHED() << "invalid input parameter"; - return false; - } -} - -bool CefV8ValueImpl::SetValue(const CefString& key, AccessControl settings, - PropertyAttribute attribute) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - CefRefPtr accessorPtr; - - V8TrackObject* tracker = V8TrackObject::Unwrap(obj); - if (tracker) - accessorPtr = tracker->GetAccessor(); - - // Verify that an accessor exists for this object. - if (!accessorPtr.get()) - return false; - - v8::AccessorGetter getter = AccessorGetterCallbackImpl; - v8::AccessorSetter setter = (attribute & V8_PROPERTY_ATTRIBUTE_READONLY) ? - NULL : AccessorSetterCallbackImpl; - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - bool set = obj->SetAccessor(GetV8String(key), getter, setter, obj, - static_cast(settings), - static_cast(attribute)); - return (!HasCaught(try_catch) && set); -} - -bool CefV8ValueImpl::GetKeys(std::vector& keys) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - v8::Local arr_keys = obj->GetPropertyNames(); - uint32_t len = arr_keys->Length(); - for (uint32_t i = 0; i < len; ++i) { - v8::Local value = arr_keys->Get(v8::Integer::New(i)); - CefString str; - GetCefString(value->ToString(), str); - keys.push_back(str); - } - return true; -} - -bool CefV8ValueImpl::SetUserData(CefRefPtr user_data) { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_OBJECT_RETURN(false); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - V8TrackObject* tracker = V8TrackObject::Unwrap(obj); - if (tracker) { - tracker->SetUserData(user_data); - return true; - } - - return false; -} - -CefRefPtr CefV8ValueImpl::GetUserData() { - CEF_REQUIRE_UI_THREAD(NULL); - CEF_V8_REQUIRE_OBJECT_RETURN(NULL); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - V8TrackObject* tracker = V8TrackObject::Unwrap(obj); - if (tracker) - return tracker->GetUserData(); - - return NULL; -} - -int CefV8ValueImpl::GetExternallyAllocatedMemory() { - CEF_REQUIRE_UI_THREAD(0); - CEF_V8_REQUIRE_OBJECT_RETURN(0); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - V8TrackObject* tracker = V8TrackObject::Unwrap(obj); - if (tracker) - return tracker->GetExternallyAllocatedMemory(); - - return 0; -} - -int CefV8ValueImpl::AdjustExternallyAllocatedMemory(int change_in_bytes) { - CEF_REQUIRE_UI_THREAD(0); - CEF_V8_REQUIRE_OBJECT_RETURN(0); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - V8TrackObject* tracker = V8TrackObject::Unwrap(obj); - if (tracker) - return tracker->AdjustExternallyAllocatedMemory(change_in_bytes); - - return 0; -} - -int CefV8ValueImpl::GetArrayLength() { - CEF_REQUIRE_UI_THREAD(0); - CEF_V8_REQUIRE_ARRAY_RETURN(0); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - v8::Local arr = v8::Local::Cast(obj); - return arr->Length(); -} - -CefString CefV8ValueImpl::GetFunctionName() { - CefString rv; - CEF_REQUIRE_UI_THREAD(rv); - CEF_V8_REQUIRE_FUNCTION_RETURN(rv); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - v8::Local func = v8::Local::Cast(obj); - GetCefString(v8::Handle::Cast(func->GetName()), rv); - return rv; -} - -CefRefPtr CefV8ValueImpl::GetFunctionHandler() { - CEF_REQUIRE_UI_THREAD(NULL); - CEF_V8_REQUIRE_FUNCTION_RETURN(NULL); - - v8::HandleScope handle_scope; - v8::Local obj = GetHandle(false)->ToObject(); - - V8TrackObject* tracker = V8TrackObject::Unwrap(obj); - if (tracker) - return tracker->GetHandler(); - - return NULL; -} - -CefRefPtr CefV8ValueImpl::ExecuteFunction( - CefRefPtr object, - const CefV8ValueList& arguments) { - // An empty context value defaults to the current context. - CefRefPtr context; - return ExecuteFunctionWithContext(context, object, arguments); -} - -CefRefPtr CefV8ValueImpl::ExecuteFunctionWithContext( - CefRefPtr context, - CefRefPtr object, - const CefV8ValueList& arguments) { - CEF_REQUIRE_UI_THREAD(NULL); - CEF_V8_REQUIRE_FUNCTION_RETURN(NULL); - - v8::HandleScope handle_scope; - - v8::Local context_local; - if (context.get()) { - CefV8ContextImpl* context_impl = - static_cast(context.get()); - context_local = context_impl->GetContext(); - } else { - context_local = v8::Context::GetCurrent(); - } - - v8::Context::Scope context_scope(context_local); - - v8::Local obj = GetHandle(false)->ToObject(); - v8::Local func = v8::Local::Cast(obj); - v8::Handle recv; - - // Default to the global object if no object or a non-object was provided. - if (object.get() && object->IsObject()) { - CefV8ValueImpl* recv_impl = static_cast(object.get()); - recv = v8::Handle::Cast(recv_impl->GetHandle(true)); - } else { - recv = context_local->Global(); - } - - int argc = arguments.size(); - v8::Handle *argv = NULL; - if (argc > 0) { - argv = new v8::Handle[argc]; - for (int i = 0; i < argc; ++i) { - argv[i] = - static_cast(arguments[i].get())->GetHandle(true); - } - } - - CefRefPtr retval; - - { - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - v8::Local func_rv; - - // Execute the function call using the ScriptController so that inspector - // instrumentation works. - RefPtr frame = WebCore::toFrameIfNotDetached(context_local); - DCHECK(frame); - if (frame && - frame->script()->canExecuteScripts(WebCore::AboutToExecuteScript)) { - func_rv = frame->script()->callFunction(func, recv, argc, argv); - } - - if (!HasCaught(try_catch) && !func_rv.IsEmpty()) - retval = new CefV8ValueImpl(func_rv); - } - - if (argv) - delete [] argv; - - return retval; -} - -bool CefV8ValueImpl::HasCaught(v8::TryCatch& try_catch) { - if (try_catch.HasCaught()) { - last_exception_ = new CefV8ExceptionImpl(try_catch.Message()); - if (rethrow_exceptions_) - try_catch.ReThrow(); - return true; - } else { - if (last_exception_.get()) - last_exception_ = NULL; - return false; - } -} - - -// CefV8StackTrace - -// static -CefRefPtr CefV8StackTrace::GetCurrent(int frame_limit) { - CEF_REQUIRE_VALID_CONTEXT(NULL); - CEF_REQUIRE_UI_THREAD(NULL); - - v8::HandleScope handle_scope; - v8::Handle stackTrace = - v8::StackTrace::CurrentStackTrace( - frame_limit, v8::StackTrace::kDetailed); - if (stackTrace.IsEmpty()) - return NULL; - return new CefV8StackTraceImpl(stackTrace); -} - - -// CefV8StackTraceImpl - -CefV8StackTraceImpl::CefV8StackTraceImpl(v8::Handle handle) - : handle_(new Handle(v8::Handle(), handle)) { -} - -CefV8StackTraceImpl::~CefV8StackTraceImpl() { -} - -bool CefV8StackTraceImpl::IsValid() { - CEF_REQUIRE_UI_THREAD(false); - return handle_->IsValid(); -} - -int CefV8StackTraceImpl::GetFrameCount() { - CEF_REQUIRE_UI_THREAD(0); - CEF_V8_REQUIRE_VALID_RETURN(0); - v8::HandleScope handle_scope; - return GetHandle()->GetFrameCount(); -} - -CefRefPtr CefV8StackTraceImpl::GetFrame(int index) { - CEF_REQUIRE_UI_THREAD(NULL); - CEF_V8_REQUIRE_VALID_RETURN(NULL); - v8::HandleScope handle_scope; - v8::Handle stackFrame = GetHandle()->GetFrame(index); - if (stackFrame.IsEmpty()) - return NULL; - return new CefV8StackFrameImpl(stackFrame); -} - - -// CefV8StackFrameImpl - -CefV8StackFrameImpl::CefV8StackFrameImpl(v8::Handle handle) - : handle_(new Handle(v8::Handle(), handle)) { -} - -CefV8StackFrameImpl::~CefV8StackFrameImpl() { -} - -bool CefV8StackFrameImpl::IsValid() { - CEF_REQUIRE_UI_THREAD(false); - return handle_->IsValid(); -} - -CefString CefV8StackFrameImpl::GetScriptName() { - CefString rv; - CEF_REQUIRE_UI_THREAD(rv); - CEF_V8_REQUIRE_VALID_RETURN(rv); - v8::HandleScope handle_scope; - GetCefString(v8::Handle::Cast(GetHandle()->GetScriptName()), rv); - return rv; -} - -CefString CefV8StackFrameImpl::GetScriptNameOrSourceURL() { - CefString rv; - CEF_REQUIRE_UI_THREAD(rv); - CEF_V8_REQUIRE_VALID_RETURN(rv); - v8::HandleScope handle_scope; - GetCefString( - v8::Handle::Cast(GetHandle()->GetScriptNameOrSourceURL()), - rv); - return rv; -} - -CefString CefV8StackFrameImpl::GetFunctionName() { - CefString rv; - CEF_REQUIRE_UI_THREAD(rv); - CEF_V8_REQUIRE_VALID_RETURN(rv); - v8::HandleScope handle_scope; - GetCefString( - v8::Handle::Cast(GetHandle()->GetFunctionName()), rv); - return rv; -} - -int CefV8StackFrameImpl::GetLineNumber() { - CEF_REQUIRE_UI_THREAD(0); - CEF_V8_REQUIRE_VALID_RETURN(0); - v8::HandleScope handle_scope; - return GetHandle()->GetLineNumber(); -} - -int CefV8StackFrameImpl::GetColumn() { - CEF_REQUIRE_UI_THREAD(0); - CEF_V8_REQUIRE_VALID_RETURN(0); - v8::HandleScope handle_scope; - return GetHandle()->GetColumn(); -} - -bool CefV8StackFrameImpl::IsEval() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - v8::HandleScope handle_scope; - return GetHandle()->IsEval(); -} - -bool CefV8StackFrameImpl::IsConstructor() { - CEF_REQUIRE_UI_THREAD(false); - CEF_V8_REQUIRE_VALID_RETURN(false); - v8::HandleScope handle_scope; - return GetHandle()->IsConstructor(); -} - -void CefV8MessageHandler(v8::Handle message, - v8::Handle data) { - CEF_REQUIRE_VALID_CONTEXT(void()); - CEF_REQUIRE_UI_THREAD(void()); - - CefRefPtr context = CefV8Context::GetCurrentContext(); - CefRefPtr browser = context->GetBrowser(); - CefRefPtr frame = context->GetFrame(); - - v8::Handle v8Stack = message->GetStackTrace(); - DCHECK(!v8Stack.IsEmpty()); - CefRefPtr stackTrace = new CefV8StackTraceImpl(v8Stack); - - CefRefPtr client = browser->GetClient(); - if (!client.get()) - return; - - CefRefPtr handler = client->GetV8ContextHandler(); - if (!handler.get()) - return; - - CefRefPtr exception = new CefV8ExceptionImpl(message); - handler->OnUncaughtException(browser, frame, context, exception, stackTrace); -} diff --git a/cef1/libcef/v8_impl.h b/cef1/libcef/v8_impl.h deleted file mode 100644 index 2550ef754..000000000 --- a/cef1/libcef/v8_impl.h +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_V8_IMPL_H_ -#define CEF_LIBCEF_V8_IMPL_H_ -#pragma once - -#include - -#include "include/cef_v8.h" -#include "v8/include/v8.h" -#include "libcef/cef_thread.h" -#include "libcef/tracker.h" -#include "base/memory/ref_counted.h" - -class CefTrackNode; - -namespace WebKit { -class WebFrame; -}; - -// Call to detach all handles associated with the specified contxt. -void CefV8ReleaseContext(v8::Handle context); - -// Used to detach handles when the associated context is released. -class CefV8ContextState : public base::RefCounted { - public: - CefV8ContextState() : valid_(true) {} - virtual ~CefV8ContextState() {} - - bool IsValid() { return valid_; } - void Detach() { - DCHECK(valid_); - valid_ = false; - track_manager_.DeleteAll(); - } - - void AddTrackObject(CefTrackNode* object) { - DCHECK(valid_); - track_manager_.Add(object); - } - - void DeleteTrackObject(CefTrackNode* object) { - DCHECK(valid_); - track_manager_.Delete(object); - } - - private: - bool valid_; - CefTrackManager track_manager_; -}; - -// Base class for V8 Handle types. -class CefV8HandleBase : - public base::RefCountedThreadSafe { - public: - virtual ~CefV8HandleBase() {} - - // Returns true if there is no underlying context or if the underlying context - // is valid. - bool IsValid() { - return (!context_state_.get() || context_state_->IsValid()); - } - - v8::Isolate* isolate() const { return isolate_; } - - protected: - // |context| is the context that owns this handle. If empty the current - // context will be used. - explicit CefV8HandleBase(v8::Handle context); - - v8::Isolate* isolate_; - scoped_refptr context_state_; -}; - -// Template for V8 Handle types. This class is used to ensure that V8 objects -// are only released on the UI thread. -template -class CefV8Handle : public CefV8HandleBase { - public: - typedef v8::Handle handleType; - typedef v8::Persistent persistentType; - - CefV8Handle(v8::Handle context, handleType v) - : CefV8HandleBase(context), - handle_(persistentType::New(isolate(), v)) { - } - virtual ~CefV8Handle() { - handle_.Dispose(isolate()); - handle_.Clear(); - } - - handleType GetHandle() { - DCHECK(IsValid()); - return handle_; - } - - protected: - persistentType handle_; - - DISALLOW_COPY_AND_ASSIGN(CefV8Handle); -}; - -// Specialization for v8::Value with empty implementation to avoid incorrect -// usage. -template <> -class CefV8Handle { -}; - - -class CefV8ContextImpl : public CefV8Context { - public: - explicit CefV8ContextImpl(v8::Handle context); - virtual ~CefV8ContextImpl(); - - virtual bool IsValid() OVERRIDE; - virtual CefRefPtr GetBrowser() OVERRIDE; - virtual CefRefPtr GetFrame() OVERRIDE; - virtual CefRefPtr GetGlobal() OVERRIDE; - virtual bool Enter() OVERRIDE; - virtual bool Exit() OVERRIDE; - virtual bool IsSame(CefRefPtr that) OVERRIDE; - virtual bool Eval(const CefString& code, - CefRefPtr& retval, - CefRefPtr& exception) OVERRIDE; - - v8::Local GetContext(); - WebKit::WebFrame* GetWebFrame(); - - v8::Handle GetHandle() { return handle_->GetHandle(); } - - protected: - typedef CefV8Handle Handle; - scoped_refptr handle_; - -#ifndef NDEBUG - // Used in debug builds to catch missing Exits in destructor. - int enter_count_; -#endif - - IMPLEMENT_REFCOUNTING(CefV8ContextImpl); - DISALLOW_COPY_AND_ASSIGN(CefV8ContextImpl); -}; - -class CefV8ValueImpl : public CefV8Value { - public: - CefV8ValueImpl(v8::Handle value, CefTrackNode* tracker = NULL); - virtual ~CefV8ValueImpl(); - - virtual bool IsValid() OVERRIDE; - virtual bool IsUndefined() OVERRIDE; - virtual bool IsNull() OVERRIDE; - virtual bool IsBool() OVERRIDE; - virtual bool IsInt() OVERRIDE; - virtual bool IsUInt() OVERRIDE; - virtual bool IsDouble() OVERRIDE; - virtual bool IsDate() OVERRIDE; - virtual bool IsString() OVERRIDE; - virtual bool IsObject() OVERRIDE; - virtual bool IsArray() OVERRIDE; - virtual bool IsFunction() OVERRIDE; - virtual bool IsSame(CefRefPtr value) OVERRIDE; - virtual bool GetBoolValue() OVERRIDE; - virtual int32 GetIntValue() OVERRIDE; - virtual uint32 GetUIntValue() OVERRIDE; - virtual double GetDoubleValue() OVERRIDE; - virtual CefTime GetDateValue() OVERRIDE; - virtual CefString GetStringValue() OVERRIDE; - virtual bool IsUserCreated() OVERRIDE; - virtual bool HasException() OVERRIDE; - virtual CefRefPtr GetException() OVERRIDE; - virtual bool ClearException() OVERRIDE; - virtual bool WillRethrowExceptions() OVERRIDE; - virtual bool SetRethrowExceptions(bool rethrow) OVERRIDE; - virtual bool HasValue(const CefString& key) OVERRIDE; - virtual bool HasValue(int index) OVERRIDE; - virtual bool DeleteValue(const CefString& key) OVERRIDE; - virtual bool DeleteValue(int index) OVERRIDE; - virtual CefRefPtr GetValue(const CefString& key) OVERRIDE; - virtual CefRefPtr GetValue(int index) OVERRIDE; - virtual bool SetValue(const CefString& key, CefRefPtr value, - PropertyAttribute attribute) OVERRIDE; - virtual bool SetValue(int index, CefRefPtr value) OVERRIDE; - virtual bool SetValue(const CefString& key, AccessControl settings, - PropertyAttribute attribute) OVERRIDE; - virtual bool GetKeys(std::vector& keys) OVERRIDE; - virtual bool SetUserData(CefRefPtr user_data) OVERRIDE; - virtual CefRefPtr GetUserData() OVERRIDE; - virtual int GetExternallyAllocatedMemory() OVERRIDE; - virtual int AdjustExternallyAllocatedMemory(int change_in_bytes) OVERRIDE; - virtual int GetArrayLength() OVERRIDE; - virtual CefString GetFunctionName() OVERRIDE; - virtual CefRefPtr GetFunctionHandler() OVERRIDE; - virtual CefRefPtr ExecuteFunction( - CefRefPtr object, - const CefV8ValueList& arguments) OVERRIDE; - virtual CefRefPtr ExecuteFunctionWithContext( - CefRefPtr context, - CefRefPtr object, - const CefV8ValueList& arguments) OVERRIDE; - - v8::Handle GetHandle(bool should_persist) { - return handle_->GetHandle(should_persist); - } - - protected: - // Test for and record any exception. - bool HasCaught(v8::TryCatch& try_catch); - - class Handle : public CefV8HandleBase { - public: - typedef v8::Handle handleType; - typedef v8::Persistent persistentType; - - Handle(v8::Handle context, handleType v, CefTrackNode* tracker) - : CefV8HandleBase(context), - handle_(persistentType::New(isolate(), v)), - tracker_(tracker), - should_persist_(false) { - } - virtual ~Handle(); - - handleType GetHandle(bool should_persist) { - DCHECK(IsValid()); - if (should_persist && !should_persist_) - should_persist_ = true; - return handle_; - } - - private: - persistentType handle_; - - // For Object and Function types, we need to hold on to a reference to their - // internal data or function handler objects that are reference counted. - CefTrackNode* tracker_; - - // True if the handle needs to persist due to it being passed into V8. - bool should_persist_; - - DISALLOW_COPY_AND_ASSIGN(Handle); - }; - scoped_refptr handle_; - - CefRefPtr last_exception_; - bool rethrow_exceptions_; - - IMPLEMENT_REFCOUNTING(CefV8ValueImpl); - DISALLOW_COPY_AND_ASSIGN(CefV8ValueImpl); -}; - -class CefV8StackTraceImpl : public CefV8StackTrace { - public: - explicit CefV8StackTraceImpl(v8::Handle handle); - virtual ~CefV8StackTraceImpl(); - - virtual bool IsValid() OVERRIDE; - virtual int GetFrameCount() OVERRIDE; - virtual CefRefPtr GetFrame(int index) OVERRIDE; - - v8::Handle GetHandle() { return handle_->GetHandle(); } - - protected: - typedef CefV8Handle Handle; - scoped_refptr handle_; - - IMPLEMENT_REFCOUNTING(CefV8StackTraceImpl); - DISALLOW_COPY_AND_ASSIGN(CefV8StackTraceImpl); -}; - -class CefV8StackFrameImpl : public CefV8StackFrame { - public: - explicit CefV8StackFrameImpl(v8::Handle handle); - virtual ~CefV8StackFrameImpl(); - - virtual bool IsValid() OVERRIDE; - virtual CefString GetScriptName() OVERRIDE; - virtual CefString GetScriptNameOrSourceURL() OVERRIDE; - virtual CefString GetFunctionName() OVERRIDE; - virtual int GetLineNumber() OVERRIDE; - virtual int GetColumn() OVERRIDE; - virtual bool IsEval() OVERRIDE; - virtual bool IsConstructor() OVERRIDE; - - v8::Handle GetHandle() { return handle_->GetHandle(); } - - protected: - typedef CefV8Handle Handle; - scoped_refptr handle_; - - IMPLEMENT_REFCOUNTING(CefV8StackFrameImpl); - DISALLOW_COPY_AND_ASSIGN(CefV8StackFrameImpl); -}; - -// Used to catch global exceptions. -void CefV8MessageHandler(v8::Handle message, - v8::Handle data); - -#endif // CEF_LIBCEF_V8_IMPL_H_ diff --git a/cef1/libcef/web_drag_source_gtk.cc b/cef1/libcef/web_drag_source_gtk.cc deleted file mode 100644 index 07f4d7018..000000000 --- a/cef1/libcef/web_drag_source_gtk.cc +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. -// Portions 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 "libcef/web_drag_source_gtk.h" - -#include -#include - -#include "libcef/browser_impl.h" -#include "libcef/cef_context.h" -#include "libcef/drag_data_impl.h" -#include "libcef/drag_download_file.h" -#include "libcef/drag_download_util.h" -#include "libcef/web_drag_utils_gtk.h" -#include "libcef/web_drop_target_gtk.h" - -#include "base/nix/mime_util_xdg.h" -#include "base/threading/thread_restrictions.h" -#include "base/utf_string_conversions.h" -#include "googleurl/src/gurl.h" -#include "net/base/file_stream.h" -#include "net/base/net_util.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebDragData.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebPoint.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebImage.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/base/clipboard/custom_data_helper.h" -#include "ui/base/dragdrop/os_exchange_data.h" -#include "ui/base/dragdrop/os_exchange_data_provider_gtk.h" -#include "ui/base/dragdrop/gtk_dnd_util.h" -#include "ui/base/gtk/gtk_screen_util.h" -#include "ui/base/window_open_disposition.h" -#include "ui/gfx/gtk_util.h" -#include "webkit/glue/webdropdata.h" - -using WebKit::WebDragOperation; -using WebKit::WebDragOperationsMask; -using WebKit::WebDragOperationNone; -using WebKit::WebDragOperationCopy; -using WebKit::WebDragOperationLink; -using WebKit::WebDragOperationMove; -using WebKit::WebDragOperationGeneric; -using WebKit::WebPoint; -using WebKit::WebView; - -WebDragSource::WebDragSource(CefBrowserImpl* browser) - : browser_(browser), - drag_pixbuf_(NULL), - drag_failed_(false), - drag_widget_(gtk_invisible_new()), - drag_context_(NULL), - drag_icon_(gtk_window_new(GTK_WINDOW_POPUP)) { - signals_.Connect(drag_widget_, "drag-failed", - G_CALLBACK(OnDragFailedThunk), this); - signals_.Connect(drag_widget_, "drag-begin", - G_CALLBACK(OnDragBeginThunk), this); - signals_.Connect(drag_widget_, "drag-end", - G_CALLBACK(OnDragEndThunk), this); - signals_.Connect(drag_widget_, "drag-data-get", - G_CALLBACK(OnDragDataGetThunk), this); - - signals_.Connect(drag_icon_, "expose-event", - G_CALLBACK(OnDragIconExposeThunk), this); -} - -WebDragSource::~WebDragSource() { - // Break the current drag, if any. - if (drop_data_.get()) { - gtk_grab_add(drag_widget_); - gtk_grab_remove(drag_widget_); - base::MessageLoopForUI::current()->RemoveObserver(this); - drop_data_.reset(); - } - - gtk_widget_destroy(drag_widget_); - gtk_widget_destroy(drag_icon_); -} - -void WebDragSource::StartDragging(const WebDropData& drop_data, - WebDragOperationsMask allowed_ops, - GdkEventButton* last_mouse_down, - const SkBitmap& image, - const gfx::Vector2d& image_offset) { - // Guard against re-starting before previous drag completed. - if (drag_context_) { - NOTREACHED(); - getView()->dragSourceSystemDragEnded(); - return; - } - - int targets_mask = 0; - - if (!drop_data.text.string().empty()) - targets_mask |= ui::TEXT_PLAIN; - if (drop_data.url.is_valid()) { - targets_mask |= ui::TEXT_URI_LIST; - targets_mask |= ui::CHROME_NAMED_URL; - targets_mask |= ui::NETSCAPE_URL; - } - if (!drop_data.html.string().empty()) - targets_mask |= ui::TEXT_HTML; - if (!drop_data.file_contents.empty()) - targets_mask |= ui::CHROME_WEBDROP_FILE_CONTENTS; - if (!drop_data.download_metadata.empty() && - drag_download_util::ParseDownloadMetadata(drop_data.download_metadata, - &wide_download_mime_type_, - &download_file_name_, - &download_url_)) { - targets_mask |= ui::DIRECT_SAVE_FILE; - } - if (!drop_data.custom_data.empty()) - targets_mask |= ui::CUSTOM_DATA; - - // NOTE: Begin a drag even if no targets present. Otherwise, things like - // draggable list elements will not work. - - drop_data_.reset(new WebDropData(drop_data)); - - // The image we get from WebKit makes heavy use of alpha-shading. This looks - // bad on non-compositing WMs. Fall back to the default drag icon. - if (!image.isNull() && ui::IsScreenComposited()) - drag_pixbuf_ = gfx::GdkPixbufFromSkBitmap(image); - image_offset_ = image_offset; - - GtkTargetList* list = ui::GetTargetListFromCodeMask(targets_mask); - if (targets_mask & ui::CHROME_WEBDROP_FILE_CONTENTS) { - // Looking up the mime type can hit the disk. http://crbug.com/84896 - base::ThreadRestrictions::ScopedAllowIO allow_io; - drag_file_mime_type_ = gdk_atom_intern( - base::nix::GetDataMimeType(drop_data.file_contents).c_str(), FALSE); - gtk_target_list_add(list, drag_file_mime_type_, - 0, ui::CHROME_WEBDROP_FILE_CONTENTS); - } - - drag_failed_ = false; - - // If we don't pass an event, GDK won't know what event time to start grabbing - // mouse events. Technically it's the mouse motion event and not the mouse - // down event that causes the drag, but there's no reliable way to know - // *which* motion event initiated the drag, so this will have to do. - // TODO(estade): This can sometimes be very far off, e.g. if the user clicks - // and holds and doesn't start dragging for a long time. I doubt it matters - // much, but we should probably look into the possibility of getting the - // initiating event from webkit. - GdkDragAction action = - web_drag_utils_gtk::WebDragOpToGdkDragAction(allowed_ops); - drag_context_ = gtk_drag_begin(drag_widget_, list, action, - 1, // Drags are always initiated by the left button. - reinterpret_cast(last_mouse_down)); - // The drag adds a ref; let it own the list. - gtk_target_list_unref(list); - - // Sometimes the drag fails to start; |context| will be NULL and we won't - // get a drag-end signal. - if (!drag_context_) { - drag_failed_ = true; - drop_data_.reset(); - getView()->dragSourceSystemDragEnded(); - return; - } - - base::MessageLoopForUI::current()->AddObserver(this); -} - -WebKit::WebView* WebDragSource::getView() { - return browser_->UIT_GetWebView(); -} - -GtkWidget* WebDragSource::getNativeView() { - return browser_->UIT_GetWebViewHost()->view_handle(); -} - -void WebDragSource::WillProcessEvent(GdkEvent* event) { - // No-op. -} - -void WebDragSource::DidProcessEvent(GdkEvent* event) { - if (event->type != GDK_MOTION_NOTIFY) - return; - - GdkEventMotion* event_motion = reinterpret_cast(event); - gfx::Point client = ui::ClientPoint(getNativeView()); - gfx::Point screen(static_cast(event_motion->x_root), - static_cast(event_motion->y_root)); - - getView()->dragSourceMovedTo(client, screen, WebDragOperationNone); -} - -void WebDragSource::OnDragDataGet(GtkWidget* sender, - GdkDragContext* context, - GtkSelectionData* selection_data, - guint target_type, - guint time) { - const int kBitsPerByte = 8; - - switch (target_type) { - case ui::TEXT_PLAIN: { - std::string utf8_text = UTF16ToUTF8(drop_data_->text.string()); - gtk_selection_data_set_text(selection_data, utf8_text.c_str(), - utf8_text.length()); - break; - } - - case ui::TEXT_HTML: { - // TODO(estade): change relative links to be absolute using - // |html_base_url|. - std::string utf8_text = UTF16ToUTF8(drop_data_->html.string()); - gtk_selection_data_set(selection_data, - ui::GetAtomForTarget(ui::TEXT_HTML), - kBitsPerByte, - reinterpret_cast(utf8_text.c_str()), - utf8_text.length()); - break; - } - - case ui::TEXT_URI_LIST: - case ui::CHROME_NAMED_URL: - case ui::NETSCAPE_URL: { - ui::WriteURLWithName(selection_data, drop_data_->url, - drop_data_->url_title, target_type); - break; - } - - case ui::CHROME_WEBDROP_FILE_CONTENTS: { - gtk_selection_data_set( - selection_data, - drag_file_mime_type_, kBitsPerByte, - reinterpret_cast(drop_data_->file_contents.data()), - drop_data_->file_contents.length()); - break; - } - - case ui::DIRECT_SAVE_FILE: { - char status_code = 'E'; - - // Retrieves the full file path (in file URL format) provided by the - // drop target by reading from the source window's XdndDirectSave0 - // property. - gint file_url_len = 0; - guchar* file_url_value = NULL; - if (gdk_property_get(context->source_window, - ui::GetAtomForTarget(ui::DIRECT_SAVE_FILE), - ui::GetAtomForTarget(ui::TEXT_PLAIN_NO_CHARSET), - 0, - 1024, - FALSE, - NULL, - NULL, - &file_url_len, - &file_url_value) && - file_url_value) { - // Convert from the file url to the file path. - GURL file_url(std::string(reinterpret_cast(file_url_value), - file_url_len)); - g_free(file_url_value); - base::FilePath file_path; - if (net::FileURLToFilePath(file_url, &file_path)) { - // Open the file as a stream. - scoped_ptr file_stream( - drag_download_util::CreateFileStreamForDrop(&file_path)); - if (file_stream.get()) { - WebView* webview = getView(); - const GURL& page_url = webview->mainFrame()->document().url(); - const std::string& page_encoding = - webview->mainFrame()->document().encoding().utf8(); - - // Start downloading the file to the stream. - scoped_refptr drag_file_downloader = - new DragDownloadFile( - file_path, - file_stream.Pass(), - download_url_, - page_url, - page_encoding, - browser_->UIT_GetWebViewDelegate()); - drag_file_downloader->Start( - new drag_download_util::PromiseFileFinalizer( - drag_file_downloader)); - - // Set the status code to success. - status_code = 'S'; - } - } - - // Return the status code to the file manager. - gtk_selection_data_set(selection_data, - gtk_selection_data_get_target(selection_data), - kBitsPerByte, - reinterpret_cast(&status_code), - 1); - } - break; - } - - case ui::CUSTOM_DATA: { - Pickle custom_data; - ui::WriteCustomDataToPickle(drop_data_->custom_data, &custom_data); - gtk_selection_data_set( - selection_data, - ui::GetAtomForTarget(ui::CUSTOM_DATA), - kBitsPerByte, - reinterpret_cast(custom_data.data()), - custom_data.size()); - break; - } - - default: - NOTREACHED(); - } -} - -gboolean WebDragSource::OnDragFailed(GtkWidget* sender, - GdkDragContext* context, - GtkDragResult result) { - drag_failed_ = true; - - GtkWidget* native_view = getNativeView(); - gfx::Point client = ui::ClientPoint(native_view); - gfx::Point screen = ui::ScreenPoint(native_view); - - getView()->dragSourceEndedAt(client, screen, WebDragOperationNone); - - // Let the native failure animation run. - return FALSE; -} - -void WebDragSource::OnDragBegin(GtkWidget* sender, - GdkDragContext* drag_context) { - if (!download_url_.is_empty()) { - // Generate the file name based on both mime type and proposed file name. - std::string default_name = "download"; - base::FilePath generated_download_file_name = - net::GenerateFileName(download_url_, - std::string(), - std::string(), - download_file_name_.value(), - UTF16ToUTF8(wide_download_mime_type_), - default_name); - - // Pass the file name to the drop target by setting the source window's - // XdndDirectSave0 property. - gdk_property_change(drag_context->source_window, - ui::GetAtomForTarget(ui::DIRECT_SAVE_FILE), - ui::GetAtomForTarget(ui::TEXT_PLAIN_NO_CHARSET), - 8, - GDK_PROP_MODE_REPLACE, - reinterpret_cast( - generated_download_file_name.value().c_str()), - generated_download_file_name.value().length()); - } - - if (drag_pixbuf_) { - gtk_widget_set_size_request(drag_icon_, - gdk_pixbuf_get_width(drag_pixbuf_), - gdk_pixbuf_get_height(drag_pixbuf_)); - - // We only need to do this once. - if (!gtk_widget_get_realized(drag_icon_)) { - GdkScreen* screen = gtk_widget_get_screen(drag_icon_); - GdkColormap* rgba = gdk_screen_get_rgba_colormap(screen); - if (rgba) - gtk_widget_set_colormap(drag_icon_, rgba); - } - - gtk_drag_set_icon_widget(drag_context, drag_icon_, - image_offset_.x(), image_offset_.y()); - } -} - -void WebDragSource::OnDragEnd(GtkWidget* sender, - GdkDragContext* drag_context) { - if (drag_pixbuf_) { - g_object_unref(drag_pixbuf_); - drag_pixbuf_ = NULL; - } - - base::MessageLoopForUI::current()->RemoveObserver(this); - - if (!download_url_.is_empty()) { - gdk_property_delete(drag_context->source_window, - ui::GetAtomForTarget(ui::DIRECT_SAVE_FILE)); - } - - if (!drag_failed_) { - GtkWidget* native_view = getNativeView(); - gfx::Point client = ui::ClientPoint(native_view); - gfx::Point screen = ui::ScreenPoint(native_view); - - getView()->dragSourceEndedAt(client, screen, - web_drag_utils_gtk::GdkDragActionToWebDragOp(drag_context->action)); - } - - getView()->dragSourceSystemDragEnded(); - - drop_data_.reset(); - drag_context_ = NULL; -} - -gboolean WebDragSource::OnDragIconExpose(GtkWidget* sender, - GdkEventExpose* event) { - cairo_t* cr = gdk_cairo_create(event->window); - gdk_cairo_rectangle(cr, &event->area); - cairo_clip(cr); - cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); - gdk_cairo_set_source_pixbuf(cr, drag_pixbuf_, 0, 0); - cairo_paint(cr); - cairo_destroy(cr); - - return TRUE; -} - diff --git a/cef1/libcef/web_drag_source_gtk.h b/cef1/libcef/web_drag_source_gtk.h deleted file mode 100644 index a9dbc0cc3..000000000 --- a/cef1/libcef/web_drag_source_gtk.h +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. -// Portions 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. - -#ifndef CEF_LIBCEF_WEB_DRAG_SOURCE_GTK_H_ -#define CEF_LIBCEF_WEB_DRAG_SOURCE_GTK_H_ - -#include -#include "base/files/file_path.h" -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" -#include "base/message_loop.h" -#include "base/string16.h" -#include "googleurl/src/gurl.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h" -#include "ui/base/gtk/gtk_signal.h" -#include "ui/base/gtk/gtk_signal_registrar.h" -#include "ui/gfx/native_widget_types.h" -#include "ui/gfx/vector2d.h" - -class CefBrowserImpl; -struct WebDropData; - -namespace WebKit { -class WebImage; -class WebPoint; -class WebView; -} - -class WebDragSource : public base::RefCounted, - public base::MessageLoopForUI::Observer { - public: - explicit WebDragSource(CefBrowserImpl* browser); - virtual ~WebDragSource(); - - void StartDragging(const WebDropData& drop_data, - WebKit::WebDragOperationsMask allowed_ops, - GdkEventButton* last_mouse_down, - const SkBitmap& image, - const gfx::Vector2d& image_offset); - - // MessageLoop::Observer implementation: - virtual void WillProcessEvent(GdkEvent* event) OVERRIDE; - virtual void DidProcessEvent(GdkEvent* event) OVERRIDE; - - private: - WebKit::WebView* getView(); - GtkWidget* getNativeView(); - - CHROMEGTK_CALLBACK_2(WebDragSource, gboolean, OnDragFailed, - GdkDragContext*, GtkDragResult); - CHROMEGTK_CALLBACK_1(WebDragSource, void, OnDragBegin, - GdkDragContext*); - CHROMEGTK_CALLBACK_1(WebDragSource, void, OnDragEnd, - GdkDragContext*); - CHROMEGTK_CALLBACK_4(WebDragSource, void, OnDragDataGet, - GdkDragContext*, GtkSelectionData*, guint, guint); - CHROMEGTK_CALLBACK_1(WebDragSource, gboolean, OnDragIconExpose, - GdkEventExpose*); - - CefBrowserImpl* browser_; - - // The drop data for the current drag (for drags that originate in the render - // view). Non-NULL iff there is a current drag. - scoped_ptr drop_data_; - - // The image used for depicting the drag, and the offset between the cursor - // and the top left pixel. - GdkPixbuf* drag_pixbuf_; - gfx::Vector2d image_offset_; - - // The mime type for the file contents of the current drag (if any). - GdkAtom drag_file_mime_type_; - - // Whether the current drag has failed. Meaningless if we are not the source - // for a current drag. - bool drag_failed_; - - // This is the widget we use to initiate drags. Since we don't use the - // renderer widget, we can persist drags even when our contents is switched - // out. We can't use an OwnedWidgetGtk because the GtkInvisible widget - // initialization code sinks the reference. - GtkWidget* drag_widget_; - - // Context created once drag starts. A NULL value indicates that there is - // no drag currently in progress. - GdkDragContext* drag_context_; - - // The file mime type for a drag-out download. - string16 wide_download_mime_type_; - - // The file name to be saved to for a drag-out download. - base::FilePath download_file_name_; - - // The URL to download from for a drag-out download. - GURL download_url_; - - // The widget that provides visual feedback for the drag. We can't use - // an OwnedWidgetGtk because the GtkWindow initialization code sinks - // the reference. - GtkWidget* drag_icon_; - - ui::GtkSignalRegistrar signals_; - - DISALLOW_COPY_AND_ASSIGN(WebDragSource); -}; - -#endif // CEF_LIBCEF_WEB_DRAG_SOURCE_GTK_H_ diff --git a/cef1/libcef/web_drag_source_mac.h b/cef1/libcef/web_drag_source_mac.h deleted file mode 100644 index e3a6ae59e..000000000 --- a/cef1/libcef/web_drag_source_mac.h +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_WEB_DRAG_SOURCE_MAC_H_ -#define CEF_LIBCEF_WEB_DRAG_SOURCE_MAC_H_ -#pragma once - -#import - -#include "base/files/file_path.h" -#include "base/memory/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" -#include "googleurl/src/gurl.h" -#include "ui/gfx/native_widget_types.h" - -struct WebDropData; -@class BrowserWebView; - -// A class that handles tracking and event processing for a drag and drop -// originating from the content area. -@interface WebDragSource : NSObject { - @private - // Our web view. Weak reference (owns or co-owns us). - BrowserWebView* view_; - - // Our drop data. Should only be initialized once. - scoped_ptr dropData_; - - // The image to show as drag image. Can be nil. - scoped_nsobject dragImage_; - - // The offset to draw |dragImage_| at. - NSPoint imageOffset_; - - // Our pasteboard. - scoped_nsobject pasteboard_; - - // A mask of the allowed drag operations. - NSDragOperation dragOperationMask_; - - // The file name to be saved to for a drag-out download. - base::FilePath downloadFileName_; - - // The URL to download from for a drag-out download. - GURL downloadURL_; - - // The file extension associated with the file drag, if any. - NSString* fileExtension_; -} - -// Initialize a WebDragSource object for a drag (originating on the given -// BrowserWebView and with the given dropData and pboard). Fill the pasteboard -// with data types appropriate for dropData. -- (id)initWithWebView:(BrowserWebView*)view - dropData:(const WebDropData*)dropData - image:(NSImage*)image - offset:(NSPoint)offset - pasteboard:(NSPasteboard*)pboard - dragOperationMask:(NSDragOperation)dragOperationMask; - -// Returns a mask of the allowed drag operations. -- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal; - -// Call when asked to do a lazy write to the pasteboard; hook up to -// -pasteboard:provideDataForType: (on the BrowserWebView). -- (void)lazyWriteToPasteboard:(NSPasteboard*)pboard - forType:(NSString*)type; - -// Start the drag (on the originally provided BrowserWebView); can do this right -// after -initWithContentsView:.... -- (void)startDrag; - -// End the drag and clear the pasteboard; hook up to -// -draggedImage:endedAt:operation:. -- (void)endDragAt:(NSPoint)screenPoint - operation:(NSDragOperation)operation; - -// Drag moved; hook up to -draggedImage:movedTo:. -- (void)moveDragTo:(NSPoint)screenPoint; - -// Call to drag a promised file to the given path (should be called before -// -endDragAt:...); hook up to -namesOfPromisedFilesDroppedAtDestination:. -// Returns the file name (not including path) of the file deposited (or which -// will be deposited). -- (NSString*)dragPromisedFileTo:(NSString*)path; - -@end - -#endif // CEF_LIBCEF_WEB_DRAG_SOURCE_MAC_H_ diff --git a/cef1/libcef/web_drag_source_mac.mm b/cef1/libcef/web_drag_source_mac.mm deleted file mode 100644 index 35afa67ae..000000000 --- a/cef1/libcef/web_drag_source_mac.mm +++ /dev/null @@ -1,426 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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 - -#include "libcef/browser_impl.h" -#import "libcef/browser_webview_mac.h" -#include "libcef/cef_context.h" -#include "libcef/drag_download_util.h" -#include "libcef/download_util.h" -#import "libcef/web_drag_source_mac.h" - -#include "base/files/file_path.h" -#include "base/string_util.h" -#include "base/strings/sys_string_conversions.h" -#include "base/threading/thread.h" -#include "base/threading/thread_restrictions.h" -#include "base/utf_string_conversions.h" -#include "net/base/file_stream.h" -#include "net/base/net_util.h" -#import "third_party/mozilla/NSPasteboard+Utils.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebPoint.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "webkit/glue/webdropdata.h" - -using base::SysNSStringToUTF8; -using base::SysUTF8ToNSString; -using base::SysUTF16ToNSString; -using net::FileStream; -using WebKit::WebDragOperationNone; -using WebKit::WebView; - -namespace { - -// An unofficial standard pasteboard title type to be provided alongside the -// |NSURLPboardType|. -NSString* const kNSURLTitlePboardType = @"public.url-name"; - -// Converts a string16 into a FilePath. Use this method instead of -// -[NSString fileSystemRepresentation] to prevent exceptions from being thrown. -// See http://crbug.com/78782 for more info. -base::FilePath FilePathFromFilename(const string16& filename) { - NSString* str = SysUTF16ToNSString(filename); - char buf[MAXPATHLEN]; - if (![str getFileSystemRepresentation:buf maxLength:sizeof(buf)]) - return base::FilePath(); - return base::FilePath(buf); -} - -// Returns a filename appropriate for the drop data -// TODO(viettrungluu): Refactor to make it common across platforms, -// and move it somewhere sensible. -base::FilePath GetFileNameFromDragData(const WebDropData& drop_data) { - base::FilePath file_name( - FilePathFromFilename(drop_data.file_description_filename)); - std::string extension = file_name.Extension(); - file_name = file_name.BaseName().RemoveExtension(); - - // Images without ALT text will only have a file extension so we need to - // synthesize one from the provided extension and URL. - if (file_name.empty()) { - // Retrieve the name from the URL. - string16 suggested_filename = - net::GetSuggestedFilename(drop_data.url, "", "", "", "", ""); - file_name = FilePathFromFilename(suggested_filename); - } - - return file_name.ReplaceExtension(extension); -} - -// This helper's sole task is to write out data for a promised file; the caller -// is responsible for opening the file. It takes the drop data and an open file -// stream. -void PromiseWriterHelper(const WebDropData& drop_data, - scoped_ptr file_stream) { - DCHECK(file_stream); - file_stream->WriteSync(drop_data.file_contents.data(), - drop_data.file_contents.length()); -} - -} // namespace - - -@interface WebDragSource(Private) - -- (void)fillPasteboard; - -@end // @interface WebDragSource(Private) - - -@implementation WebDragSource - -- (id)initWithWebView:(BrowserWebView*)view - dropData:(const WebDropData*)dropData - image:(NSImage*)image - offset:(NSPoint)offset - pasteboard:(NSPasteboard*)pboard - dragOperationMask:(NSDragOperation)dragOperationMask { - if ((self = [super init])) { - view_ = view; - DCHECK(view_); - - dropData_.reset(new WebDropData(*dropData)); - DCHECK(dropData_.get()); - - if (image == nil) { - // No drag image was provided so create one. - base::FilePath path = _Context->GetResourcesFilePath(); - path = path.AppendASCII("urlIcon.png"); - image = [[NSImage alloc] - initWithContentsOfFile:SysUTF8ToNSString(path.value())]; - } - - dragImage_.reset([image retain]); - imageOffset_ = offset; - - pasteboard_.reset([pboard retain]); - DCHECK(pasteboard_.get()); - - dragOperationMask_ = dragOperationMask; - - fileExtension_ = nil; - - [self fillPasteboard]; - } - - return self; -} - -- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal { - return dragOperationMask_; -} - -- (void)lazyWriteToPasteboard:(NSPasteboard*)pboard forType:(NSString*)type { - // NSHTMLPboardType requires the character set to be declared. Otherwise, it - // assumes US-ASCII. Awesome. - static const string16 kHtmlHeader = - ASCIIToUTF16(""); - - // Be extra paranoid; avoid crashing. - if (!dropData_.get()) { - NOTREACHED() << "No drag-and-drop data available for lazy write."; - return; - } - - // HTML. - if ([type isEqualToString:NSHTMLPboardType]) { - DCHECK(!dropData_->html.is_null() && !dropData_->html.string().empty()); - // See comment on |kHtmlHeader| above. - [pboard setString:SysUTF16ToNSString(kHtmlHeader + dropData_->html.string()) - forType:NSHTMLPboardType]; - - // URL. - } else if ([type isEqualToString:NSURLPboardType]) { - DCHECK(dropData_->url.is_valid()); - NSString* urlStr = SysUTF8ToNSString(dropData_->url.spec()); - NSURL* url = [NSURL URLWithString:urlStr]; - // If NSURL creation failed, check for a badly-escaped javascript URL. - if (!url && urlStr && dropData_->url.SchemeIs("javascript")) { - NSString *escapedStr = - [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - url = [NSURL URLWithString:escapedStr]; - } - [url writeToPasteboard:pboard]; - // URL title. - } else if ([type isEqualToString:kNSURLTitlePboardType]) { - [pboard setString:SysUTF16ToNSString(dropData_->url_title) - forType:kNSURLTitlePboardType]; - - // File contents. - } else if ([type isEqualToString:NSFileContentsPboardType] || - (fileExtension_ && - [type isEqualToString:NSCreateFileContentsPboardType(fileExtension_)])) { - // TODO(viettrungluu: find something which is known to accept - // NSFileContentsPboardType to check that this actually works! - scoped_nsobject file_wrapper( - [[NSFileWrapper alloc] initRegularFileWithContents:[NSData - dataWithBytes:dropData_->file_contents.data() - length:dropData_->file_contents.length()]]); - [file_wrapper setPreferredFilename:SysUTF8ToNSString( - GetFileNameFromDragData(*dropData_).value())]; - [pboard writeFileWrapper:file_wrapper]; - - // TIFF. - } else if ([type isEqualToString:NSTIFFPboardType]) { - // TODO(viettrungluu): This is a bit odd since we rely on Cocoa to render - // our image into a TIFF. This is also suboptimal since this is all done - // synchronously. I'm not sure there's much we can easily do about it. - scoped_nsobject image( - [[NSImage alloc] initWithData:[NSData - dataWithBytes:dropData_->file_contents.data() - length:dropData_->file_contents.length()]]); - [pboard setData:[image TIFFRepresentation] forType:NSTIFFPboardType]; - - // Plain text. - } else if ([type isEqualToString:NSStringPboardType]) { - DCHECK(!dropData_->text.is_null() && !dropData_->text.string().empty()); - [pboard setString:SysUTF16ToNSString(dropData_->text.string()) - forType:NSStringPboardType]; - - // Oops! - } else { - NOTREACHED() << "Asked for a drag pasteboard type we didn't offer."; - } -} - -- (NSPoint)convertScreenPoint:(NSPoint)screenPoint { - NSPoint basePoint = [[view_ window] convertScreenToBase:screenPoint]; - return [view_ convertPoint:basePoint fromView:nil]; -} - -- (void)startDrag { - NSEvent* currentEvent = [NSApp currentEvent]; - - // Synthesize an event for dragging, since we can't be sure that - // [NSApp currentEvent] will return a valid dragging event. - NSWindow* window = [view_ window]; - NSPoint position = [window mouseLocationOutsideOfEventStream]; - NSTimeInterval eventTime = [currentEvent timestamp]; - NSEvent* dragEvent = [NSEvent mouseEventWithType:NSLeftMouseDragged - location:position - modifierFlags:NSLeftMouseDraggedMask - timestamp:eventTime - windowNumber:[window windowNumber] - context:nil - eventNumber:0 - clickCount:1 - pressure:1.0]; - - if (dragImage_) { - position.x -= imageOffset_.x; - // Deal with Cocoa's flipped coordinate system. - position.y -= [dragImage_.get() size].height - imageOffset_.y; - } - - // Per kwebster, offset arg is ignored, see -_web_DragImageForElement: in - // third_party/WebKit/Source/WebKit/mac/Misc/WebNSViewExtras.m. - [window dragImage:dragImage_ - at:position - offset:NSZeroSize - event:dragEvent - pasteboard:pasteboard_ - source:view_ - slideBack:YES]; -} - -- (void)endDragAt:(NSPoint)screenPoint - operation:(NSDragOperation)operation { - // Convert |screenPoint| to view coordinates and flip it. - NSWindow* window = [view_ window]; - NSPoint localPoint = [self convertScreenPoint:screenPoint]; - NSRect viewFrame = [window frame]; - localPoint.y = viewFrame.size.height - localPoint.y; - // Flip |screenPoint|. - NSRect screenFrame = [[window screen] frame]; - screenPoint.y = screenFrame.size.height - screenPoint.y; - - // If AppKit returns a copy and move operation, mask off the move bit - // because WebCore does not understand what it means to do both, which - // results in an assertion failure/renderer crash. - if (operation == (NSDragOperationMove | NSDragOperationCopy)) - operation &= ~NSDragOperationMove; - - WebView* webview = view_.browser->UIT_GetWebView(); - - gfx::Point client(localPoint.x, localPoint.y); - gfx::Point screen(screenPoint.x, screenPoint.y); - webview->dragSourceEndedAt(client, screen, - static_cast(operation)); - - // Make sure the pasteboard owner isn't us. - [pasteboard_ declareTypes:[NSArray array] owner:nil]; - - webview->dragSourceSystemDragEnded(); -} - -- (void)moveDragTo:(NSPoint)screenPoint { - // Convert |screenPoint| to view coordinates and flip it. - NSWindow* window = [view_ window]; - NSPoint localPoint = [self convertScreenPoint:screenPoint]; - NSRect viewFrame = [window frame]; - localPoint.y = viewFrame.size.height - localPoint.y; - // Flip |screenPoint|. - NSRect screenFrame = [[window screen] frame]; - screenPoint.y = screenFrame.size.height - screenPoint.y; - - WebView* webview = view_.browser->UIT_GetWebView(); - - gfx::Point client(localPoint.x, localPoint.y); - gfx::Point screen(screenPoint.x, screenPoint.y); - webview->dragSourceMovedTo(client, screen, WebDragOperationNone); -} - -- (NSString*)dragPromisedFileTo:(NSString*)path { - // Be extra paranoid; avoid crashing. - if (!dropData_.get()) { - NOTREACHED() << "No drag-and-drop data available for promised file."; - return nil; - } - - base::FilePath fileName = downloadFileName_.empty() ? - GetFileNameFromDragData(*dropData_) : downloadFileName_; - base::FilePath filePath(SysNSStringToUTF8(path)); - filePath = filePath.Append(fileName); - - // CreateFileStreamForDrop() will call file_util::PathExists(), - // which is blocking. Since this operation is already blocking the - // UI thread on OSX, it should be reasonable to let it happen. - base::ThreadRestrictions::ScopedAllowIO allowIO; - scoped_ptr fileStream( - drag_download_util::CreateFileStreamForDrop(&filePath)); - if (!fileStream.get()) - return nil; - - if (downloadURL_.is_valid()) { - WebView* webview = view_.browser->UIT_GetWebView(); - const GURL& page_url = webview->mainFrame()->document().url(); - const std::string& page_encoding = - webview->mainFrame()->document().encoding().utf8(); - - scoped_refptr dragFileDownloader(new DragDownloadFile( - filePath, - fileStream.Pass(), - downloadURL_, - page_url, - page_encoding, - view_.browser->UIT_GetWebViewDelegate())); - - // The finalizer will take care of closing and deletion. - dragFileDownloader->Start( - new drag_download_util::PromiseFileFinalizer(dragFileDownloader)); - } else { - // The writer will take care of closing and deletion. - CefThread::PostTask(CefThread::FILE, FROM_HERE, - base::Bind(PromiseWriterHelper, *dropData_, - base::Passed(fileStream.Pass()))); - } - - // Once we've created the file, we should return the file name. - return SysUTF8ToNSString(filePath.BaseName().value()); - - return nil; -} - -@end // @implementation WebDragSource - - -@implementation WebDragSource (Private) - -- (void)fillPasteboard { - DCHECK(pasteboard_.get()); - - [pasteboard_ declareTypes:[NSArray array] owner:view_]; - - // HTML. - if (!dropData_->html.is_null() && !dropData_->html.string().empty()) - [pasteboard_ addTypes:[NSArray arrayWithObject:NSHTMLPboardType] - owner:view_]; - - // URL (and title). - if (dropData_->url.is_valid()) - [pasteboard_ addTypes:[NSArray arrayWithObjects:NSURLPboardType, - kNSURLTitlePboardType, nil] - owner:view_]; - - std::string fileExtension; - - // File. - if (!dropData_->file_contents.empty() || - !dropData_->download_metadata.empty()) { - if (dropData_->download_metadata.empty()) { - fileExtension = GetFileNameFromDragData(*dropData_).Extension(); - } else { - string16 mimeType; - base::FilePath fileName; - if (drag_download_util::ParseDownloadMetadata( - dropData_->download_metadata, - &mimeType, - &fileName, - &downloadURL_)) { - download_util::GenerateFileName( - downloadURL_, - std::string(), - std::string(), - UTF16ToUTF8(mimeType), - fileName.value(), - &downloadFileName_); - fileExtension = downloadFileName_.Extension(); - } - } - - if (!fileExtension.empty()) { - // Strip the leading dot. - fileExtension_ = SysUTF8ToNSString(fileExtension.substr(1)); - // File contents (with and without specific type), and file (HFS) promise. - // TODO(viettrungluu): others? - NSArray* types = [NSArray arrayWithObjects: - NSFileContentsPboardType, - NSCreateFileContentsPboardType(fileExtension_), - NSFilesPromisePboardType, - nil]; - [pasteboard_ addTypes:types owner:view_]; - - if (!dropData_->file_contents.empty()) { - [pasteboard_ addTypes:[NSArray arrayWithObject:NSTIFFPboardType] - owner:view_]; - } - - // For the file promise, we need to specify the extension. - [pasteboard_ setPropertyList:[NSArray arrayWithObject:fileExtension_] - forType:NSFilesPromisePboardType]; - } - } - - // Plain text. - if (!dropData_->text.is_null() && !dropData_->text.string().empty()) - [pasteboard_ addTypes:[NSArray arrayWithObject:NSStringPboardType] - owner:view_]; -} - -@end // @implementation WebDragSource (Private) diff --git a/cef1/libcef/web_drag_source_win.cc b/cef1/libcef/web_drag_source_win.cc deleted file mode 100644 index 4c7a96c0d..000000000 --- a/cef1/libcef/web_drag_source_win.cc +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions 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. - -#include "libcef/web_drag_source_win.h" -#include "libcef/web_drag_utils_win.h" -#include "libcef/cef_thread.h" - -#include "base/bind.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebPoint.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" - -using WebKit::WebDragOperationNone; -using WebKit::WebPoint; -using WebKit::WebView; - -namespace { - -static void GetCursorPositions(gfx::NativeWindow wnd, gfx::Point* client, - gfx::Point* screen) { - POINT cursor_pos; - GetCursorPos(&cursor_pos); - screen->SetPoint(cursor_pos.x, cursor_pos.y); - ScreenToClient(wnd, &cursor_pos); - client->SetPoint(cursor_pos.x, cursor_pos.y); -} - -} // namespace - -/////////////////////////////////////////////////////////////////////////////// -// WebDragSource, public: - -WebDragSource::WebDragSource(gfx::NativeWindow source_wnd, WebView* view) - : ui::DragSourceWin(), - source_wnd_(source_wnd), - view_(view), - effect_(DROPEFFECT_NONE) { -} - -WebDragSource::~WebDragSource() { -} - -void WebDragSource::OnDragSourceCancel() { - // Delegate to the UI thread if we do drag-and-drop in the background thread. - if (!CefThread::CurrentlyOn(CefThread::UI)) { - CefThread::PostTask( - CefThread::UI, FROM_HERE, - base::Bind(&WebDragSource::OnDragSourceCancel, this)); - return; - } - - if (!view_) - return; - - gfx::Point client; - gfx::Point screen; - GetCursorPositions(source_wnd_, &client, &screen); - view_->dragSourceEndedAt(client, screen, WebDragOperationNone); -} - -void WebDragSource::OnDragSourceDrop() { - // On Windows, we check for drag end in IDropSource::QueryContinueDrag which - // happens before IDropTarget::Drop is called. HTML5 requires the "dragend" - // event to happen after the "drop" event. Since Windows calls these two - // directly after each other we can just post a task to handle the - // OnDragSourceDrop after the current task. - CefThread::PostTask( - CefThread::UI, FROM_HERE, - base::Bind(&WebDragSource::DelayedOnDragSourceDrop, this)); -} - -void WebDragSource::DelayedOnDragSourceDrop() { - if (!view_) - return; - - gfx::Point client; - gfx::Point screen; - GetCursorPositions(source_wnd_, &client, &screen); - view_->dragSourceEndedAt(client, screen, - web_drag_utils_win::WinDragOpToWebDragOp(effect_)); -} - -void WebDragSource::OnDragSourceMove() { - // Delegate to the UI thread if we do drag-and-drop in the background thread. - if (!CefThread::CurrentlyOn(CefThread::UI)) { - CefThread::PostTask( - CefThread::UI, FROM_HERE, - base::Bind(&WebDragSource::OnDragSourceMove, this)); - return; - } - - if (!view_) - return; - - gfx::Point client; - gfx::Point screen; - GetCursorPositions(source_wnd_, &client, &screen); - view_->dragSourceMovedTo(client, screen, WebDragOperationNone); -} diff --git a/cef1/libcef/web_drag_source_win.h b/cef1/libcef/web_drag_source_win.h deleted file mode 100644 index c7b485746..000000000 --- a/cef1/libcef/web_drag_source_win.h +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions 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. - -#ifndef CEF_LIBCEF_WEB_DRAG_SOURCE_WIN_H_ -#define CEF_LIBCEF_WEB_DRAG_SOURCE_WIN_H_ -#pragma once - -#include "base/basictypes.h" -#include "ui/base/dragdrop/drag_source_win.h" -#include "ui/gfx/native_widget_types.h" -#include "ui/gfx/point.h" - -namespace WebKit { -class WebView; -}; - -// An IDropSource implementation for a WebView. Handles notifications sent -// by an active drag-drop operation as the user mouses over other drop targets -// on their system. This object tells Windows whether or not the drag should -// continue, and supplies the appropriate cursors. -class WebDragSource : public ui::DragSourceWin { - public: - // Create a new DragSource for a given HWND and WebView. - WebDragSource(gfx::NativeWindow source_wnd, WebKit::WebView* view); - virtual ~WebDragSource(); - - void set_effect(DWORD effect) { effect_ = effect; } - - protected: - // ui::DragSource - virtual void OnDragSourceCancel(); - virtual void OnDragSourceDrop(); - virtual void OnDragSourceMove(); - - private: - // Cannot construct thusly. - WebDragSource(); - - // OnDragSourceDrop schedules its main work to be done after IDropTarget::Drop - // by posting a task to this function. - void DelayedOnDragSourceDrop(); - - // Keep a reference to the window so we can translate the cursor position. - gfx::NativeWindow source_wnd_; - - // We use this as a channel to the web view to tell it about various drag - // drop events that it needs to know about (such as when a drag operation it - // initiated terminates). - WebKit::WebView* view_; - - DWORD effect_; - - DISALLOW_COPY_AND_ASSIGN(WebDragSource); -}; - -#endif // CEF_LIBCEF_WEB_DRAG_SOURCE_WIN_H_ diff --git a/cef1/libcef/web_drag_utils_gtk.cc b/cef1/libcef/web_drag_utils_gtk.cc deleted file mode 100644 index 3b7a8af41..000000000 --- a/cef1/libcef/web_drag_utils_gtk.cc +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. -// Portions 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 "libcef/web_drag_utils_gtk.h" - -using WebKit::WebDragOperationsMask; -using WebKit::WebDragOperation; -using WebKit::WebDragOperationNone; -using WebKit::WebDragOperationCopy; -using WebKit::WebDragOperationLink; -using WebKit::WebDragOperationMove; - -namespace web_drag_utils_gtk { - -// From content/browser/web_contents/drag_utils_gtk.cc. - -GdkDragAction WebDragOpToGdkDragAction(WebDragOperationsMask op) { - GdkDragAction action = static_cast(0); - if (op & WebDragOperationCopy) - action = static_cast(action | GDK_ACTION_COPY); - if (op & WebDragOperationLink) - action = static_cast(action | GDK_ACTION_LINK); - if (op & WebDragOperationMove) - action = static_cast(action | GDK_ACTION_MOVE); - return action; -} - -WebDragOperationsMask GdkDragActionToWebDragOp(GdkDragAction action) { - WebDragOperationsMask op = WebDragOperationNone; - if (action & GDK_ACTION_COPY) - op = static_cast(op | WebDragOperationCopy); - if (action & GDK_ACTION_LINK) - op = static_cast(op | WebDragOperationLink); - if (action & GDK_ACTION_MOVE) - op = static_cast(op | WebDragOperationMove); - return op; -} - -} // namespace web_drag_utils_gtk - diff --git a/cef1/libcef/web_drag_utils_gtk.h b/cef1/libcef/web_drag_utils_gtk.h deleted file mode 100644 index e3dbbc7a1..000000000 --- a/cef1/libcef/web_drag_utils_gtk.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. -// Portions 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. - -#ifndef CEF_LIBCEF_WEB_DRAG_UTILS_GTK_H_ -#define CEF_LIBCEF_WEB_DRAG_UTILS_GTK_H_ -#pragma once - -#include -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h" - -namespace web_drag_utils_gtk { - -// Convenience methods for converting between web drag operations and the GDK -// equivalent. -GdkDragAction WebDragOpToGdkDragAction(WebKit::WebDragOperationsMask op); -WebKit::WebDragOperationsMask GdkDragActionToWebDragOp(GdkDragAction action); - -} // namespace web_drag_utils_gtk - -#endif // CEF_LIBCEF_WEB_DRAG_UTILS_GTK_H_ - diff --git a/cef1/libcef/web_drag_utils_mac.h b/cef1/libcef/web_drag_utils_mac.h deleted file mode 100644 index 3e9daaa80..000000000 --- a/cef1/libcef/web_drag_utils_mac.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_WEB_DRAG_UTILS_MAC_H_ -#define CEF_LIBCEF_WEB_DRAG_UTILS_MAC_H_ -#pragma once - -#import - -#include "base/basictypes.h" -#include "googleurl/src/gurl.h" - -namespace drag_util { - -// Populates the |url| and |title| with URL data in |pboard|. There may be more -// than one, but we only handle dropping the first. |url| must not be |NULL|; -// |title| is an optional parameter. Returns |YES| if URL data was obtained from -// the pasteboard, |NO| otherwise. If |convert_filenames| is |YES|, the function -// will also attempt to convert filenames in |pboard| to file URLs. -BOOL PopulateURLAndTitleFromPasteBoard(GURL* url, - string16* title, - NSPasteboard* pboard, - BOOL convert_filenames); - -// Returns the first file URL from |info|, if there is one. If |info| doesn't -// contain any file URLs, an empty |GURL| is returned. -GURL GetFileURLFromDropData(id info); - -// Determines whether the given drag and drop operation contains content that -// is supported by the web view. In particular, if the content is a local file -// URL, this checks if it is of a type that can be shown in the tab contents. -BOOL IsUnsupportedDropData(id info); - -} // namespace drag_util - -#endif // CEF_LIBCEF_WEB_DRAG_UTILS_MAC_H_ diff --git a/cef1/libcef/web_drag_utils_mac.mm b/cef1/libcef/web_drag_utils_mac.mm deleted file mode 100644 index ac1a54a77..000000000 --- a/cef1/libcef/web_drag_utils_mac.mm +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2011 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 "libcef/browser_webkit_glue.h" -#import "libcef/web_drag_utils_mac.h" - -#include "base/basictypes.h" -#include "base/logging.h" -#include "base/strings/sys_string_conversions.h" -#include "googleurl/src/gurl.h" -#include "net/base/mime_util.h" -#include "net/base/net_util.h" -#import "third_party/mozilla/NSPasteboard+Utils.h" -#include "webkit/plugins/npapi/plugin_list.h" - -namespace drag_util { - -BOOL PopulateURLAndTitleFromPasteBoard(GURL* url, - string16* title, - NSPasteboard* pboard, - BOOL convert_filenames) { - CHECK(url); - - // Bail out early if there's no URL data. - if (![pboard containsURLData]) - return NO; - - // -getURLs:andTitles:convertingFilenames: will already validate URIs so we - // don't need to again. The arrays returned are both of NSStrings. - NSArray* url_array = nil; - NSArray* title_array = nil; - [pboard getURLs:&url_array andTitles:&title_array - convertingFilenames:convert_filenames]; - DCHECK_EQ([url_array count], [title_array count]); - // It's possible that no URLs were actually provided! - if (![url_array count]) - return NO; - NSString* url_string = [url_array objectAtIndex:0]; - if ([url_string length]) { - // Check again just to make sure to not assign NULL into a std::string, - // which throws an exception. - const char* utf8_url = [url_string UTF8String]; - if (utf8_url) { - *url = GURL(utf8_url); - // Extra paranoia check. - if (title && [title_array count]) - *title = base::SysNSStringToUTF16([title_array objectAtIndex:0]); - } - } - return YES; -} - -GURL GetFileURLFromDropData(id info) { - if ([[info draggingPasteboard] containsURLData]) { - GURL url; - PopulateURLAndTitleFromPasteBoard(&url, - NULL, - [info draggingPasteboard], - YES); - - if (url.SchemeIs("file")) - return url; - } - return GURL(); -} - -static BOOL IsSupportedFileURL(const GURL& url) { - base::FilePath full_path; - net::FileURLToFilePath(url, &full_path); - - std::string mime_type; - net::GetMimeTypeFromFile(full_path, &mime_type); - - // This logic mirrors |BufferedResourceHandler::ShouldDownload()|. - // TODO(asvitkine): Refactor this out to a common location instead of - // duplicating code. - if (net::IsSupportedMimeType(mime_type)) - return YES; - - // Check whether there is a plugin that supports the mime type. (e.g. PDF) - bool allow_wildcard = false; - std::vector plugins; - webkit::npapi::PluginList::Singleton()->GetPluginInfoArray( - GURL(), mime_type, allow_wildcard, NULL, &plugins, NULL); - - // If any associated plugins exist and are enabled don't allow the download. - if (!plugins.empty()) { - std::vector::const_iterator it = plugins.begin(); - for (; it != plugins.end(); ++it) { - if (webkit_glue::IsPluginEnabled(*it)) - return YES; - } - } - - return NO; -} - -BOOL IsUnsupportedDropData(id info) { - GURL url = GetFileURLFromDropData(info); - if (!url.is_empty()) { - // If dragging a file, only allow dropping supported file types (that the - // web view can display). - return !IsSupportedFileURL(url); - } - return NO; -} - -} // namespace drag_util diff --git a/cef1/libcef/web_drag_utils_win.cc b/cef1/libcef/web_drag_utils_win.cc deleted file mode 100644 index 2812b7ef0..000000000 --- a/cef1/libcef/web_drag_utils_win.cc +++ /dev/null @@ -1,61 +0,0 @@ -// 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. - -#include "libcef/web_drag_utils_win.h" - -#include -#include "base/logging.h" - -using WebKit::WebDragOperation; -using WebKit::WebDragOperationsMask; -using WebKit::WebDragOperationNone; -using WebKit::WebDragOperationCopy; -using WebKit::WebDragOperationLink; -using WebKit::WebDragOperationMove; -using WebKit::WebDragOperationGeneric; - -namespace web_drag_utils_win { - -WebDragOperation WinDragOpToWebDragOp(DWORD effect) { - DCHECK(effect == DROPEFFECT_NONE || effect == DROPEFFECT_COPY || - effect == DROPEFFECT_LINK || effect == DROPEFFECT_MOVE); - - return WinDragOpMaskToWebDragOpMask(effect); -} - -WebDragOperationsMask WinDragOpMaskToWebDragOpMask(DWORD effects) { - WebDragOperationsMask ops = WebDragOperationNone; - if (effects & DROPEFFECT_COPY) - ops = static_cast(ops | WebDragOperationCopy); - if (effects & DROPEFFECT_LINK) - ops = static_cast(ops | WebDragOperationLink); - if (effects & DROPEFFECT_MOVE) - ops = static_cast(ops | WebDragOperationMove | - WebDragOperationGeneric); - return ops; -} - -DWORD WebDragOpToWinDragOp(WebDragOperation op) { - DCHECK(op == WebDragOperationNone || - op == WebDragOperationCopy || - op == WebDragOperationLink || - op == WebDragOperationMove || - op == (WebDragOperationMove | WebDragOperationGeneric)); - - return WebDragOpMaskToWinDragOpMask(op); -} - -DWORD WebDragOpMaskToWinDragOpMask(WebDragOperationsMask ops) { - DWORD win_ops = DROPEFFECT_NONE; - if (ops & WebDragOperationCopy) - win_ops |= DROPEFFECT_COPY; - if (ops & WebDragOperationLink) - win_ops |= DROPEFFECT_LINK; - if (ops & (WebDragOperationMove | WebDragOperationGeneric)) - win_ops |= DROPEFFECT_MOVE; - return win_ops; -} - -} // namespace web_drag_utils_win - diff --git a/cef1/libcef/web_drag_utils_win.h b/cef1/libcef/web_drag_utils_win.h deleted file mode 100644 index 8fd3e307f..000000000 --- a/cef1/libcef/web_drag_utils_win.h +++ /dev/null @@ -1,22 +0,0 @@ -// 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. - -#ifndef CEF_LIBCEF_WEB_DRAG_UTILS_WIN_H_ -#define CEF_LIBCEF_WEB_DRAG_UTILS_WIN_H_ -#pragma once - -#include -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h" - -namespace web_drag_utils_win { - -WebKit::WebDragOperation WinDragOpToWebDragOp(DWORD effect); -WebKit::WebDragOperationsMask WinDragOpMaskToWebDragOpMask(DWORD effects); - -DWORD WebDragOpToWinDragOp(WebKit::WebDragOperation op); -DWORD WebDragOpMaskToWinDragOpMask(WebKit::WebDragOperationsMask ops); - -} // namespace web_drag_utils_win - -#endif // CEF_LIBCEF_WEB_DRAG_UTILS_WIN_H_ diff --git a/cef1/libcef/web_drop_target_gtk.cc b/cef1/libcef/web_drop_target_gtk.cc deleted file mode 100644 index 30befcb17..000000000 --- a/cef1/libcef/web_drop_target_gtk.cc +++ /dev/null @@ -1,317 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. -// Portions 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 "libcef/web_drop_target_gtk.h" - -#include -#include - -#include "libcef/browser_impl.h" -#include "libcef/cef_context.h" -#include "libcef/drag_data_impl.h" -#include "libcef/web_drag_utils_gtk.h" - -#include "base/utf_string_conversions.h" -#include "base/bind.h" -#include "googleurl/src/gurl.h" -#include "net/base/net_util.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebDragData.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebPoint.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/base/clipboard/custom_data_helper.h" -#include "ui/base/dragdrop/os_exchange_data.h" -#include "ui/base/dragdrop/os_exchange_data_provider_gtk.h" -#include "ui/base/dragdrop/gtk_dnd_util.h" -#include "ui/base/window_open_disposition.h" -#include "ui/base/gtk/gtk_screen_util.h" -#include "webkit/glue/webdropdata.h" - -using WebKit::WebDragOperation; -using WebKit::WebDragOperationNone; -using WebKit::WebDragOperationCopy; -using WebKit::WebDragOperationLink; -using WebKit::WebDragOperationMove; -using WebKit::WebDragOperationGeneric; -using WebKit::WebDragOperationsMask; -using WebKit::WebPoint; -using WebKit::WebView; - -namespace { - -int GetModifierFlags(GtkWidget* widget) { - int modifier_state = 0; - GdkModifierType state; - gdk_window_get_pointer(gtk_widget_get_window(widget), NULL, NULL, &state); - - if (state & GDK_SHIFT_MASK) - modifier_state |= WebKit::WebInputEvent::ShiftKey; - if (state & GDK_CONTROL_MASK) - modifier_state |= WebKit::WebInputEvent::ControlKey; - if (state & GDK_MOD1_MASK) - modifier_state |= WebKit::WebInputEvent::AltKey; - if (state & GDK_META_MASK) - modifier_state |= WebKit::WebInputEvent::MetaKey; - return modifier_state; -} - -WebDragOperationsMask GetOperationsMask(GdkDragContext* context) { - return web_drag_utils_gtk::GdkDragActionToWebDragOp(context->actions); -} - -} // namespace - -WebDropTarget::WebDropTarget(CefBrowserImpl* browser) - : browser_(browser), - context_(NULL), - data_requests_(0), - is_drop_target_(false), - sent_drag_enter_(false), - method_factory_(this) { - widget_ = browser->UIT_GetWebViewHost()->view_handle(); - gtk_drag_dest_set(widget_, static_cast(0), - NULL, 0, - static_cast(GDK_ACTION_COPY | - GDK_ACTION_LINK | - GDK_ACTION_MOVE)); - g_signal_connect(widget_, "drag-motion", - G_CALLBACK(OnDragMotionThunk), this); - g_signal_connect(widget_, "drag-leave", - G_CALLBACK(OnDragLeaveThunk), this); - g_signal_connect(widget_, "drag-drop", - G_CALLBACK(OnDragDropThunk), this); - g_signal_connect(widget_, "drag-data-received", - G_CALLBACK(OnDragDataReceivedThunk), this); - // TODO(tony): Need a drag-data-delete handler for moving content out of - // the WebContents. http://crbug.com/38989 - - destroy_handler_ = g_signal_connect( - widget_, "destroy", G_CALLBACK(gtk_widget_destroyed), &widget_); -} - -WebDropTarget::~WebDropTarget() { - if (widget_) { - gtk_drag_dest_unset(widget_); - g_signal_handler_disconnect(widget_, destroy_handler_); - } -} - -void WebDropTarget::DragLeave() { - getView()->dragTargetDragLeave(); - - drop_data_.reset(); -} - -WebKit::WebView* WebDropTarget::getView() { - return browser_->UIT_GetWebView(); -} - -void WebDropTarget::UpdateDragStatus(WebDragOperation operation, gint time) { - if (context_) { - is_drop_target_ = operation != WebDragOperationNone; - GdkDragAction action = web_drag_utils_gtk::WebDragOpToGdkDragAction(operation); - gdk_drag_status(context_, action, time); - } -} - -gboolean WebDropTarget::OnDragMotion(GtkWidget* sender, - GdkDragContext* context, - gint x, gint y, - guint time) { - if (context_ != context) { - context_ = context; - drop_data_.reset(new WebDropData); - is_drop_target_ = false; - - // text/plain must come before text/uri-list. This is a hack that works in - // conjunction with OnDragDataReceived. Since some file managers populate - // text/plain with file URLs when dragging files, we want to handle - // text/uri-list after text/plain so that the plain text can be cleared if - // it's a file drag. - static int supported_targets[] = { - ui::TEXT_PLAIN, - ui::TEXT_URI_LIST, - ui::TEXT_HTML, - ui::NETSCAPE_URL, - ui::CHROME_NAMED_URL, - // TODO(estade): support image drags? - ui::CUSTOM_DATA, - }; - - data_requests_ = arraysize(supported_targets); - for (size_t i = 0; i < arraysize(supported_targets); ++i) { - gtk_drag_get_data(widget_, context, - ui::GetAtomForTarget(supported_targets[i]), - time); - } - } else if (data_requests_ == 0) { - WebDragOperation operation = getView()->dragTargetDragOver( - ui::ClientPoint(widget_), - ui::ScreenPoint(widget_), - GetOperationsMask(context), - GetModifierFlags(widget_)); - - UpdateDragStatus(operation, time); - } - - return TRUE; -} - -void WebDropTarget::OnDragDataReceived( - GtkWidget* sender, GdkDragContext* context, gint x, gint y, - GtkSelectionData* data, guint info, guint time) { - // We might get the data from an old get_data() request that we no longer - // care about. - if (context != context_) - return; - - data_requests_--; - - // Decode the data. - gint data_length = gtk_selection_data_get_length(data); - const guchar* raw_data = gtk_selection_data_get_data(data); - GdkAtom target = gtk_selection_data_get_target(data); - if (raw_data && data_length > 0) { - // If the source can't provide us with valid data for a requested target, - // raw_data will be NULL. - if (target == ui::GetAtomForTarget(ui::TEXT_PLAIN)) { - guchar* text = gtk_selection_data_get_text(data); - if (text) { - drop_data_->text = NullableString16( - UTF8ToUTF16(std::string(reinterpret_cast(text))), - false); - g_free(text); - } - } else if (target == ui::GetAtomForTarget(ui::TEXT_URI_LIST)) { - gchar** uris = gtk_selection_data_get_uris(data); - if (uris) { - drop_data_->url = GURL(); - for (gchar** uri_iter = uris; *uri_iter; uri_iter++) { - // Most file managers populate text/uri-list with file URLs when - // dragging files. To avoid exposing file system paths to web content, - // file URLs are never set as the URL content for the drop. - // TODO(estade): Can the filenames have a non-UTF8 encoding? - GURL url(*uri_iter); - base::FilePath file_path; - if (url.SchemeIs("file") && - net::FileURLToFilePath(url, &file_path)) { - drop_data_->filenames.push_back( - WebDropData::FileInfo(UTF8ToUTF16(file_path.value()), - string16())); - // This is a hack. Some file managers also populate text/plain with - // a file URL when dragging files, so we clear it to avoid exposing - // it to the web content. - drop_data_->text = NullableString16(true); - } else if (!drop_data_->url.is_valid()) { - // Also set the first non-file URL as the URL content for the drop. - drop_data_->url = url; - } - } - g_strfreev(uris); - } - } else if (target == ui::GetAtomForTarget(ui::TEXT_HTML)) { - // TODO(estade): Can the html have a non-UTF8 encoding? - drop_data_->html = NullableString16( - UTF8ToUTF16(std::string(reinterpret_cast(raw_data), - data_length)), - false); - // We leave the base URL empty. - } else if (target == ui::GetAtomForTarget(ui::NETSCAPE_URL)) { - std::string netscape_url(reinterpret_cast(raw_data), - data_length); - size_t split = netscape_url.find_first_of('\n'); - if (split != std::string::npos) { - drop_data_->url = GURL(netscape_url.substr(0, split)); - if (split < netscape_url.size() - 1) - drop_data_->url_title = UTF8ToUTF16(netscape_url.substr(split + 1)); - } - } else if (target == ui::GetAtomForTarget(ui::CHROME_NAMED_URL)) { - ui::ExtractNamedURL(data, &drop_data_->url, &drop_data_->url_title); - } else if (target == ui::GetAtomForTarget(ui::CUSTOM_DATA)) { - ui::ReadCustomDataIntoMap( - raw_data, data_length, &drop_data_->custom_data); - } - } - - if (data_requests_ == 0) { - WebDragOperation operation = WebDragOperationNone; - bool handled = false; - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetDragHandler(); - if (handler.get()) { - CefRefPtr data(new CefDragDataImpl(*drop_data_.get())); - handled = handler->OnDragEnter( - browser_, data, - static_cast( - GetOperationsMask(context))); - } - } - - sent_drag_enter_ = !handled; - if (!handled) { - // Tell the renderer about the drag. - // |x| and |y| are seemingly arbitrary at this point. - operation = getView()->dragTargetDragEnter( - drop_data_->ToDragData(), - ui::ClientPoint(widget_), - ui::ScreenPoint(widget_), - GetOperationsMask(context), - GetModifierFlags(widget_)); - } - - UpdateDragStatus(operation, time); - } -} - -// The drag has left our widget; forward this information to the renderer. -void WebDropTarget::OnDragLeave(GtkWidget* sender, GdkDragContext* context, - guint time) { - // Set |context_| to NULL to make sure we will recognize the next DragMotion - // as an enter. - context_ = NULL; - - // Don't send the drag leave event if we didn't send a drag enter event. - if (!sent_drag_enter_) - return; - - // Sometimes we get a drag-leave event before getting a drag-data-received - // event. In that case, we don't want to bother the renderer with a - // DragLeave event. - if (data_requests_ != 0) - return; - - // When GTK sends us a drag-drop signal, it is shortly (and synchronously) - // preceded by a drag-leave. The renderer doesn't like getting the signals - // in this order so delay telling it about the drag-leave till we are sure - // we are not getting a drop as well. - base::MessageLoop::current()->PostTask(FROM_HERE, - base::Bind(&WebDropTarget::DragLeave, method_factory_.GetWeakPtr())); -} - -// Called by GTK when the user releases the mouse, executing a drop. -gboolean WebDropTarget::OnDragDrop(GtkWidget* sender, GdkDragContext* context, - gint x, gint y, guint time) { - // Cancel that drag leave! - method_factory_.InvalidateWeakPtrs(); - - browser_->set_is_dropping(true); - - if (getView()) { - getView()->dragTargetDrop(ui::ClientPoint(widget_), - ui::ScreenPoint(widget_), - GetModifierFlags(widget_)); - } - - browser_->set_is_dropping(false); - - // The second parameter is just an educated guess as to whether or not the - // drag succeeded, but at least we will get the drag-end animation right - // sometimes. - gtk_drag_finish(context, is_drop_target_, FALSE, time); - - return TRUE; -} - diff --git a/cef1/libcef/web_drop_target_gtk.h b/cef1/libcef/web_drop_target_gtk.h deleted file mode 100644 index 72d98f8ab..000000000 --- a/cef1/libcef/web_drop_target_gtk.h +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. -// Portions 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. - -#ifndef CEF_LIBCEF_WEB_DROP_TARGET_GTK_H_ -#define CEF_LIBCEF_WEB_DROP_TARGET_GTK_H_ - -#include -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h" -#include "ui/base/gtk/gtk_signal.h" - -class BrowserWebViewDelegate; -class CefBrowserImpl; -class WebDropData; - -namespace WebKit { -class WebView; -} - -class WebDropTarget : public base::RefCounted { - public: - explicit WebDropTarget(CefBrowserImpl* browser); - virtual ~WebDropTarget(); - - // Informs the renderer when a system drag has left the render view. - void DragLeave(); - - private: - WebKit::WebView* getView(); - - // This is called when the renderer responds to a drag motion event. We must - // update the system drag cursor. - void UpdateDragStatus(WebKit::WebDragOperation operation, gint time); - - // Called when a system drag crosses over the render view. As there is no drag - // enter event, we treat it as an enter event (and not a regular motion event) - // when |context_| is NULL. - CHROMEGTK_CALLBACK_4(WebDropTarget, gboolean, OnDragMotion, GdkDragContext*, - gint, gint, guint); - - // We make a series of requests for the drag data when the drag first enters - // the render view. This is the callback that is used to give us the data - // for each individual target. When |data_requests_| reaches 0, we know we - // have attained all the data, and we can finally tell the renderer about the - // drag. - CHROMEGTK_CALLBACK_6(WebDropTarget, void, OnDragDataReceived, - GdkDragContext*, gint, gint, GtkSelectionData*, - guint, guint); - - // The drag has left our widget; forward this information to the renderer. - CHROMEGTK_CALLBACK_2(WebDropTarget, void, OnDragLeave, GdkDragContext*, - guint); - - // Called by GTK when the user releases the mouse, executing a drop. - CHROMEGTK_CALLBACK_4(WebDropTarget, gboolean, OnDragDrop, GdkDragContext*, - gint, gint, guint); - - CefBrowserImpl* browser_; - - // The render view. - GtkWidget* widget_; - - // The current drag context for system drags over our render view, or NULL if - // there is no system drag or the system drag is not over our render view. - GdkDragContext* context_; - - // The data for the current drag, or NULL if |context_| is NULL. - scoped_ptr drop_data_; - - // The number of outstanding drag data requests we have sent to the drag - // source. - int data_requests_; - - // Whether the cursor is over a drop target, according to the last message we - // got from the renderer. - bool is_drop_target_; - - // Handler ID for the destroy signal handler. We connect to the destroy - // signal handler so that we won't call dest_unset on it after it is - // destroyed, but we have to cancel the handler if we are destroyed before - // |widget_| is. - int destroy_handler_; - - // Whether the drag enter event was sent to the renderer. - bool sent_drag_enter_; - - base::WeakPtrFactory method_factory_; -}; - -#endif // CEF_LIBCEF_WEB_DROP_TARGET_GTK_H_ - diff --git a/cef1/libcef/web_drop_target_mac.h b/cef1/libcef/web_drop_target_mac.h deleted file mode 100644 index acfe102e1..000000000 --- a/cef1/libcef/web_drop_target_mac.h +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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. - -#ifndef CEF_LIBCEF_WEB_DROP_TARGET_MAC_H_ -#define CEF_LIBCEF_WEB_DROP_TARGET_MAC_H_ -#pragma once - -#import - -#include "base/string16.h" - -class GURL; -struct WebDropData; -@class BrowserWebView; -class WebViewHost; - -// A class that handles tracking and event processing for a drag and drop -// over the content area. Assumes something else initiates the drag, this is -// only for processing during a drag. - -@interface WebDropTarget : NSObject { - @private - // Our associated WebView. Weak reference. - BrowserWebView* view_; - - // Keep track of the WebViewHost we're dragging over. If it changes during a - // drag, we need to re-send the DragEnter message. - WebViewHost* current_wvh_; - - // True if the drag has been canceled. - bool canceled_; -} - -// |view| is the WebView representing this browser window, used to communicate -// drag&drop messages to WebCore and handle navigation on a successful drop -// (if necessary). -- (id)initWithWebView:(BrowserWebView*)view; - -// Messages to send during the tracking of a drag, ususally upon receiving -// calls from the view system. Communicates the drag messages to WebCore. -- (NSDragOperation)draggingEntered:(id)info - view:(NSView*)view; -- (void)draggingExited:(id)info; -- (NSDragOperation)draggingUpdated:(id)info - view:(NSView*)view; -- (BOOL)performDragOperation:(id)info - view:(NSView*)view; - -@end - -// Public use only for unit tests. -@interface WebDropTarget(Testing) -// Given |data|, which should not be nil, fill it in using the contents of the -// given pasteboard. -- (void)populateWebDropData:(WebDropData*)data - fromPasteboard:(NSPasteboard*)pboard; -// Given a point in window coordinates and a view in that window, return a -// flipped point in the coordinate system of |view|. -- (NSPoint)flipWindowPointToView:(const NSPoint&)windowPoint - view:(NSView*)view; -// Given a point in window coordinates and a view in that window, return a -// flipped point in screen coordinates. -- (NSPoint)flipWindowPointToScreen:(const NSPoint&)windowPoint - view:(NSView*)view; -@end - -#endif // CEF_LIBCEF_WEB_DROP_TARGET_MAC_H_ diff --git a/cef1/libcef/web_drop_target_mac.mm b/cef1/libcef/web_drop_target_mac.mm deleted file mode 100644 index c587dca9d..000000000 --- a/cef1/libcef/web_drop_target_mac.mm +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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 "libcef/browser_impl.h" -#import "libcef/browser_webview_mac.h" -#include "libcef/cef_context.h" -#include "libcef/drag_data_impl.h" -#import "libcef/web_drop_target_mac.h" -#import "libcef/web_drag_utils_mac.h" - -#include "base/logging.h" -#include "base/strings/sys_string_conversions.h" -#import "third_party/mozilla/NSPasteboard+Utils.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebDragData.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebPoint.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/base/window_open_disposition.h" -#include "webkit/glue/webdropdata.h" - -using WebKit::WebDragOperation; -using WebKit::WebDragOperationsMask; -using WebKit::WebPoint; -using WebKit::WebView; - -@implementation WebDropTarget - -// |view| is the WebView representing this browser window, used to communicate -// drag&drop messages to WebCore and handle navigation on a successful drop -// (if necessary). -- (id)initWithWebView:(BrowserWebView*)view { - if ((self = [super init])) { - view_ = view; - canceled_ = false; - } - return self; -} - -// Given a point in window coordinates and a view in that window, return a -// flipped point in the coordinate system of |view|. -- (NSPoint)flipWindowPointToView:(const NSPoint&)windowPoint - view:(NSView*)view { - DCHECK(view); - NSPoint viewPoint = [view convertPoint:windowPoint fromView:nil]; - NSRect viewFrame = [view frame]; - viewPoint.y = viewFrame.size.height - viewPoint.y; - return viewPoint; -} - -// Given a point in window coordinates and a view in that window, return a -// flipped point in screen coordinates. -- (NSPoint)flipWindowPointToScreen:(const NSPoint&)windowPoint - view:(NSView*)view { - DCHECK(view); - NSPoint screenPoint = [[view window] convertBaseToScreen:windowPoint]; - NSScreen* screen = [[view window] screen]; - NSRect screenFrame = [screen frame]; - screenPoint.y = screenFrame.size.height - screenPoint.y; - return screenPoint; -} - -// Return YES if the drop site only allows drops that would navigate. If this -// is the case, we don't want to pass messages to the renderer because there's -// really no point (i.e., there's nothing that cares about the mouse position or -// entering and exiting). One example is an interstitial page (e.g., safe -// browsing warning). -- (BOOL)onlyAllowsNavigation { - return false; -} - -// Messages to send during the tracking of a drag, usually upon receiving -// calls from the view system. Communicates the drag messages to WebCore. - -- (NSDragOperation)draggingEntered:(id)info - view:(NSView*)view { - // Save off the current WebViewHost so we can tell if it changes during a - // drag. If it does, we need to send a new enter message in draggingUpdated:. - current_wvh_ = _Context->current_webviewhost(); - DCHECK(current_wvh_); - - if ([self onlyAllowsNavigation]) { - if ([[info draggingPasteboard] containsURLData]) - return NSDragOperationCopy; - return NSDragOperationNone; - } - - WebView* webview = view_.browser->UIT_GetWebView(); - - // Fill out a WebDropData from pasteboard. - WebDropData drop_data; - [self populateWebDropData:&drop_data - fromPasteboard:[info draggingPasteboard]]; - - NSDragOperation mask = [info draggingSourceOperationMask]; - - canceled_ = false; - - CefRefPtr client = view_.browser->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetDragHandler(); - if (handler.get()) { - CefRefPtr data(new CefDragDataImpl(drop_data)); - if (handler->OnDragEnter(view_.browser, data, - static_cast(mask))) { - canceled_ = true; - return NSDragOperationNone; - } - } - } - - // Create the appropriate mouse locations for WebCore. The draggingLocation - // is in window coordinates. Both need to be flipped. - NSPoint windowPoint = [info draggingLocation]; - NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; - NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; - WebDragOperation op = - webview->dragTargetDragEnter(drop_data.ToDragData(), - WebPoint(viewPoint.x, viewPoint.y), - WebPoint(screenPoint.x, screenPoint.y), - static_cast(mask), - 0); - return static_cast(op); -} - -- (void)draggingExited:(id)info { - DCHECK(current_wvh_); - if (current_wvh_ != _Context->current_webviewhost()) - return; - - if (canceled_) - return; - - WebView* webview = view_.browser->UIT_GetWebView(); - - // Nothing to do in the interstitial case. - - webview->dragTargetDragLeave(); -} - -- (NSDragOperation)draggingUpdated:(id)info - view:(NSView*)view { - DCHECK(current_wvh_); - if (current_wvh_ != _Context->current_webviewhost()) - [self draggingEntered:info view:view]; - - if ([self onlyAllowsNavigation]) { - if ([[info draggingPasteboard] containsURLData]) - return NSDragOperationCopy; - return NSDragOperationNone; - } - - if (canceled_) - return NSDragOperationNone; - - WebView* webview = view_.browser->UIT_GetWebView(); - - // Create the appropriate mouse locations for WebCore. The draggingLocation - // is in window coordinates. - NSPoint windowPoint = [info draggingLocation]; - NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; - NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; - NSDragOperation mask = [info draggingSourceOperationMask]; - WebDragOperation op = - webview->dragTargetDragOver(WebPoint(viewPoint.x, viewPoint.y), - WebPoint(screenPoint.x, screenPoint.y), - static_cast(mask), - 0); - return static_cast(op); -} - -- (BOOL)performDragOperation:(id)info - view:(NSView*)view { - DCHECK(current_wvh_); - if (current_wvh_ != _Context->current_webviewhost()) - [self draggingEntered:info view:view]; - - // Check if we only allow navigation and navigate to a url on the pasteboard. - if ([self onlyAllowsNavigation]) { - NSPasteboard* pboard = [info draggingPasteboard]; - if ([pboard containsURLData]) { - GURL url; - drag_util::PopulateURLAndTitleFromPasteBoard(&url, NULL, pboard, YES); - view_.browser->GetMainFrame()->LoadURL(url.spec()); - return YES; - } - return NO; - } - - current_wvh_ = NULL; - - WebView* webview = view_.browser->UIT_GetWebView(); - - // Create the appropriate mouse locations for WebCore. The draggingLocation - // is in window coordinates. Both need to be flipped. - NSPoint windowPoint = [info draggingLocation]; - NSPoint viewPoint = [self flipWindowPointToView:windowPoint view:view]; - NSPoint screenPoint = [self flipWindowPointToScreen:windowPoint view:view]; - - view_.browser->set_is_dropping(true); - webview->dragTargetDrop(gfx::Point(viewPoint.x, viewPoint.y), - gfx::Point(screenPoint.x, screenPoint.y), - 0); - view_.browser->set_is_dropping(false); - - return YES; -} - -// Given |data|, which should not be nil, fill it in using the contents of the -// given pasteboard. -- (void)populateWebDropData:(WebDropData*)data - fromPasteboard:(NSPasteboard*)pboard { - DCHECK(data); - DCHECK(pboard); - NSArray* types = [pboard types]; - - // Get URL if possible. To avoid exposing file system paths to web content, - // filenames in the drag are not converted to file URLs. - drag_util::PopulateURLAndTitleFromPasteBoard(&data->url, - &data->url_title, - pboard, - NO); - - // Get plain text. - if ([types containsObject:NSStringPboardType]) { - data->text = NullableString16( - base::SysNSStringToUTF16([pboard stringForType:NSStringPboardType]), - false); - } - - // Get HTML. If there's no HTML, try RTF. - if ([types containsObject:NSHTMLPboardType]) { - data->html = NullableString16( - base::SysNSStringToUTF16([pboard stringForType:NSHTMLPboardType]), - false); - } else if ([types containsObject:NSRTFPboardType]) { - NSString* html = [pboard htmlFromRtf]; - data->html = NullableString16(base::SysNSStringToUTF16(html), false); - } - - // Get files. - if ([types containsObject:NSFilenamesPboardType]) { - NSArray* files = [pboard propertyListForType:NSFilenamesPboardType]; - if ([files isKindOfClass:[NSArray class]] && [files count]) { - for (NSUInteger i = 0; i < [files count]; i++) { - NSString* filename = [files objectAtIndex:i]; - BOOL isDir = NO; - BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:filename - isDirectory:&isDir]; - if (exists && !isDir) { - data->filenames.push_back( - WebDropData::FileInfo(base::SysNSStringToUTF16(filename), - string16())); - } - } - } - } - - // TODO(pinkerton): Get file contents. http://crbug.com/34661 -} - -@end diff --git a/cef1/libcef/web_drop_target_win.cc b/cef1/libcef/web_drop_target_win.cc deleted file mode 100644 index d6dd91fab..000000000 --- a/cef1/libcef/web_drop_target_win.cc +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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 "libcef/web_drop_target_win.h" - -#include -#include - -#include "libcef/browser_impl.h" -#include "libcef/cef_context.h" -#include "libcef/drag_data_impl.h" -#include "libcef/web_drag_utils_win.h" - -#include "googleurl/src/gurl.h" -#include "net/base/net_util.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebDragData.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebPoint.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/base/clipboard/clipboard_util_win.h" -#include "ui/base/dragdrop/os_exchange_data.h" -#include "ui/base/dragdrop/os_exchange_data_provider_win.h" -#include "ui/base/window_open_disposition.h" -#include "webkit/glue/webdropdata.h" - -using WebKit::WebDragOperation; -using WebKit::WebDragOperationNone; -using WebKit::WebDragOperationCopy; -using WebKit::WebDragOperationLink; -using WebKit::WebDragOperationMove; -using WebKit::WebDragOperationGeneric; -using WebKit::WebPoint; -using WebKit::WebView; - -namespace { - -// A helper method for getting the preferred drop effect. -DWORD GetPreferredDropEffect(DWORD effect) { - if (effect & DROPEFFECT_COPY) - return DROPEFFECT_COPY; - if (effect & DROPEFFECT_LINK) - return DROPEFFECT_LINK; - if (effect & DROPEFFECT_MOVE) - return DROPEFFECT_MOVE; - return DROPEFFECT_NONE; -} - -} // namespace - -WebDropTarget::WebDropTarget(CefBrowserImpl* browser) - : ui::DropTargetWin(browser->UIT_GetWebViewWndHandle()), - browser_(browser), - current_wvh_(NULL), - drag_cursor_(WebDragOperationNone), - canceled_(false) { -} - -WebDropTarget::~WebDropTarget() { -} - -DWORD WebDropTarget::OnDragEnter(IDataObject* data_object, - DWORD key_state, - POINT cursor_position, - DWORD effects) { - current_wvh_ = _Context->current_webviewhost(); - DCHECK(current_wvh_); - - // TODO(tc): PopulateWebDropData can be slow depending on what is in the - // IDataObject. Maybe we can do this in a background thread. - WebDropData drop_data; - WebDropData::PopulateWebDropData(data_object, &drop_data); - - // Clear the fields that are currently unused when dragging into WebKit. - // Remove these lines once PopulateWebDropData() is updated not to set them. - // See crbug.com/112255. - if (!drop_data.file_contents.empty()) - drop_data.file_contents.clear(); - if (!drop_data.file_description_filename.empty()) - drop_data.file_description_filename.clear(); - - if (drop_data.url.is_empty()) - ui::OSExchangeDataProviderWin::GetPlainTextURL(data_object, &drop_data.url); - - WebKit::WebDragOperationsMask mask = - web_drag_utils_win::WinDragOpMaskToWebDragOpMask(effects); - - canceled_ = false; - - CefRefPtr client = browser_->GetClient(); - if (client.get()) { - CefRefPtr handler = client->GetDragHandler(); - if (handler.get()) { - CefRefPtr data(new CefDragDataImpl(drop_data)); - if (handler->OnDragEnter(browser_, data, - static_cast(mask))) { - canceled_ = true; - return DROPEFFECT_NONE; - } - } - } - - drag_cursor_ = WebDragOperationNone; - - POINT client_pt = cursor_position; - ScreenToClient(GetHWND(), &client_pt); - WebDragOperation operation; - if (browser_->UIT_GetWebView()) { - operation = browser_->UIT_GetWebView()->dragTargetDragEnter( - drop_data.ToDragData(), - WebPoint(client_pt.x, client_pt.y), - WebPoint(cursor_position.x, cursor_position.y), - mask, - 0); - } else { - operation = WebDragOperationNone; - } - - return web_drag_utils_win::WebDragOpToWinDragOp(operation); -} - -DWORD WebDropTarget::OnDragOver(IDataObject* data_object, - DWORD key_state, - POINT cursor_position, - DWORD effects) { - DCHECK(current_wvh_); - if (current_wvh_ != _Context->current_webviewhost()) - OnDragEnter(data_object, key_state, cursor_position, effects); - - if (canceled_) - return DROPEFFECT_NONE; - - POINT client_pt = cursor_position; - ScreenToClient(GetHWND(), &client_pt); - WebDragOperation operation; - if (browser_->UIT_GetWebView()) { - operation = browser_->UIT_GetWebView()->dragTargetDragOver( - WebPoint(client_pt.x, client_pt.y), - WebPoint(cursor_position.x, cursor_position.y), - web_drag_utils_win::WinDragOpMaskToWebDragOpMask(effects), - 0); - } else { - operation = WebDragOperationNone; - } - - return web_drag_utils_win::WebDragOpToWinDragOp(operation); -} - -void WebDropTarget::OnDragLeave(IDataObject* data_object) { - DCHECK(current_wvh_); - if (current_wvh_ != _Context->current_webviewhost()) - return; - - if (canceled_) - return; - - if (browser_->UIT_GetWebView()) - browser_->UIT_GetWebView()->dragTargetDragLeave(); -} - -DWORD WebDropTarget::OnDrop(IDataObject* data_object, - DWORD key_state, - POINT cursor_position, - DWORD effect) { - DCHECK(current_wvh_); - if (current_wvh_ != _Context->current_webviewhost()) - OnDragEnter(data_object, key_state, cursor_position, effect); - - POINT client_pt = cursor_position; - ScreenToClient(GetHWND(), &client_pt); - - browser_->set_is_dropping(true); - if (browser_->UIT_GetWebView()) { - browser_->UIT_GetWebView()->dragTargetDrop( - WebPoint(client_pt.x, client_pt.y), - WebPoint(cursor_position.x, cursor_position.y), - 0); - } - browser_->set_is_dropping(false); - - current_wvh_ = NULL; - - // This isn't always correct, but at least it's a close approximation. - // For now, we always map a move to a copy to prevent potential data loss. - DWORD drop_effect = web_drag_utils_win::WebDragOpToWinDragOp(drag_cursor_); - return drop_effect != DROPEFFECT_MOVE ? drop_effect : DROPEFFECT_COPY; -} diff --git a/cef1/libcef/web_drop_target_win.h b/cef1/libcef/web_drop_target_win.h deleted file mode 100644 index 71bc1a395..000000000 --- a/cef1/libcef/web_drop_target_win.h +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions 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. - -#ifndef CEF_LIBCEF_WEB_DROP_TARGET_WIN_H_ -#define CEF_LIBCEF_WEB_DROP_TARGET_WIN_H_ -#pragma once - -#include "base/memory/scoped_ptr.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h" -#include "ui/base/dragdrop/drop_target_win.h" - -class CefBrowserImpl; -class WebViewHost; - -// A helper object that provides drop capabilities to a WebView. The -// DropTarget handles drags that enter the region of the WebView by -// passing on the events to the renderer. -class WebDropTarget : public ui::DropTargetWin { - public: - // Create a new WebDropTarget associating it with the given HWND and - // WebView. - explicit WebDropTarget(CefBrowserImpl* browser); - virtual ~WebDropTarget(); - - void set_drag_cursor(WebKit::WebDragOperation op) { - drag_cursor_ = op; - } - - protected: - virtual DWORD OnDragEnter(IDataObject* data_object, - DWORD key_state, - POINT cursor_position, - DWORD effect); - - virtual DWORD OnDragOver(IDataObject* data_object, - DWORD key_state, - POINT cursor_position, - DWORD effect); - - virtual void OnDragLeave(IDataObject* data_object); - - virtual DWORD OnDrop(IDataObject* data_object, - DWORD key_state, - POINT cursor_position, - DWORD effect); - - private: - // Our associated CefBrowserImpl. - CefBrowserImpl* browser_; - - // We keep track of the web view host we're dragging over. If it changes - // during a drag, we need to re-send the DragEnter message. WARNING: - // this pointer should never be dereferenced. We only use it for comparing - // pointers. - WebViewHost* current_wvh_; - - // Used to determine what cursor we should display when dragging over web - // content area. This can be updated async during a drag operation. - WebKit::WebDragOperation drag_cursor_; - - // True if the drag has been canceled. - bool canceled_; - - DISALLOW_COPY_AND_ASSIGN(WebDropTarget); -}; - -#endif // CEF_LIBCEF_WEB_DROP_TARGET_WIN_H_ diff --git a/cef1/libcef/web_plugin_impl.cc b/cef1/libcef/web_plugin_impl.cc deleted file mode 100644 index b20909cca..000000000 --- a/cef1/libcef/web_plugin_impl.cc +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 "include/cef_web_plugin.h" -#include "libcef/cef_context.h" -#include "libcef/cef_thread.h" - -#include "base/files/file_path.h" -#include "base/string_util.h" -#include "webkit/plugins/npapi/plugin_list.h" - -namespace { - -class CefWebPluginInfoImpl : public CefWebPluginInfo { - public: - explicit CefWebPluginInfoImpl(const webkit::WebPluginInfo& plugin_info) - : plugin_info_(plugin_info) { - } - - virtual CefString GetName() OVERRIDE { - return plugin_info_.name; - } - - virtual CefString GetPath() OVERRIDE { - return plugin_info_.path.value(); - } - - virtual CefString GetVersion() OVERRIDE { - return plugin_info_.version; - } - - virtual CefString GetDescription() OVERRIDE { - return plugin_info_.desc; - } - - private: - webkit::WebPluginInfo plugin_info_; - - IMPLEMENT_REFCOUNTING(CefWebPluginInfoImpl); -}; - -} // namespace - -size_t CefGetWebPluginCount() { - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return 0; - } - - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return 0; - } - - std::vector plugins; - webkit::npapi::PluginList::Singleton()->GetPlugins(&plugins); - return plugins.size(); -} - -CefRefPtr CefGetWebPluginInfo(int index) { - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return 0; - } - - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return 0; - } - - std::vector plugins; - webkit::npapi::PluginList::Singleton()->GetPlugins(&plugins); - - if (index < 0 || index >= static_cast(plugins.size())) - return NULL; - - return new CefWebPluginInfoImpl(plugins[index]); -} - -CefRefPtr CefGetWebPluginInfo(const CefString& name) { - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return 0; - } - - if (!CefThread::CurrentlyOn(CefThread::UI)) { - NOTREACHED() << "called on invalid thread"; - return 0; - } - - std::vector plugins; - webkit::npapi::PluginList::Singleton()->GetPlugins(&plugins); - - std::string nameStr = name; - StringToLowerASCII(&nameStr); - - std::vector::const_iterator it = plugins.begin(); - for (; it != plugins.end(); ++it) { - if (LowerCaseEqualsASCII(it->name, nameStr.c_str())) - return new CefWebPluginInfoImpl(*it); - } - - return NULL; -} diff --git a/cef1/libcef/web_urlrequest_impl.cc b/cef1/libcef/web_urlrequest_impl.cc deleted file mode 100644 index bac96394c..000000000 --- a/cef1/libcef/web_urlrequest_impl.cc +++ /dev/null @@ -1,304 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/web_urlrequest_impl.h" -#include "libcef/browser_webkit_init.h" -#include "libcef/cef_thread.h" -#include "libcef/request_impl.h" -#include "libcef/response_impl.h" - -#include "base/bind.h" -#include "base/logging.h" -#include "base/memory/scoped_ptr.h" -#include "googleurl/src/gurl.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURLError.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURLLoaderClient.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURLRequest.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebURLResponse.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" -#include "webkit/glue/weburlloader_impl.h" - -using WebKit::WebURLError; -using WebKit::WebURLLoader; -using WebKit::WebURLRequest; -using WebKit::WebURLResponse; - -namespace { -class CefWebURLLoaderClientImpl; -}; - -// Manages the lifespan of WebKit objects. Methods of this class will only be -// called on the UI thread. -class CefWebURLRequestImpl::Context - : public base::RefCountedThreadSafe { - public: - explicit Context(CefRefPtr client) - : client_(client) { - } - virtual ~Context() { - } - - void initialize(CefRefPtr request); - void destroy(); - void cancel(); - - CefRefPtr client() { return client_; } - - protected: - CefRefPtr client_; - scoped_ptr url_loader_; - scoped_ptr url_client_; -}; - - -namespace { - -// Implements the WebURLLoaderClient interface. Methods of this class will only -// be called on the UI thread. -class CefWebURLLoaderClientImpl : public WebKit::WebURLLoaderClient { - public: - explicit CefWebURLLoaderClientImpl(CefWebURLRequestImpl::Context* context) - : context_(context) { - } - virtual ~CefWebURLLoaderClientImpl() { - } - - // ===================================================================== - // WebKit::WebURLLoaderClient API - // - - // Called when following a redirect. |newRequest| contains the request - // generated by the redirect. The client may modify |newRequest|. - virtual void willSendRequest(WebKit::WebURLLoader*, - WebKit::WebURLRequest& newRequest, - const WebKit::WebURLResponse& redirectResponse) { - REQUIRE_UIT(); - if (!context_) - return; - - CefRefPtr client = context_->client(); - if (client.get()) { - CefRefPtr handler = client->GetHandler(); - if (handler.get()) { - CefRefPtr cefRequest(new CefRequestImpl()); - CefRefPtr cefResponse( - new CefResponseImpl(redirectResponse)); - - cefRequest->Set(newRequest); - handler->OnRedirect(client.get(), cefRequest.get(), cefResponse); - cefRequest->Get(newRequest); - } - } - } - - // Called to report upload progress. The bytes reported correspond to - // the HTTP message body. - virtual void didSendData( - WebKit::WebURLLoader*, - unsigned long long bytesSent, // NOLINT(runtime/int) - unsigned long long totalBytesToBeSent) { // NOLINT(runtime/int) - REQUIRE_UIT(); - if (!context_) - return; - - CefRefPtr client = context_->client(); - if (client.get()) { - CefRefPtr handler = client->GetHandler(); - if (handler.get()) - handler->OnProgress(client.get(), bytesSent, totalBytesToBeSent); - } - } - - // Called when response headers are received. - virtual void didReceiveResponse(WebKit::WebURLLoader*, - const WebKit::WebURLResponse& response) { - REQUIRE_UIT(); - if (!context_) - return; - - CefRefPtr client = context_->client(); - if (client.get()) { - client->DoStateChange(WUR_STATE_HEADERS_RECEIVED); - CefRefPtr handler = client->GetHandler(); - if (handler.get()) { - CefRefPtr cefResponse(new CefResponseImpl(response)); - handler->OnHeadersReceived(client.get(), cefResponse); - } - } - } - - // Called when a chunk of response data is downloaded. This is only called - // if WebURLRequest's downloadToFile flag was set to true. - virtual void didDownloadData(WebKit::WebURLLoader*, int dataLength) { - NOTREACHED(); - } - - // Called when a chunk of response data is received. - virtual void didReceiveData(WebURLLoader*, const char* data, int dataLength, - int lengthReceived) { - REQUIRE_UIT(); - if (!context_) - return; - - CefRefPtr client = context_->client(); - if (client.get()) { - client->DoStateChange(WUR_STATE_LOADING); - CefRefPtr handler = client->GetHandler(); - if (handler.get()) { - handler->OnData(client.get(), data, dataLength); - } - } - } - - // Called when a chunk of renderer-generated metadata is received from - // the cache. - virtual void didReceiveCachedMetadata(WebKit::WebURLLoader*, const char* data, - int dataLength) { - NOTREACHED(); - } - - // Called when the load completes successfully. - virtual void didFinishLoading(WebKit::WebURLLoader*, double finishTime) { - REQUIRE_UIT(); - if (!context_) - return; - - CefRefPtr client = context_->client(); - if (client.get()) - client->DoStateChange(WUR_STATE_DONE); - - complete(); - } - - // Called when the load completes with an error. - virtual void didFail(WebKit::WebURLLoader*, - const WebKit::WebURLError& error) { - REQUIRE_UIT(); - if (!context_) - return; - - CefRefPtr client = context_->client(); - if (client.get() && client->GetState() != WUR_STATE_ABORT) { - client->DoStateChange(WUR_STATE_ERROR); - CefRefPtr handler = client->GetHandler(); - if (handler.get()) { - handler->OnError(client.get(), - static_cast(error.reason)); - } - } - - complete(); - } - - void complete() { - context_->destroy(); - context_ = NULL; - } - - protected: - scoped_refptr context_; -}; - -} // namespace - - -// CefWebURLManager - -void CefWebURLRequestImpl::Context::initialize( - CefRefPtr request) { - REQUIRE_UIT(); - - url_loader_.reset( - new webkit_glue::WebURLLoaderImpl(reinterpret_cast( - WebKit::webKitPlatformSupport()))); - url_client_.reset(new CefWebURLLoaderClientImpl(this)); - - WebURLRequest urlRequest; - static_cast(request.get())->Get(urlRequest); - url_loader_->loadAsynchronously(urlRequest, url_client_.get()); -} - -void CefWebURLRequestImpl::Context::destroy() { - REQUIRE_UIT(); - client_ = NULL; -} - -void CefWebURLRequestImpl::Context::cancel() { - REQUIRE_UIT(); - url_loader_->cancel(); - url_client_->complete(); -} - - -// CefWebURLRequest - -// static -CefRefPtr -CefWebURLRequest::CreateWebURLRequest( - CefRefPtr request, CefRefPtr client) { - CefRefPtr requester = new CefWebURLRequestImpl(client); - - // Send the request from the UI thread. - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefWebURLRequestImpl::DoSend, requester.get(), request)); - - return requester.get(); -} - - -// CefWebURLRequestImpl - -CefWebURLRequestImpl::CefWebURLRequestImpl( - CefRefPtr handler) - : handler_(handler), - state_(WUR_STATE_UNSENT) { -} - -CefWebURLRequestImpl::~CefWebURLRequestImpl() { -} - -CefWebURLRequestImpl::RequestState CefWebURLRequestImpl::GetState() { - AutoLock lock_scope(this); - return state_; -} - -void CefWebURLRequestImpl::Cancel() { - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&CefWebURLRequestImpl::DoCancel, this)); -} - -void CefWebURLRequestImpl::DoSend(CefRefPtr request) { - REQUIRE_UIT(); - DCHECK(state_ == WUR_STATE_UNSENT); - - context_ = new CefWebURLRequestImpl::Context(this); - context_->initialize(request); - - DoStateChange(WUR_STATE_STARTED); -} - -void CefWebURLRequestImpl::DoCancel() { - REQUIRE_UIT(); - - if (state_ < WUR_STATE_DONE) { - DoStateChange(WUR_STATE_ABORT); - context_->cancel(); - } -} - -void CefWebURLRequestImpl::DoStateChange(RequestState newState) { - REQUIRE_UIT(); - - if (state_ == newState) - return; - - { - AutoLock lock_scope(this); - state_ = newState; - } - - if (handler_.get()) - handler_->OnStateChange(this, newState); -} diff --git a/cef1/libcef/web_urlrequest_impl.h b/cef1/libcef/web_urlrequest_impl.h deleted file mode 100644 index 774ffc66a..000000000 --- a/cef1/libcef/web_urlrequest_impl.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_WEB_URLREQUEST_IMPL_H_ -#define CEF_LIBCEF_WEB_URLREQUEST_IMPL_H_ -#pragma once - -#include "include/cef_web_urlrequest.h" -#include "base/memory/ref_counted.h" - -class CefWebURLRequestImpl : public CefWebURLRequest { - public: - class Context; - - explicit CefWebURLRequestImpl( - CefRefPtr handler); - virtual ~CefWebURLRequestImpl(); - - // Can be called on any thread. - virtual RequestState GetState() OVERRIDE; - virtual void Cancel() OVERRIDE; - - // Can only be called on the UI thread. - void DoSend(CefRefPtr request); - void DoCancel(); - void DoStateChange(RequestState newState); - - CefRefPtr GetHandler() { return handler_; } - - static bool ImplementsThreadSafeReferenceCounting() { return true; } - - protected: - CefRefPtr handler_; - - // The below parameters are only modified on the UI thread. - RequestState state_; - scoped_refptr context_; - - IMPLEMENT_REFCOUNTING(CefWebURLRequestImpl); - IMPLEMENT_LOCKING(CefWebURLRequestImpl); -}; - -#endif // CEF_LIBCEF_WEB_URLREQUEST_IMPL_H_ diff --git a/cef1/libcef/webview_host.cc b/cef1/libcef/webview_host.cc deleted file mode 100644 index fe959e578..000000000 --- a/cef1/libcef/webview_host.cc +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/webview_host.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" - -WebViewHost::WebViewHost(BrowserWebViewDelegate* delegate) - : delegate_(delegate) { -} - -#if !defined(OS_MACOSX) -WebViewHost::~WebViewHost() { -} -#endif - -bool WebViewHost::IsTransparent() { - return static_cast(webwidget_)->isTransparent(); -} diff --git a/cef1/libcef/webview_host.h b/cef1/libcef/webview_host.h deleted file mode 100644 index 7b3d562ce..000000000 --- a/cef1/libcef/webview_host.h +++ /dev/null @@ -1,84 +0,0 @@ -// 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. - -#ifndef CEF_LIBCEF_WEBVIEW_HOST_H_ -#define CEF_LIBCEF_WEBVIEW_HOST_H_ -#pragma once - -#include "libcef/webwidget_host.h" -#include "base/basictypes.h" -#include "ui/gfx/native_widget_types.h" - -#if defined(TOOLKIT_GTK) -#include "webkit/plugins/npapi/gtk_plugin_container_manager.h" -#endif - -class BrowserWebViewDelegate; - -namespace webkit_glue { -struct WebPreferences; -} - -namespace WebKit { -class WebDevToolsAgentClient; -class WebView; -} - -// This class is a simple NativeView-based host for a WebView -class WebViewHost : public WebWidgetHost { - public: - // The new instance is deleted once the associated NativeView is destroyed. - // The newly created window should be resized after it is created, using the - // MoveWindow (or equivalent) function. - static WebViewHost* Create(gfx::NativeView parent_view, - const gfx::Rect& rect, - BrowserWebViewDelegate* delegate, - PaintDelegate* paint_delegate, - WebKit::WebDevToolsAgentClient* devtools_client, - const webkit_glue::WebPreferences& prefs); - - virtual ~WebViewHost(); - - WebKit::WebView* webview() const; - -#if defined(TOOLKIT_GTK) - // Create a new plugin parent container for a given plugin XID. - void CreatePluginContainer(gfx::PluginWindowHandle id); - - // Destroy the plugin parent container when a plugin has been destroyed. - void DestroyPluginContainer(gfx::PluginWindowHandle id); - - webkit::npapi::GtkPluginContainerManager* plugin_container_manager() { - return &plugin_container_manager_; - } - - virtual void KeyEvent(GdkEventKey* event); -#elif defined(OS_MACOSX) - void SetIsActive(bool active); - virtual void MouseEvent(NSEvent* event); - virtual void KeyEvent(NSEvent* event); - virtual void SetFocus(bool enable); -#endif - - virtual bool IsTransparent(); - - protected: - explicit WebViewHost(BrowserWebViewDelegate* delegate); - -#if defined(OS_WIN) - virtual bool WndProc(UINT message, WPARAM wparam, LPARAM lparam); - virtual void MouseEvent(UINT message, WPARAM wparam, LPARAM lparam); - virtual void KeyEvent(UINT message, WPARAM wparam, LPARAM lparam); -#endif - -#if defined(TOOLKIT_GTK) - // Helper class that creates and moves plugin containers. - webkit::npapi::GtkPluginContainerManager plugin_container_manager_; -#endif - - // The delegate pointer will always outlive the WebViewHost object. - BrowserWebViewDelegate* delegate_; -}; - -#endif // CEF_LIBCEF_WEBVIEW_HOST_H_ diff --git a/cef1/libcef/webview_host_gtk.cc b/cef1/libcef/webview_host_gtk.cc deleted file mode 100644 index 829619c8b..000000000 --- a/cef1/libcef/webview_host_gtk.cc +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) 2006-2008 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 - -#include "libcef/webview_host.h" -#include "libcef/browser_webview_delegate.h" - -#include "base/logging.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/gtk/WebInputEventFactory.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/gfx/rect.h" -#include "ui/gfx/size.h" -#include "webkit/glue/webpreferences.h" -#include "webkit/plugins/npapi/gtk_plugin_container.h" - -using WebKit::WebDevToolsAgentClient; -using WebKit::WebKeyboardEvent; -using WebKit::WebInputEvent; -using WebKit::WebInputEventFactory; -using WebKit::WebView; - -// static -WebViewHost* WebViewHost::Create(GtkWidget* parent_view, - const gfx::Rect& rect, - BrowserWebViewDelegate* delegate, - PaintDelegate* paint_delegate, - WebDevToolsAgentClient* dev_tools_client, - const webkit_glue::WebPreferences& prefs) { - WebViewHost* host = new WebViewHost(delegate); - - host->view_ = WebWidgetHost::CreateWidget(parent_view, host); - host->plugin_container_manager_.set_host_widget(host->view_); - -#if defined(WEBKIT_HAS_WEB_AUTO_FILL_CLIENT) - host->webwidget_ = WebView::create(delegate, NULL); -#else - host->webwidget_ = WebView::create(delegate); -#endif - host->webview()->setDevToolsAgentClient(dev_tools_client); - host->webview()->setPermissionClient(delegate); - host->webview()->setPrerendererClient(delegate); - prefs.Apply(host->webview()); - host->webview()->initializeMainFrame(delegate); - host->webwidget_->layout(); - - return host; -} - -WebView* WebViewHost::webview() const { - return static_cast(webwidget_); -} - -void WebViewHost::CreatePluginContainer(gfx::PluginWindowHandle id) { - plugin_container_manager_.CreatePluginContainer(id); -} - -void WebViewHost::DestroyPluginContainer(gfx::PluginWindowHandle id) { - plugin_container_manager_.DestroyPluginContainer(id); -} - -void WebViewHost::KeyEvent(GdkEventKey* event) { - WebKeyboardEvent keyboard_event(WebInputEventFactory::keyboardEvent(event)); - if (delegate_->OnKeyboardEvent(keyboard_event, false)) - return; - - WebWidgetHost::KeyEvent(event); -} diff --git a/cef1/libcef/webview_host_mac.mm b/cef1/libcef/webview_host_mac.mm deleted file mode 100644 index 078bc3d28..000000000 --- a/cef1/libcef/webview_host_mac.mm +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2008 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 - -#include "libcef/webview_host.h" -#include "libcef/browser_webview_delegate.h" -#include "libcef/browser_webview_mac.h" -#include "libcef/cef_context.h" - -#include "skia/ext/platform_canvas.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/mac/WebInputEventFactory.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "ui/gfx/rect.h" -#include "ui/gfx/size.h" -#include "webkit/glue/webpreferences.h" - -using WebKit::WebDevToolsAgentClient; -using WebKit::WebKeyboardEvent; -using WebKit::WebInputEvent; -using WebKit::WebInputEventFactory; -using WebKit::WebSize; -using WebKit::WebView; - -// static -WebViewHost* WebViewHost::Create(NSView* parent_view, - const gfx::Rect& rect, - BrowserWebViewDelegate* delegate, - PaintDelegate* paint_delegate, - WebDevToolsAgentClient* dev_tools_client, - const webkit_glue::WebPreferences& prefs) { - WebViewHost* host = new WebViewHost(delegate); - - NSRect content_rect = {{rect.x(), rect.y()}, {rect.width(), rect.height()}}; - if (!paint_delegate) { - host->view_ = [[BrowserWebView alloc] initWithFrame:content_rect]; - [host->view_ setAutoresizingMask:(NSViewWidthSizable | - NSViewHeightSizable)]; - [parent_view addSubview:host->view_]; - [host->view_ release]; - } else { - host->paint_delegate_ = paint_delegate; - } - -#if defined(WEBKIT_HAS_WEB_AUTO_FILL_CLIENT) - host->webwidget_ = WebView::create(delegate, NULL); -#else - host->webwidget_ = WebView::create(delegate); -#endif - host->webview()->setDevToolsAgentClient(dev_tools_client); - host->webview()->setPermissionClient(delegate); - host->webview()->setPrerendererClient(delegate); - prefs.Apply(host->webview()); - host->webview()->initializeMainFrame(delegate); - host->webwidget_->resize(WebSize(content_rect.size.width, - content_rect.size.height)); - - return host; -} - -WebViewHost::~WebViewHost() { - BrowserWebView* webView = static_cast(view_); - webView.browser = NULL; -} - -WebView* WebViewHost::webview() const { - return static_cast(webwidget_); -} - -void WebViewHost::SetIsActive(bool active) { - webview()->setIsActive(active); -} - -void WebViewHost::MouseEvent(NSEvent* event) { - _Context->set_current_webviewhost(this); - WebWidgetHost::MouseEvent(event); -} - -void WebViewHost::KeyEvent(NSEvent *event) { - WebKeyboardEvent keyboard_event(WebInputEventFactory::keyboardEvent(event)); - if (delegate_->OnKeyboardEvent(keyboard_event, false)) - return; - - WebWidgetHost::KeyEvent(event); -} - -void WebViewHost::SetFocus(bool enable) { - if (enable) { - // Set the current WebViewHost in case a drag action is started before mouse - // events are detected for the window. - _Context->set_current_webviewhost(this); - } - WebWidgetHost::SetFocus(enable); -} diff --git a/cef1/libcef/webview_host_win.cc b/cef1/libcef/webview_host_win.cc deleted file mode 100644 index a10629cb2..000000000 --- a/cef1/libcef/webview_host_win.cc +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) 2006-2008 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 "libcef/webview_host.h" -#include "libcef/browser_webview_delegate.h" -#include "libcef/cef_context.h" - -#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/win/WebInputEventFactory.h" -#include "ui/base/win/hwnd_util.h" -#include "ui/gfx/rect.h" -#include "ui/gfx/size.h" -#include "webkit/glue/webpreferences.h" - -using WebKit::WebDevToolsAgentClient; -using WebKit::WebKeyboardEvent; -using WebKit::WebInputEvent; -using WebKit::WebInputEventFactory; -using WebKit::WebView; - -static const wchar_t kWindowClassName[] = L"WebViewHost"; - -/*static*/ -WebViewHost* WebViewHost::Create(HWND parent_view, - const gfx::Rect&, - BrowserWebViewDelegate* delegate, - PaintDelegate* paint_delegate, - WebDevToolsAgentClient* dev_tools_client, - const webkit_glue::WebPreferences& prefs) { - WebViewHost* host = new WebViewHost(delegate); - - if (!paint_delegate) { - static bool registered_class = false; - if (!registered_class) { - WNDCLASSEX wcex = {0}; - wcex.cbSize = sizeof(wcex); - wcex.style = CS_DBLCLKS; - wcex.lpfnWndProc = WebWidgetHost::WndProc; - wcex.hInstance = GetModuleHandle(NULL); - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.lpszClassName = kWindowClassName; - RegisterClassEx(&wcex); - registered_class = true; - } - - host->view_ = CreateWindow(kWindowClassName, NULL, - WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, 0, 0, - 0, 0, parent_view, NULL, - GetModuleHandle(NULL), NULL); - ui::SetWindowUserData(host->view_, host); - } else { - host->paint_delegate_ = paint_delegate; - } - -#if defined(WEBKIT_HAS_WEB_AUTO_FILL_CLIENT) - host->webwidget_ = WebView::create(delegate, NULL); -#else - host->webwidget_ = WebView::create(delegate); -#endif - host->webview()->setDevToolsAgentClient(dev_tools_client); - host->webview()->setPermissionClient(delegate); - host->webview()->setPrerendererClient(delegate); - prefs.Apply(host->webview()); - host->webview()->initializeMainFrame(delegate); - - return host; -} - -WebView* WebViewHost::webview() const { - return static_cast(webwidget_); -} - -bool WebViewHost::WndProc(UINT message, WPARAM wparam, LPARAM lparam) { - switch (message) { - case WM_SETFOCUS: - // Set the current WebViewHost in case a drag action is started before mouse - // events are detected for the window. - _Context->set_current_webviewhost(this); - break; - } - return false; -} - -void WebViewHost::MouseEvent(UINT message, WPARAM wparam, LPARAM lparam) { - _Context->set_current_webviewhost(this); - WebWidgetHost::MouseEvent(message, wparam, lparam); -} - -void WebViewHost::KeyEvent(UINT message, WPARAM wparam, LPARAM lparam) { - // Give the client a chance to handle keyboard events before they're passed - // to WebKit. - const WebKeyboardEvent& event = WebInputEventFactory::keyboardEvent( - view_, message, wparam, lparam); - if (delegate_->OnKeyboardEvent(event, false)) - return; - - WebWidgetHost::KeyEvent(message, wparam, lparam); -} diff --git a/cef1/libcef/webwidget_host.cc b/cef1/libcef/webwidget_host.cc deleted file mode 100644 index 1dcf2b61f..000000000 --- a/cef1/libcef/webwidget_host.cc +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright (c) 2011 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 "libcef/webwidget_host.h" -#include "libcef/cef_thread.h" - -#include "base/bind.h" -#include "base/logging.h" -#include "base/message_loop.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebWidget.h" -#include "webkit/glue/webkit_glue.h" - -using webkit::npapi::WebPluginGeometry; -using WebKit::WebSize; - -const int WebWidgetHost::kDefaultFrameRate = 30; -const int WebWidgetHost::kMaxFrameRate = 90; - -void WebWidgetHost::InvalidateRect(const gfx::Rect& rect) { - if (rect.IsEmpty()) - return; - - int width, height; - GetSize(width, height); - gfx::Rect client_rect(width, height); - client_rect.Intersect(rect); - if (client_rect.IsEmpty()) - return; - - UpdatePaintRect(client_rect); - - if (view_) - InvalidateWindowRect(client_rect); - else - ScheduleTimer(); -} - -void WebWidgetHost::ScheduleAnimation() { - ScheduleTimer(); -} - -bool WebWidgetHost::GetImage(int width, int height, void* rgba_buffer) { - if (!canvas_.get()) - return false; - - const SkBitmap& bitmap = canvas_->getDevice()->accessBitmap(false); - DCHECK(bitmap.config() == SkBitmap::kARGB_8888_Config); - - if (width == canvas_->getDevice()->width() && - height == canvas_->getDevice()->height()) { - // The specified width and height values are the same as the canvas size. - // Return the existing canvas contents. - const void* pixels = bitmap.getPixels(); - memcpy(rgba_buffer, pixels, width * height * 4); - return true; - } - - // Create a new canvas of the requested size. - scoped_ptr new_canvas( - skia::CreatePlatformCanvas(width, height, true)); - - new_canvas->writePixels(bitmap, 0, 0); - const SkBitmap& new_bitmap = new_canvas->getDevice()->accessBitmap(false); - DCHECK(new_bitmap.config() == SkBitmap::kARGB_8888_Config); - - // Return the new canvas contents. - const void* pixels = new_bitmap.getPixels(); - memcpy(rgba_buffer, pixels, width * height * 4); - return true; -} - -void WebWidgetHost::SetSize(int width, int height) { - webwidget_->resize(WebSize(width, height)); - InvalidateRect(gfx::Rect(0, 0, width, height)); - EnsureTooltip(); -} - -void WebWidgetHost::GetSize(int& width, int& height) { - const WebSize& size = webwidget_->size(); - width = size.width; - height = size.height; -} - -void WebWidgetHost::AddWindowedPlugin(gfx::PluginWindowHandle handle) { - WebPluginGeometry geometry; - plugin_map_.insert(std::make_pair(handle, geometry)); -} - -void WebWidgetHost::RemoveWindowedPlugin(gfx::PluginWindowHandle handle) { - PluginMap::iterator it = plugin_map_.find(handle); - DCHECK(it != plugin_map_.end()); - plugin_map_.erase(it); -} - -void WebWidgetHost::MoveWindowedPlugin(const WebPluginGeometry& move) { - PluginMap::iterator it = plugin_map_.find(move.window); - DCHECK(it != plugin_map_.end()); - - it->second.window = move.window; - if (move.rects_valid) { - it->second.window_rect = move.window_rect; - it->second.clip_rect = move.clip_rect; - it->second.cutout_rects = move.cutout_rects; - it->second.rects_valid = true; - } - it->second.visible = move.visible; -} - -gfx::PluginWindowHandle WebWidgetHost::GetWindowedPluginAt(int x, int y) { - if (!plugin_map_.empty()) { - PluginMap::const_iterator it = plugin_map_.begin(); - for (; it != plugin_map_.end(); ++it) { - if (it->second.visible && it->second.window_rect.Contains(x, y)) - return it->second.window; - } - } - - return gfx::kNullPluginWindow; -} - -void WebWidgetHost::SetFrameRate(int frames_per_second) { - if (frames_per_second <= 0) - frames_per_second = kDefaultFrameRate; - if (frames_per_second > kMaxFrameRate) - frames_per_second = kMaxFrameRate; - - frame_delay_ = 1000 / frames_per_second; -} - -void WebWidgetHost::UpdatePaintRect(const gfx::Rect& rect) { -#if defined(OS_WIN) || defined(OS_MACOSX) - paint_rgn_.op(rect.x(), rect.y(), rect.right(), rect.bottom(), - SkRegion::kUnion_Op); -#else - // TODO(cef): Update all ports to use regions instead of rectangles. - paint_rect_.Union(rect); -#endif -} - -void WebWidgetHost::PaintRect(const gfx::Rect& rect) { -#ifndef NDEBUG - DCHECK(!painting_); -#endif - DCHECK(canvas_.get()); - - if (rect.IsEmpty()) - return; - - if (IsTransparent()) { - // When using transparency mode clear the rectangle before painting. - SkPaint clearpaint; - clearpaint.setARGB(0, 0, 0, 0); - clearpaint.setXfermodeMode(SkXfermode::kClear_Mode); - - SkRect skrc; - skrc.set(rect.x(), rect.y(), rect.right(), rect.bottom()); - canvas_->drawRect(skrc, clearpaint); - } - - set_painting(true); - webwidget_->paint(webkit_glue::ToWebCanvas(canvas_.get()), rect); - set_painting(false); -} - -void WebWidgetHost::ScheduleTimer() { - if (timer_.IsRunning()) - return; - - // This method may be called multiple times while the timer callback is - // executing. If so re-execute this method a single time after the callback - // has completed. - if (timer_executing_) { - if (!timer_wanted_) - timer_wanted_ = true; - return; - } - - // Maintain the desired rate. - base::TimeDelta delta = base::TimeTicks::Now() - timer_last_; - int64 actualRate = delta.InMilliseconds(); - if (actualRate >= frame_delay_) - delta = base::TimeDelta::FromMilliseconds(1); - else - delta = base::TimeDelta::FromMilliseconds(frame_delay_ - actualRate); - - timer_.Start( - FROM_HERE, - delta, - this, - &WebWidgetHost::DoTimer); -} - -void WebWidgetHost::DoTimer() { - timer_executing_ = true; - - if (view_) { - // Window rendering is enabled and we've received a requestAnimationFrame - // or similar call. Trigger the OS to invalidate/repaint the client area at - // the requested frequency. - InvalidateWindow(); - } else { - // Window rendering is disabled. Generate OnPaint() calls at the requested - // frequency. -#if defined(OS_MACOSX) - SkRegion region; - Paint(region); -#else - Paint(); -#endif - } - - timer_executing_ = false; - - timer_last_ = base::TimeTicks::Now(); - - if (timer_wanted_) { - timer_wanted_ = false; - ScheduleTimer(); - } -} diff --git a/cef1/libcef/webwidget_host.h b/cef1/libcef/webwidget_host.h deleted file mode 100644 index 264c9d490..000000000 --- a/cef1/libcef/webwidget_host.h +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright (c) 2006-2008 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. - -#ifndef CEF_LIBCEF_WEBWIDGET_HOST_H_ -#define CEF_LIBCEF_WEBWIDGET_HOST_H_ -#pragma once - -#include -#include - -#include "include/internal/cef_string.h" -#include "include/internal/cef_types.h" -#include "include/internal/cef_types_wrappers.h" - -#include "base/basictypes.h" -#include "base/memory/scoped_ptr.h" -#include "base/time.h" -#include "base/timer.h" -#include "skia/ext/platform_canvas.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebTextInputType.h" -#include "third_party/skia/include/core/SkRegion.h" -#include "ui/gfx/native_widget_types.h" -#include "ui/gfx/rect.h" -#include "webkit/plugins/npapi/webplugin.h" - -#if defined(OS_WIN) -#include "ui/base/win/ime_input.h" -#endif - -#if defined(TOOLKIT_GTK) -#include // NOLINT(build/include_order) -#endif - -namespace gfx { -class Rect; -class Size; -} - -namespace WebKit { -class WebWidget; -class WebWidgetClient; -class WebKeyboardEvent; -struct WebScreenInfo; -} - -#if defined(OS_MACOSX) -#ifdef __OBJC__ -@class NSEvent; -#else -class NSEvent; -#endif -#endif - -// This class is a simple NativeView-based host for a WebWidget -class WebWidgetHost { - public: - class PaintDelegate { - public: - virtual ~PaintDelegate() {} - virtual void Paint(bool popup, const std::vector& dirtyRects, - const void* buffer) =0; - }; - - // The new instance is deleted once the associated NativeView is destroyed. - // The newly created window should be resized after it is created, using the - // MoveWindow (or equivalent) function. - static WebWidgetHost* Create(gfx::NativeView parent_view, - WebKit::WebWidgetClient* client, - PaintDelegate* paint_delegate); - - virtual ~WebWidgetHost(); - - gfx::NativeView view_handle() const { return view_; } - WebKit::WebWidget* webwidget() const { return webwidget_; } - - void InvalidateRect(const gfx::Rect& rect); - - void ScrollRect(int dx, int dy, const gfx::Rect& clip_rect); - - // Called for requestAnimationFrame animations. - void ScheduleAnimation(); - -#if defined(OS_WIN) - void SetCursor(HCURSOR cursor); -#endif - -#if defined(OS_MACOSX) - void Paint(SkRegion& update_rgn); -#else - void Paint(); -#endif - - bool GetImage(int width, int height, void* buffer); - - void SetSize(int width, int height); - void GetSize(int& width, int& height); - - skia::PlatformCanvas* canvas() const { return canvas_.get(); } - - WebKit::WebScreenInfo GetScreenInfo(); - - WebKit::WebKeyboardEvent GetLastKeyEvent() const { return last_key_event_; } - - void SetLastKeyEvent(WebKit::WebKeyboardEvent keyEvent) - { last_key_event_ = keyEvent; } - - void SetTooltipText(const CefString& tooltip_text); - - void SendKeyEvent(cef_key_type_t type, const cef_key_info_t& keyInfo, - int modifiers); - void SendMouseClickEvent(int x, int y, cef_mouse_button_type_t type, - bool mouseUp, int clickCount); - void SendMouseMoveEvent(int x, int y, bool mouseLeave); - void SendMouseWheelEvent(int x, int y, int deltaX, int deltaY); - void SendFocusEvent(bool setFocus); - void SendCaptureLostEvent(); - - // Manage windowed plugins when window rendering is disabled. - bool HasWindowedPlugins() { return !plugin_map_.empty(); } - void AddWindowedPlugin(gfx::PluginWindowHandle handle); - void RemoveWindowedPlugin(gfx::PluginWindowHandle handle); - void MoveWindowedPlugin(const webkit::npapi::WebPluginGeometry& geometry); - gfx::PluginWindowHandle GetWindowedPluginAt(int x, int y); - - void SetFrameRate(int frames_per_second); - - virtual bool IsTransparent() { return false; } - - void set_popup(bool popup) { popup_ = popup; } - bool popup() { return popup_; } - - PaintDelegate* paint_delegate() { return paint_delegate_; } - - protected: - WebWidgetHost(); - - // Update the region that will be painted to the canvas by WebKit the next - // time that Paint() is called. - void UpdatePaintRect(const gfx::Rect& rect); - - void PaintRect(const gfx::Rect& rect); - - // Trigger the OS to invalidate/repaint the window. - void InvalidateWindow(); - void InvalidateWindowRect(const gfx::Rect& rect); - - // When window rendering is enabled this method invalidates the client area to - // trigger repaint via the OS. When window rendering is disabled this method - // is used to generate CefRenderHandler::OnPaint() calls. - void ScheduleTimer(); - void DoTimer(); - -#if defined(OS_WIN) - // Per-class wndproc. Returns true if the event should be swallowed. - virtual bool WndProc(UINT message, WPARAM wparam, LPARAM lparam); - - virtual void MouseEvent(UINT message, WPARAM wparam, LPARAM lparam); - void WheelEvent(WPARAM wparam, LPARAM lparam); - virtual void KeyEvent(UINT message, WPARAM wparam, LPARAM lparam); - void CaptureLostEvent(); - void SetFocus(bool enable); - void OnNotify(WPARAM wparam, NMHDR* header); - - static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); - LRESULT OnImeSetContext(UINT message, WPARAM wparam, LPARAM lparam, - BOOL& handled); - LRESULT OnImeStartComposition(UINT message, WPARAM wparam, LPARAM lparam, - BOOL& handled); - LRESULT OnImeComposition(UINT message, WPARAM wparam, LPARAM lparam, - BOOL& handled); - LRESULT OnImeEndComposition(UINT message, WPARAM wparam, LPARAM lparam, - BOOL& handled); - void OnInputLangChange(DWORD character_set, HKL input_language_id); - void UpdateImeInputState(); - void ToggleImeTimer(); -#elif defined(OS_MACOSX) - // These need to be called from a non-subclass, so they need to be public. - public: - virtual void MouseEvent(NSEvent* event); - void WheelEvent(NSEvent* event); - virtual void KeyEvent(NSEvent* event); - virtual void SetFocus(bool enable); - - protected: -#elif defined(TOOLKIT_GTK) - - public: - // --------------------------------------------------------------------------- - // This is needed on Linux because the GtkWidget creation is the same between - // both web view hosts and web widget hosts. The Windows code manages this by - // reusing the WndProc function (static, above). However, GTK doesn't use a - // single big callback function like that so we have a static function that - // sets up a GtkWidget correctly. - // parent: a GtkBox to pack the new widget at the end of - // host: a pointer to a WebWidgetHost (or subclass thereof) - // --------------------------------------------------------------------------- - static gfx::NativeView CreateWidget(gfx::NativeView parent_view, - WebWidgetHost* host); - virtual void KeyEvent(GdkEventKey* event); -#endif - -#if defined(OS_WIN) - void TrackMouseLeave(bool enable); -#endif - - void set_painting(bool value) { - painting_ = value; - } - - void EnsureTooltip(); - void ResetTooltip(); - - gfx::NativeView view_; - - // The paint delegate is used instead of the view when window rendering is - // disabled. - PaintDelegate* paint_delegate_; - - WebKit::WebWidget* webwidget_; - scoped_ptr canvas_; - int canvas_w_; - int canvas_h_; - - // True if this widget is a popup widget. - bool popup_; - - // Specifies the portion of the webwidget that needs painting. - // TODO(cef): Update the Linux port to use regions instead of rectangles. -#if defined(OS_WIN) || defined(OS_MACOSX) - SkRegion paint_rgn_; -#else - gfx::Rect paint_rect_; -#endif - - base::OneShotTimer timer_; - base::TimeTicks timer_last_; - bool timer_executing_; - bool timer_wanted_; - - int64 frame_delay_; - -#if defined(OS_WIN) - // Used to call UpdateImeInputState() while IME is active. - base::RepeatingTimer ime_timer_; -#endif - - // The map of windowed plugins that need to be drawn when window rendering is - // disabled. - typedef std::map - PluginMap; - PluginMap plugin_map_; - -#if defined(OS_WIN) - bool track_mouse_leave_; - std::wstring tooltip_text_; - gfx::NativeView tooltip_view_; - bool tooltip_showing_; - - // Wrapper class for IME input. - ui::ImeInput ime_input_; - - // Represents whether or not this browser process is receiving status messages - // about the focused edit control from a renderer process. - bool ime_notification_; - - // Stores the current text input type. - WebKit::WebTextInputType text_input_type_; - - // Stores the current caret bounds of input focus. - WebKit::WebRect caret_bounds_; -#endif // OS_WIN - -#if defined(OS_MACOSX) - std::string tooltip_text_; - int mouse_modifiers_; - WebKit::WebMouseEvent::Button mouse_button_down_; -#endif - - WebKit::WebKeyboardEvent last_key_event_; - - bool painting_; - bool layouting_; - - static const int kDefaultFrameRate; - static const int kMaxFrameRate; -}; - -#endif // CEF_LIBCEF_WEBWIDGET_HOST_H_ diff --git a/cef1/libcef/webwidget_host_gtk.cc b/cef1/libcef/webwidget_host_gtk.cc deleted file mode 100644 index d79434e8e..000000000 --- a/cef1/libcef/webwidget_host_gtk.cc +++ /dev/null @@ -1,460 +0,0 @@ -// Copyright (c) 2006-2008 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 "libcef/webwidget_host.h" - -#include -#include -#include - -#include "base/basictypes.h" -#include "base/logging.h" -#include "skia/ext/bitmap_platform_device.h" -#include "skia/ext/platform_canvas.h" -#include "skia/ext/platform_device.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/gtk/WebInputEventFactory.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/x11/WebScreenInfoFactory.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenu.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" - -using WebKit::WebInputEventFactory; -using WebKit::WebKeyboardEvent; -using WebKit::WebMouseEvent; -using WebKit::WebMouseWheelEvent; -using WebKit::WebPopupMenu; -using WebKit::WebScreenInfo; -using WebKit::WebScreenInfoFactory; -using WebKit::WebSize; -using WebKit::WebWidgetClient; - -namespace { - -// Used to store a backpointer to WebWidgetHost from our GtkWidget. -const char kWebWidgetHostKey[] = "webwidgethost"; - -// In response to an invalidation, we call into WebKit to do layout. On -// Windows, WM_PAINT is a virtual message so any extra invalidates that come up -// while it's doing layout are implicitly swallowed as soon as we actually do -// drawing via BeginPaint. -// -// Though GTK does know how to collapse multiple paint requests, it won't erase -// paint requests from the future when we start drawing. To avoid an infinite -// cycle of repaints, we track whether we're currently handling a redraw, and -// during that if we get told by WebKit that a region has become invalid, we -// still add that region to the local dirty rect but *don't* enqueue yet -// another "do a paint" message. -bool g_handling_expose = false; - -// ----------------------------------------------------------------------------- -// Callback functions to proxy to host... - -// The web contents are completely drawn and handled by WebKit, except that -// windowed plugins are GtkSockets on top of it. We need to place the -// GtkSockets inside a GtkContainer. We use a GtkFixed container, and the -// GtkSocket objects override a little bit to manage their size (see the code -// in webplugin_delegate_impl_gtk.cc). We listen on a the events we're -// interested in and forward them on to the WebWidgetHost. This class is a -// collection of static methods, implementing the widget related code. -class WebWidgetHostGtkWidget { - public: - // This will create a new widget used for hosting the web contents. We use - // our GtkDrawingAreaContainer here, for the reasons mentioned above. - static GtkWidget* CreateNewWidget(GtkWidget* parent_view, - WebWidgetHost* host) { - GtkWidget* widget = gtk_fixed_new(); - gtk_fixed_set_has_window(GTK_FIXED(widget), true); - - gtk_box_pack_start(GTK_BOX(parent_view), widget, TRUE, TRUE, 0); - - gtk_widget_add_events(widget, GDK_EXPOSURE_MASK | - GDK_POINTER_MOTION_MASK | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_KEY_PRESS_MASK | - GDK_KEY_RELEASE_MASK); - gtk_widget_set_can_focus(widget, TRUE); - g_signal_connect(widget, "size-request", - G_CALLBACK(&HandleSizeRequest), host); - g_signal_connect(widget, "size-allocate", - G_CALLBACK(&HandleSizeAllocate), host); - g_signal_connect(widget, "configure-event", - G_CALLBACK(&HandleConfigure), host); - g_signal_connect(widget, "expose-event", - G_CALLBACK(&HandleExpose), host); - g_signal_connect(widget, "key-press-event", - G_CALLBACK(&HandleKeyPress), host); - g_signal_connect(widget, "key-release-event", - G_CALLBACK(&HandleKeyRelease), host); - g_signal_connect(widget, "focus", - G_CALLBACK(&HandleFocus), host); - g_signal_connect(widget, "focus-in-event", - G_CALLBACK(&HandleFocusIn), host); - g_signal_connect(widget, "focus-out-event", - G_CALLBACK(&HandleFocusOut), host); - g_signal_connect(widget, "button-press-event", - G_CALLBACK(&HandleButtonPress), host); - g_signal_connect(widget, "button-release-event", - G_CALLBACK(&HandleButtonRelease), host); - g_signal_connect(widget, "motion-notify-event", - G_CALLBACK(&HandleMotionNotify), host); - g_signal_connect(widget, "scroll-event", - G_CALLBACK(&HandleScroll), host); - - g_object_set_data(G_OBJECT(widget), kWebWidgetHostKey, host); - return widget; - } - - private: - // Our size was requested. We let the GtkFixed do its normal calculation, - // after which this callback is called. The GtkFixed will come up with a - // requisition based on its children, which include plugin windows. Since - // we don't want to prevent resizing smaller than a plugin window, we need to - // control the size ourself. - static void HandleSizeRequest(GtkWidget* widget, - GtkRequisition* req, - WebWidgetHost* host) { - // This is arbitrary, but the WebKit scrollbars try to shrink themselves - // if the browser window is too small. Give them some space. - static const int kMinWidthHeight = 64; - - req->width = kMinWidthHeight; - req->height = kMinWidthHeight; - } - - // Our size has changed. - static void HandleSizeAllocate(GtkWidget* widget, - GtkAllocation* allocation, - WebWidgetHost* host) { - host->SetSize(allocation->width, allocation->height); - } - - // Size, position, or stacking of the GdkWindow changed. - static gboolean HandleConfigure(GtkWidget* widget, - GdkEventConfigure* config, - WebWidgetHost* host) { - host->SetSize(config->width, config->height); - return FALSE; - } - - // A portion of the GdkWindow needs to be redraw. - static gboolean HandleExpose(GtkWidget* widget, - GdkEventExpose* expose, - WebWidgetHost* host) { - // See comments above about what g_handling_expose is for. - g_handling_expose = true; - gfx::Rect rect(expose->area); - host->InvalidateRect(rect); - host->Paint(); - g_handling_expose = false; - return FALSE; - } - - // Keyboard key pressed. - static gboolean HandleKeyPress(GtkWidget* widget, - GdkEventKey* event, - WebWidgetHost* host) { - host->KeyEvent(event); - return FALSE; - } - - // Keyboard key released. - static gboolean HandleKeyRelease(GtkWidget* widget, - GdkEventKey* event, - WebWidgetHost* host) { - return HandleKeyPress(widget, event, host); - } - - // This signal is called when arrow keys or tab is pressed. If we return - // true, we prevent focus from being moved to another widget. If we want to - // allow focus to be moved outside of web contents, we need to implement - // WebViewDelegate::TakeFocus in the test webview delegate. - static gboolean HandleFocus(GtkWidget* widget, - GdkEventFocus* focus, - WebWidgetHost* host) { - return TRUE; - } - - // Keyboard focus entered. - static gboolean HandleFocusIn(GtkWidget* widget, - GdkEventFocus* focus, - WebWidgetHost* host) { - host->webwidget()->setFocus(true); - return TRUE; - } - - // Keyboard focus left. - static gboolean HandleFocusOut(GtkWidget* widget, - GdkEventFocus* focus, - WebWidgetHost* host) { - host->webwidget()->setFocus(false); - return TRUE; - } - - // Mouse button down. - static gboolean HandleButtonPress(GtkWidget* widget, - GdkEventButton* event, - WebWidgetHost* host) { - if (!(event->button == 1 || event->button == 2 || event->button == 3)) - return FALSE; // We do not forward any other buttons to the renderer. - if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) - return FALSE; - - gtk_widget_grab_focus(widget); - - host->webwidget()->handleInputEvent( - WebInputEventFactory::mouseEvent(event)); - return FALSE; - } - - // Mouse button up. - static gboolean HandleButtonRelease(GtkWidget* widget, - GdkEventButton* event, - WebWidgetHost* host) { - return HandleButtonPress(widget, event, host); - } - - // Mouse pointer movements. - static gboolean HandleMotionNotify(GtkWidget* widget, - GdkEventMotion* event, - WebWidgetHost* host) { - host->webwidget()->handleInputEvent( - WebInputEventFactory::mouseEvent(event)); - return FALSE; - } - - // Mouse scroll wheel. - static gboolean HandleScroll(GtkWidget* widget, - GdkEventScroll* event, - WebWidgetHost* host) { - host->webwidget()->handleInputEvent( - WebInputEventFactory::mouseWheelEvent(event)); - return FALSE; - } - - DISALLOW_IMPLICIT_CONSTRUCTORS(WebWidgetHostGtkWidget); -}; - -// Return an Xlib Display pointer for the given widget. -Display* GtkWidgetGetDisplay(GtkWidget* widget) { - GdkDisplay* gdk_display = gtk_widget_get_display(widget); - return gdk_x11_display_get_xdisplay(gdk_display); -} - -// Return the screen number for the given widget. -int GtkWidgetGetScreenNum(GtkWidget* widget) { - GdkDisplay* gdk_display = gtk_widget_get_display(widget); - GdkScreen* gdk_screen = gdk_display_get_default_screen(gdk_display); - return gdk_x11_screen_get_screen_number(gdk_screen); -} - -} // namespace - -// This is provided so that the webview can reuse the custom GTK window code. -// static -gfx::NativeView WebWidgetHost::CreateWidget( - gfx::NativeView parent_view, WebWidgetHost* host) { - return WebWidgetHostGtkWidget::CreateNewWidget(parent_view, host); -} - -// static -WebWidgetHost* WebWidgetHost::Create(GtkWidget* parent_view, - WebWidgetClient* client, - PaintDelegate* paint_delegate) { - WebWidgetHost* host = new WebWidgetHost(); - host->view_ = CreateWidget(parent_view, host); - host->webwidget_ = WebPopupMenu::create(client); - // We manage our own double buffering because we need to be able to update - // the expose area in an ExposeEvent within the lifetime of the event handler. - gtk_widget_set_double_buffered(GTK_WIDGET(host->view_), false); - - return host; -} - -void WebWidgetHost::ScrollRect(int dx, int dy, const gfx::Rect& clip_rect) { - // This is used for optimizing painting when the renderer is scrolled. We're - // currently not doing any optimizations so just invalidate the region. - InvalidateRect(clip_rect); -} - -WebWidgetHost::WebWidgetHost() - : view_(NULL), - paint_delegate_(NULL), - webwidget_(NULL), - canvas_w_(0), - canvas_h_(0), - popup_(false), - timer_executing_(false), - timer_wanted_(false), - frame_delay_(1000 / kDefaultFrameRate) { - set_painting(false); -} - -WebWidgetHost::~WebWidgetHost() { - // We may be deleted before the view_. Clear out the signals so that we don't - // attempt to invoke something on a deleted object. - g_object_set_data(G_OBJECT(view_), kWebWidgetHostKey, NULL); - g_signal_handlers_disconnect_matched(view_, - G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, this); - // TODO(port): Figure out why we can't do this without crashing. - // webwidget_->close(); -} - -void WebWidgetHost::InvalidateWindow() { - int width, height; - GetSize(width, height); - const gfx::Rect client_rect(width, height); - InvalidateWindowRect(client_rect); -} - -void WebWidgetHost::InvalidateWindowRect(const gfx::Rect& rect) { - DCHECK(view_); - if (!g_handling_expose) { - gtk_widget_queue_draw_area(GTK_WIDGET(view_), rect.x(), - rect.y(), rect.width(), rect.height()); - } -} - -void WebWidgetHost::Paint() { - int width, height; - GetSize(width, height); - gfx::Rect client_rect(width, height); - - // Number of pixels that the canvas is allowed to differ from the client area. - const int kCanvasGrowSize = 128; - - if (!canvas_.get() || - canvas_w_ < client_rect.width() || - canvas_h_ < client_rect.height() || - canvas_w_ > client_rect.width() + kCanvasGrowSize * 2 || - canvas_h_ > client_rect.height() + kCanvasGrowSize * 2) { - paint_rect_ = client_rect; - - // Resize the canvas to be within a reasonable size of the client area. - canvas_w_ = client_rect.width() + kCanvasGrowSize; - canvas_h_ = client_rect.height() + kCanvasGrowSize; - canvas_.reset(skia::CreatePlatformCanvas(canvas_w_, canvas_h_, true)); - if (!canvas_.get()) { - // memory allocation failed, we can't paint. - LOG(ERROR) << "Failed to allocate memory for " << width << "x" << height; - return; - } - } - - webwidget_->animate(0.0); - - // This may result in more invalidation - webwidget_->layout(); - - // Paint the canvas if necessary. Allow painting to generate extra rects the - // first time we call it. This is necessary because some WebCore rendering - // objects update their layout only when painted. - // Store the total area painted in total_paint. Then tell the gdk window - // to update that area after we're done painting it. - gfx::Rect total_paint; - for (int i = 0; i < 2; ++i) { - paint_rect_.Intersect(client_rect); - if (!paint_rect_.IsEmpty()) { - gfx::Rect rect(paint_rect_); - paint_rect_ = gfx::Rect(); - - DLOG_IF(WARNING, i == 1) << "painting caused additional invalidations"; - PaintRect(rect); - total_paint.Union(rect); - } - } - // DCHECK(paint_rect_.IsEmpty()); - - // Invalidate the paint region on the widget's underlying gdk window. Note - // that gdk_window_invalidate_* will generate extra expose events, which - // we wish to avoid. So instead we use calls to begin_paint/end_paint. - GdkRectangle grect = { - total_paint.x(), - total_paint.y(), - total_paint.width(), - total_paint.height(), - }; - GdkWindow* window = view_->window; - gdk_window_begin_paint_rect(window, &grect); - - // BitBlit to the gdk window. - skia::ScopedPlatformPaint scoped_platform_paint(canvas_.get()); - cairo_t* source_surface = scoped_platform_paint.GetPlatformSurface(); - cairo_t* cairo_drawable = gdk_cairo_create(window); - cairo_set_source_surface(cairo_drawable, cairo_get_target(source_surface), - 0, 0); - cairo_paint(cairo_drawable); - cairo_destroy(cairo_drawable); - - gdk_window_end_paint(window); -} - -void WebWidgetHost::SetTooltipText(const CefString& tooltip_text) { - // TODO(port): Implement this method as part of tooltip support. -} - -WebScreenInfo WebWidgetHost::GetScreenInfo() { - Display* display = GtkWidgetGetDisplay(view_); - int screen_num = GtkWidgetGetScreenNum(view_); - return WebScreenInfoFactory::screenInfo(display, screen_num); -} - -void WebWidgetHost::SendKeyEvent(cef_key_type_t type, - const cef_key_info_t& keyInfo, - int modifiers) { - // TODO(port): Implement this method as part of off-screen rendering support. - NOTIMPLEMENTED(); -} - -void WebWidgetHost::SendMouseClickEvent(int x, int y, - cef_mouse_button_type_t type, - bool mouseUp, int clickCount) { - // TODO(port): Implement this method as part of off-screen rendering support. - NOTIMPLEMENTED(); -} - -void WebWidgetHost::SendMouseMoveEvent(int x, int y, bool mouseLeave) { - // TODO(port): Implement this method as part of off-screen rendering support. - NOTIMPLEMENTED(); -} - -void WebWidgetHost::SendMouseWheelEvent(int x, int y, int deltaX, int deltaY) { - // TODO(port): Implement this method as part of off-screen rendering support. - NOTIMPLEMENTED(); -} - -void WebWidgetHost::SendFocusEvent(bool setFocus) { - // TODO(port): Implement this method as part of off-screen rendering support. - NOTIMPLEMENTED(); -} - -void WebWidgetHost::SendCaptureLostEvent() { - // TODO(port): Implement this method as part of off-screen rendering support. - NOTIMPLEMENTED(); -} - -void WebWidgetHost::EnsureTooltip() { - // TODO(port): Implement this method as part of tooltip support. -} - -void WebWidgetHost::ResetTooltip() { - // TODO(port): Implement this method as part of tooltip support. -} - -void WebWidgetHost::KeyEvent(GdkEventKey* event) { - WebKeyboardEvent keyboard_event(WebInputEventFactory::keyboardEvent(event)); - last_key_event_ = keyboard_event; - webwidget()->handleInputEvent(keyboard_event); - - // In the browser we do a ton of work with IMEs. This is some minimal - // code to make basic text work in test_shell, but doesn't cover IME. - // This is a copy of the logic in ProcessUnfilteredKeyPressEvent in - // render_widget_host_view_gtk.cc . - if (event->type == GDK_KEY_PRESS && keyboard_event.text[0]) { - keyboard_event.type = WebKit::WebInputEvent::Char; - last_key_event_ = keyboard_event; - webwidget()->handleInputEvent(keyboard_event); - } -} diff --git a/cef1/libcef/webwidget_host_mac.mm b/cef1/libcef/webwidget_host_mac.mm deleted file mode 100644 index 354ba39e7..000000000 --- a/cef1/libcef/webwidget_host_mac.mm +++ /dev/null @@ -1,569 +0,0 @@ -// Copyright (c) 2008-2009 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 - -#import "libcef/browser_tooltip_mac.h" -#include "base/compiler_specific.h" -#include "third_party/WebKit/Source/WebCore/config.h" -MSVC_PUSH_WARNING_LEVEL(0); -#include "KeyEventCocoa.h" // NOLINT(build/include) -MSVC_POP_WARNING(); - -#undef LOG -#import "libcef/webwidget_host.h" -#include "libcef/cef_thread.h" - -#include "base/bind.h" -#import "base/logging.h" -#import "base/strings/sys_string_conversions.h" -#import "skia/ext/platform_canvas.h" -#import "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" -#import "third_party/WebKit/Source/WebKit/chromium/public/mac/WebInputEventFactory.h" -#import "third_party/WebKit/Source/WebKit/chromium/public/mac/WebScreenInfoFactory.h" -#import "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" -#import "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenu.h" -#import "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" -#import "third_party/skia/include/core/SkRegion.h" -#import "ui/gfx/rect.h" -#import "ui/gfx/size.h" - -using webkit::npapi::WebPluginGeometry; -using WebKit::WebInputEvent; -using WebKit::WebInputEventFactory; -using WebKit::WebKeyboardEvent; -using WebKit::WebMouseEvent; -using WebKit::WebMouseWheelEvent; -using WebKit::WebPopupMenu; -using WebKit::WebScreenInfo; -using WebKit::WebScreenInfoFactory; -using WebKit::WebSize; -using WebKit::WebWidgetClient; - -namespace { - -// Maximum number of characters we allow in a tooltip. -const size_t kMaxTooltipLength = 1024; - -inline SkIRect convertToSkiaRect(const gfx::Rect& r) { - return SkIRect::MakeLTRB(r.x(), r.y(), r.right(), r.bottom()); -} - -inline gfx::Rect convertFromSkiaRect(const SkIRect& r) { - return gfx::Rect(r.x(), r.y(), r.width(), r.height()); -} - -} // namespace - -/*static*/ -WebWidgetHost* WebWidgetHost::Create(NSView* parent_view, - WebWidgetClient* client, - PaintDelegate* paint_delegate) { - WebWidgetHost* host = new WebWidgetHost(); - - if (!paint_delegate) { - const NSRect bounds = [parent_view bounds]; - host->view_ = [[NSView alloc] initWithFrame:bounds]; - [parent_view addSubview:host->view_]; - - host->webwidget_ = WebPopupMenu::create(client); - host->webwidget_->resize(WebSize(NSWidth(bounds), NSHeight(bounds))); - } else { - host->paint_delegate_ = paint_delegate; - host->view_ = nil; - host->webwidget_ = WebPopupMenu::create(client); - } - - return host; -} - -WebWidgetHost::WebWidgetHost() - : view_(NULL), - paint_delegate_(NULL), - webwidget_(NULL), - canvas_w_(0), - canvas_h_(0), - popup_(false), - timer_executing_(false), - timer_wanted_(false), - frame_delay_(1000 / kDefaultFrameRate), - mouse_modifiers_(0), - painting_(false), - layouting_(false) { - set_painting(false); -} - -WebWidgetHost::~WebWidgetHost() { -} - -void WebWidgetHost::ScrollRect(int dx, int dy, const gfx::Rect& clip_rect) { - DCHECK(dx || dy); - - int width, height; - GetSize(width, height); - const gfx::Rect client_rect(width, height); - gfx::Rect rect = clip_rect; - rect.Intersect(client_rect); - - const int x = rect.x(); - const int y = rect.y(); - const int r = rect.right(); - const int b = rect.bottom(); - const int w = rect.width(); - const int h = rect.height(); - const int Dx = ABS(dx); - const int Dy = ABS(dy); - - // If we're in a state right now where we cannot draw into the view then just - // mark the scrolling rect as dirty and it will be completely redrawn instead. - // The Paint() method can end up calling this method indirectly if the view - // needs to be laid out; calling scrollRect:by: in this situation leads to - // unwanted behavior. Finally, scrolling the rectangle by more than the size - // of the view means we can just invalidate the entire scroll rect. - if (!view_ || [view_ canDraw] || painting_ || layouting_ || Dx >= w || - Dy >= h) { - InvalidateRect(clip_rect); - return; - } - - // The scrolling rect must not scroll outside the clip rect because that will - // clobber the scrollbars. As a result we shorten the rectangle a bit from the - // leading side of the scroll (could be either horizontally or vertically). - rect = gfx::Rect(dx>=0? x: x + Dx, dy>=0? y: y + Dy, w - Dx, h - Dy); - - // Convert the scroll rectangle to the view's coordinate system and perform - // the scroll directly without invalidating the view. In theory this could - // cause some kind of performance issue since we're not coalescing redraw - // events. In practice, however, we get much smoother scrolling of big views - // since just copying the pixels within the window is much faster than - // redrawing them. - NSRect cocoa_rect = NSRectFromCGRect(rect.ToCGRect()); - cocoa_rect.origin.y = client_rect.height() - NSMaxY(cocoa_rect); - [view_ scrollRect:cocoa_rect by:NSMakeSize(dx, -dy)]; - - // Repaint the rectangle that was revealed when scrolling the given rectangle. - // The invalidated area will be painted before the view contents are flushed - // to the screen buffer. - rect = gfx::Rect(dx>=0? x: r - Dx, dy>=0? y: b - Dy, - dx>0? Dx: w, dy>0? Dy: h); - InvalidateRect(rect); - - // If any part of the scrolled rect was marked as dirty make sure to redraw - // it in the new scrolled-to location. Otherwise we can end up with artifacts - // for overlapping elements. If there are multiple dirty regions in the scroll - // rect the rectangle union of those regions will be redrawn. - SkRegion moved_paint_rgn(paint_rgn_); - moved_paint_rgn.translate(dx, dy); - moved_paint_rgn.op(convertToSkiaRect(client_rect), SkRegion::kIntersect_Op); - InvalidateRect(convertFromSkiaRect(moved_paint_rgn.getBounds())); -} - -void WebWidgetHost::Paint(SkRegion& update_rgn) { - int width, height; - GetSize(width, height); - gfx::Rect client_rect(width, height); - - SkRegion damaged_rgn; - - if (view_) { - // Union the rectangle that WebKit think needs repainting with the rectangle - // of the view that must be painted now. In most situations this will not - // affect the painted rectangle. In some situations we could end up re- - // painting areas that are already in the canvas and only dirty in the view - // itself. However, if we don't do this we can get artifacts when scrolling - // because contents of the canvas are no longer correct after scrolling only - // in the view. - paint_rgn_.op(update_rgn, SkRegion::kUnion_Op); - - // When we are not using accelerated compositing the canvas area is allowed - // to differ in size from the client by a certain number of pixels (128 in - // this case). When accelerated compositing is in effect the size must match - // exactly. - const int extra_w = (webwidget_->isAcceleratedCompositingActive()? 0: 128); - const int extra_h = (webwidget_->isAcceleratedCompositingActive()? 0: 128); - const int min_w = client_rect.width(); - const int min_h = client_rect.height(); - const int max_w = client_rect.width() + extra_w * 2; - const int max_h = client_rect.height() + extra_h * 2; - - const bool too_small = (canvas_w_ < min_w || canvas_h_ < min_h); - const bool too_large = (canvas_w_ > max_w || canvas_h_ > max_h); - - if (!canvas_.get() || too_small || too_large) { - canvas_w_ = client_rect.width() + extra_w; - canvas_h_ = client_rect.height() + extra_h; - canvas_.reset(skia::CreatePlatformCanvas(canvas_w_, canvas_h_, true)); - paint_rgn_.setRect(convertToSkiaRect(client_rect)); - } - } else if (!canvas_.get() || canvas_w_ != client_rect.width() || - canvas_h_ != client_rect.height()) { - paint_rgn_.setRect(convertToSkiaRect(client_rect)); - - // The canvas must be the exact size of the client area. - canvas_w_ = client_rect.width(); - canvas_h_ = client_rect.height(); - canvas_.reset(skia::CreatePlatformCanvas(canvas_w_, canvas_h_, true)); - } - - webwidget_->animate(0.0); - - // Layout any views that have not been laid out yet. The layout may result in - // more invalidation. Keep track of the fact that we are laying out views, - // because this will sometimes cause ScrollRect to be called and we don't want - // to try to scrollRect:by: then. - layouting_ = true; - webwidget_->layout(); - layouting_ = false; - - // Draw into the graphics context of the canvas instead of the view's context. - // The view's context is pushed onto the context stack to be restored below. - CGContextRef bitmap = skia::GetBitmapContext(skia::GetTopDevice(*canvas_)); - NSGraphicsContext* paint_context = - [NSGraphicsContext graphicsContextWithGraphicsPort:bitmap flipped:YES]; - [NSGraphicsContext saveGraphicsState]; - [NSGraphicsContext setCurrentContext:paint_context]; - - // Paint the canvas if necessary. The painting operation can cause additional - // regions to be invalidated because some elements are laid out the first time - // they are painted. - while (!paint_rgn_.isEmpty()) { - SkRegion draw_rgn; - draw_rgn.swap(paint_rgn_); - - SkRegion::Cliperator iterator(draw_rgn, convertToSkiaRect(client_rect)); - for (; !iterator.done(); iterator.next()) { - const SkIRect& r = iterator.rect(); - PaintRect(convertFromSkiaRect(r)); - - if (!view_) - damaged_rgn.op(r, SkRegion::kUnion_Op); - } - - if (view_) { - // If any more rectangles were made dirty during the paint operation, make - // sure they are copied to the window buffer, by including the paint - // region. If nothing needs additional painting, this is a no-op. - update_rgn.op(paint_rgn_, SkRegion::kUnion_Op); - } - } - - if (!view_ && plugin_map_.size() > 0) { - // Flash seems to stop calling NPN_InvalidateRect, which means we stop - // painting. If we've got a plugin make sure we paint its rect each time. - - PluginMap::const_iterator it = plugin_map_.begin(); - for (; it != plugin_map_.end(); ++it) { - if (it->second.visible && - client_rect.Intersects(it->second.window_rect)) { - const WebPluginGeometry* geom = &it->second; - damaged_rgn.op(convertToSkiaRect(geom->window_rect), - SkRegion::kUnion_Op); - } - } - } - - if (view_) { - // Set the context back to our view and copy the bitmap that we just painted - // into to the view. Only the regions that were updated are copied. - [NSGraphicsContext restoreGraphicsState]; - NSGraphicsContext* view_context = [NSGraphicsContext currentContext]; - CGContextRef context = - static_cast([view_context graphicsPort]); - - SkRegion::Cliperator iterator(update_rgn, convertToSkiaRect(client_rect)); - for (; !iterator.done(); iterator.next()) { - const SkIRect& r = iterator.rect(); - CGRect copy_rect = { { r.x(), r.y() }, { r.width(), r.height() } }; - const float x = r.x(); - const float y = client_rect.height() - r.bottom(); - skia::DrawToNativeContext(canvas_.get(), context, x, y, ©_rect); - } - } else { - if (damaged_rgn.isEmpty()) - return; - - // Paint to the delegate. - DCHECK(paint_delegate_); - const SkBitmap& bitmap = canvas_->getDevice()->accessBitmap(false); - DCHECK(bitmap.config() == SkBitmap::kARGB_8888_Config); - const void* pixels = bitmap.getPixels(); - - std::vector damaged_rects; - SkRegion::Cliperator iterator(damaged_rgn, convertToSkiaRect(client_rect)); - for (; !iterator.done(); iterator.next()) { - const SkIRect& r = iterator.rect(); - damaged_rects.push_back( - CefRect(r.left(), r.top(), r.width(), r.height())); - } - - paint_delegate_->Paint(popup_, damaged_rects, pixels); - } -} - -void WebWidgetHost::SetTooltipText(const CefString& tooltip_text) { - if (tooltip_text.empty() && !tooltip_text_.empty()) { - tooltip_text_.clear(); - if ([view_ respondsToSelector:@selector(setToolTipAtMousePoint:)]) - [(id)view_ setToolTipAtMousePoint:nil]; - } else if (tooltip_text != tooltip_text_ && [[view_ window] isKeyWindow]) { - tooltip_text_ = tooltip_text; - - if ([view_ respondsToSelector:@selector(setToolTipAtMousePoint:)]) { - // Clamp the tooltip length to kMaxTooltipLength. It's a DOS issue on - // Windows; we're just trying to be polite. Don't persist the trimmed - // string, as then the comparison above will always fail and we'll try to - // set it again every single time the mouse moves. - NSString* tooltip_nsstring; - if (tooltip_text_.length() > kMaxTooltipLength) { - tooltip_nsstring = - base::SysUTF8ToNSString(tooltip_text_.substr(0, kMaxTooltipLength)); - } else { - tooltip_nsstring = base::SysUTF8ToNSString(tooltip_text_); - } - [(id)view_ setToolTipAtMousePoint:tooltip_nsstring]; - } - } -} - -WebScreenInfo WebWidgetHost::GetScreenInfo() { - return WebScreenInfoFactory::screenInfo(view_); -} - -void WebWidgetHost::MouseEvent(NSEvent *event) { - const WebMouseEvent& web_event = WebInputEventFactory::mouseEvent( - event, view_); - webwidget_->handleInputEvent(web_event); - if (web_event.type == WebInputEvent::MouseLeave) - SetTooltipText(CefString()); -} - -void WebWidgetHost::WheelEvent(NSEvent *event) { - webwidget_->handleInputEvent( - WebInputEventFactory::mouseWheelEvent(event, view_)); -} - -void WebWidgetHost::KeyEvent(NSEvent *event) { - WebKeyboardEvent keyboard_event(WebInputEventFactory::keyboardEvent(event)); - last_key_event_ = keyboard_event; - webwidget_->handleInputEvent(keyboard_event); -} - -void WebWidgetHost::SetFocus(bool enable) { - webwidget_->setFocus(enable); -} - -void WebWidgetHost::SendKeyEvent(cef_key_type_t type, - const cef_key_info_t& keyInfo, - int modifiers) { - WebKeyboardEvent event; - - switch (type) { - case KT_KEYUP: - default: - event.type = WebInputEvent::KeyUp; - break; - case KT_KEYDOWN: - event.type = WebInputEvent::RawKeyDown; - break; - case KT_CHAR: - event.type = WebInputEvent::Char; - break; - } - event.timeStampSeconds = TickCount(); - - if (modifiers & KEY_SHIFT) - event.modifiers |= WebInputEvent::ShiftKey; - if (modifiers & KEY_ALT) - event.modifiers |= WebInputEvent::AltKey; - if (modifiers & KEY_CTRL) - event.modifiers |= WebInputEvent::ControlKey; - if (modifiers & KEY_META) - event.modifiers |= WebInputEvent::MetaKey; - if (modifiers & KEY_KEYPAD) - event.modifiers |= WebInputEvent::IsKeyPad; - - // There are several kinds of characters for which we produce key code from - // char code: - // 1. Roman letters. Windows keyboard layouts affect both virtual key codes - // and character codes for these, so e.g. 'A' gets the same keyCode on - // QWERTY, AZERTY or Dvorak layouts. - // 2. Keys for which there is no known Mac virtual key codes, like - // PrintScreen. - // 3. Certain punctuation keys. On Windows, these are also remapped depending - // on current keyboard layout, but see comment in - // windowsKeyCodeForCharCode(). - - if (type == KT_KEYUP || type == KT_KEYDOWN) { - if (keyInfo.character != 0) { - // Cmd switches Roman letters for Dvorak-QWERTY layout, so try modified - // characters first. - event.windowsKeyCode = - WebCore::windowsKeyCodeForCharCode(keyInfo.character); - } - if (event.windowsKeyCode == 0 && keyInfo.characterNoModifiers != 0) { - // Ctrl+A on an AZERTY keyboard would get VK_Q keyCode if we relied on - // keyInfo.keyCode below. - event.windowsKeyCode = - WebCore::windowsKeyCodeForCharCode(keyInfo.characterNoModifiers); - } - } - - if (event.windowsKeyCode == 0) { - // Map Mac virtual key code directly to Windows one for any keys not handled - // above. E.g. the key next to Caps Lock has the same Event.keyCode on U.S. - // keyboard ('A') and on Russian keyboard (CYRILLIC LETTER EF). - event.windowsKeyCode = WebCore::windowsKeyCodeForKeyCode(keyInfo.keyCode); - } - - event.nativeKeyCode = keyInfo.keyCode; - - int textChar = keyInfo.character; - int unmodifiedChar = keyInfo.characterNoModifiers; - - // Always use 13 for Enter/Return -- we don't want to use AppKit's - // different character for Enter. - if (event.windowsKeyCode == '\r') { - textChar = '\r'; - unmodifiedChar = '\r'; - } - - // The adjustments below are only needed in backward compatibility mode, - // but we cannot tell what mode we are in from here. - - // Turn 0x7F into 8, because backspace needs to always be 8. - if (textChar == '\x7F') - textChar = '\x8'; - if (unmodifiedChar == '\x7F') - unmodifiedChar = '\x8'; - // Always use 9 for tab -- we don't want to use AppKit's different character - // for shift-tab. - if (event.windowsKeyCode == 9) { - textChar = '\x9'; - unmodifiedChar = '\x9'; - } - - event.text[0] = textChar; - event.unmodifiedText[0] = unmodifiedChar; - - event.setKeyIdentifierFromWindowsKeyCode(); - - event.isSystemKey = !!(modifiers & KEY_META); - - last_key_event_ = event; - - webwidget_->handleInputEvent(event); -} - -void WebWidgetHost::SendMouseClickEvent(int x, int y, - cef_mouse_button_type_t type, - bool mouseUp, int clickCount) { - WebMouseEvent event; - - switch(type) { - case MBT_LEFT: - event.button = WebMouseEvent::ButtonLeft; - event.modifiers |= WebInputEvent::LeftButtonDown; - break; - case MBT_MIDDLE: - event.button = WebMouseEvent::ButtonMiddle; - event.modifiers |= WebInputEvent::MiddleButtonDown; - break; - case MBT_RIGHT: - event.button = WebMouseEvent::ButtonRight; - event.modifiers |= WebInputEvent::RightButtonDown; - break; - } - - if (mouseUp) - event.type = WebInputEvent::MouseUp; - else - event.type = WebInputEvent::MouseDown; - - event.clickCount = clickCount; - event.timeStampSeconds = TickCount(); - event.x = x; - event.y = y; - event.windowX = event.x; - event.windowY = event.y; - - if (mouseUp) { - mouse_button_down_ = WebMouseEvent::ButtonNone; - mouse_modifiers_ &= ~event.modifiers; - } else { - mouse_modifiers_ |= event.modifiers; - mouse_button_down_ = event.button; - } - event.modifiers = mouse_modifiers_; - - webwidget_->handleInputEvent(event); -} - -void WebWidgetHost::SendMouseMoveEvent(int x, int y, bool mouseLeave) { - WebMouseEvent event; - - event.type = WebInputEvent::MouseMove; - event.timeStampSeconds = TickCount(); - event.button = mouse_button_down_; - event.x = x; - event.y = y; - event.windowX = event.x; - event.windowY = event.y; - event.modifiers = mouse_modifiers_; - - webwidget_->handleInputEvent(event); -} - -void WebWidgetHost::SendMouseWheelEvent(int x, int y, int deltaX, int deltaY) { - WebMouseWheelEvent event; - - // Conversion between wheel delta amounts and number of pixels to scroll. - static const double scrollbarPixelsPerCocoaTick = 40.0; - - event.type = WebInputEvent::MouseWheel; - event.timeStampSeconds = TickCount(); - event.button = WebMouseEvent::ButtonNone; - event.deltaX = static_cast(deltaX); - event.deltaY = static_cast(deltaY); - event.wheelTicksX = static_cast(deltaX/scrollbarPixelsPerCocoaTick); - event.wheelTicksY = static_cast(deltaY/scrollbarPixelsPerCocoaTick); - event.hasPreciseScrollingDeltas = true; - event.x = x; - event.y = y; - event.windowX = event.x; - event.windowY = event.y; - - webwidget_->handleInputEvent(event); -} - -void WebWidgetHost::SendFocusEvent(bool setFocus) { - SetFocus(setFocus); -} - -void WebWidgetHost::SendCaptureLostEvent() { -} - -void WebWidgetHost::InvalidateWindow() { - DCHECK(view_); - [view_ setNeedsDisplay:YES]; -} - -void WebWidgetHost::InvalidateWindowRect(const gfx::Rect& rect) { - DCHECK(view_); - - int width, height; - GetSize(width, height); - const gfx::Rect client_rect(width, height); - - NSRect cocoa_rect = NSRectFromCGRect(rect.ToCGRect()); - cocoa_rect.origin.y = client_rect.height() - NSMaxY(cocoa_rect); - [view_ setNeedsDisplayInRect:cocoa_rect]; -} - -void WebWidgetHost::EnsureTooltip() { - // TODO(port): Implement this method as part of tooltip support. -} - -void WebWidgetHost::ResetTooltip() { - // TODO(port): Implement this method as part of tooltip support. -} diff --git a/cef1/libcef/webwidget_host_win.cc b/cef1/libcef/webwidget_host_win.cc deleted file mode 100644 index 609457a44..000000000 --- a/cef1/libcef/webwidget_host_win.cc +++ /dev/null @@ -1,1014 +0,0 @@ -// Copyright (c) 2008-2009 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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 -#include - -#include "libcef/webwidget_host.h" -#include "libcef/browser_impl.h" -#include "libcef/cef_thread.h" - -#include "base/bind.h" -#include "base/logging.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" -#include "third_party/WebKit/Source/Platform/chromium/public/WebVector.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositionUnderline.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenu.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/win/WebInputEventFactory.h" -#include "third_party/WebKit/Source/WebKit/chromium/public/win/WebScreenInfoFactory.h" -#include "third_party/skia/include/core/SkRegion.h" -#include "ui/base/ime/composition_text.h" -#include "ui/base/range/range.h" -#include "ui/base/win/hwnd_util.h" -#include "ui/gfx/gdi_util.h" -#include "ui/gfx/rect.h" - -#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) -#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) - -using webkit::npapi::WebPluginGeometry; -using WebKit::WebInputEvent; -using WebKit::WebInputEventFactory; -using WebKit::WebKeyboardEvent; -using WebKit::WebMouseEvent; -using WebKit::WebMouseWheelEvent; -using WebKit::WebPopupMenu; -using WebKit::WebScreenInfo; -using WebKit::WebScreenInfoFactory; -using WebKit::WebSize; -using WebKit::WebWidget; -using WebKit::WebWidgetClient; - -static const wchar_t kWindowClassName[] = L"WebWidgetHost"; - -namespace { - -struct MessageInfo { - UINT message; - WPARAM wParam; - LPARAM lParam; -}; - -BOOL CALLBACK SendMessageFunc(HWND hwnd, LPARAM lParam) { - MessageInfo* info = reinterpret_cast(lParam); - SendMessage(hwnd, info->message, info->wParam, info->lParam); - return TRUE; -} - -// Plugins are hosted in a Chromium-created parent window so it's necessary to -// send messages directly to the child window. -void SendMessageToPlugin(HWND hwnd, UINT message, WPARAM wParam, - LPARAM lParam) { - MessageInfo info = {message, wParam, lParam}; - EnumChildWindows(hwnd, SendMessageFunc, reinterpret_cast(&info)); -} - -inline SkIRect convertToSkiaRect(const gfx::Rect& r) { - return SkIRect::MakeLTRB(r.x(), r.y(), r.right(), r.bottom()); -} - -} // namespace - -/*static*/ -WebWidgetHost* WebWidgetHost::Create(HWND parent_view, - WebWidgetClient* client, - PaintDelegate* paint_delegate) { - WebWidgetHost* host = new WebWidgetHost(); - - if (!paint_delegate) { - // Create a window for the host. - static bool registered_class = false; - if (!registered_class) { - WNDCLASSEX wcex = {0}; - wcex.cbSize = sizeof(wcex); - wcex.style = CS_DBLCLKS; - wcex.lpfnWndProc = WebWidgetHost::WndProc; - wcex.hInstance = GetModuleHandle(NULL); - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.lpszClassName = kWindowClassName; - RegisterClassEx(&wcex); - registered_class = true; - } - - host->view_ = CreateWindowEx(WS_EX_TOOLWINDOW, - kWindowClassName, kWindowClassName, WS_POPUP, - 0, 0, 0, 0, - parent_view, NULL, GetModuleHandle(NULL), - NULL); - ui::SetWindowUserData(host->view_, host); - } else { - host->paint_delegate_ = paint_delegate; - } - - host->webwidget_ = WebPopupMenu::create(client); - - return host; -} - -/*static*/ -static WebWidgetHost* FromWindow(HWND view) { - return reinterpret_cast(ui::GetWindowUserData(view)); -} - -/*static*/ -LRESULT CALLBACK WebWidgetHost::WndProc(HWND hwnd, UINT message, WPARAM wparam, - LPARAM lparam) { - WebWidgetHost* host = FromWindow(hwnd); - if (host && !host->WndProc(message, wparam, lparam)) { - switch (message) { - case WM_PAINT: { - // Paint to the window. - host->Paint(); - return 0; - } - - case WM_ERASEBKGND: - // Do nothing here to avoid flashing, the background will be erased - // during painting. - return 0; - - case WM_SIZE: { - int width = LOWORD(lparam); - int height = HIWORD(lparam); - host->SetSize(width, height); - return 0; - } - - case WM_MOUSEMOVE: - case WM_MOUSELEAVE: - case WM_LBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_LBUTTONUP: - case WM_MBUTTONUP: - case WM_RBUTTONUP: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - host->MouseEvent(message, wparam, lparam); - // Finish the ongoing composition whenever a mouse click happens. - // It matches IE's behavior. - if (message == WM_LBUTTONDOWN || message == WM_MBUTTONDOWN || - message == WM_RBUTTONDOWN) { - host->ime_input_.CleanupComposition(host->view_); - } - break; - - case WM_MOUSEWHEEL: - { - // Only send mouse wheel events if the cursor is over the window. - POINT mousePt = { GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam) }; - RECT wndRect; - GetWindowRect(hwnd, &wndRect); - if (PtInRect(&wndRect, mousePt)) - host->WheelEvent(wparam, lparam); - } - break; - - case WM_MOUSEACTIVATE: - if (host->popup()) { - // Do not activate popup widgets on mouse click. - return MA_NOACTIVATE; - } - break; - - case WM_CAPTURECHANGED: - case WM_CANCELMODE: - host->CaptureLostEvent(); - break; - - case WM_KEYDOWN: - case WM_KEYUP: - case WM_SYSKEYDOWN: - case WM_SYSKEYUP: - case WM_CHAR: - case WM_SYSCHAR: - host->KeyEvent(message, wparam, lparam); - break; - - // Necessary for text input of characters from east-asian languages. Do - // not pass to DefWindowProc or characters will be displayed twice. - case WM_IME_CHAR: - host->KeyEvent(message, wparam, lparam); - return 0; - - case WM_CREATE: - // Call the WM_INPUTLANGCHANGE message handler to initialize - // the input locale of a browser process. - host->OnInputLangChange(0, 0); - break; - - case WM_INPUTLANGCHANGE: - host->OnInputLangChange(0, 0); - break; - - case WM_IME_SETCONTEXT: - { - BOOL handled; - LRESULT ime_retval = host->OnImeSetContext(message, wparam, - lparam, handled); - if (handled) - return ime_retval; - } - break; - - case WM_IME_STARTCOMPOSITION: - { - BOOL handled; - LRESULT ime_retval = host->OnImeStartComposition(message, wparam, - lparam, handled); - if (handled) - return ime_retval; - } - break; - - case WM_IME_COMPOSITION: - { - BOOL handled; - LRESULT ime_retval = host->OnImeComposition(message, wparam, - lparam, handled); - if (handled) - return ime_retval; - } - break; - - case WM_IME_ENDCOMPOSITION: - { - BOOL handled; - LRESULT ime_retval = host->OnImeEndComposition(message, wparam, - lparam, handled); - if (handled) - return ime_retval; - } - break; - - case WM_SETFOCUS: - host->SetFocus(true); - break; - - case WM_KILLFOCUS: - host->SetFocus(false); - break; - - case WM_NOTIFY: - host->OnNotify(0, reinterpret_cast(lparam)); - break; - - case WM_GETDLGCODE: - return DLGC_WANTALLKEYS; - } - } - - return DefWindowProc(hwnd, message, wparam, lparam); -} - -void WebWidgetHost::ScrollRect(int dx, int dy, const gfx::Rect& clip_rect) { - DCHECK(dx || dy); - - // Invalidate and re-paint the entire scroll rect if: - // 1. Window rendering is disabled, or - // 2. We're in a state where we cannot draw into the view right now, or - // 3. The rect is being scrolled by more than the size of the view, or - // 4. The scroll rect intersects the current paint region. - if (!view_ || !canvas_.get() || layouting_ || painting_ || - abs(dx) >= clip_rect.width() || abs(dy) >= clip_rect.height() || - paint_rgn_.intersects(convertToSkiaRect(clip_rect))) { - InvalidateRect(clip_rect); - return; - } - - // Scroll the canvas bitmap. - { - skia::ScopedPlatformPaint scoped_platform_paint(canvas_.get()); - HDC hdc = scoped_platform_paint.GetPlatformSurface(); - RECT clip_rect_win32 = clip_rect.ToRECT(), uncovered_rect = {0, 0, 0, 0}; - ScrollDC(hdc, dx, dy, NULL, &clip_rect_win32, NULL, &uncovered_rect); - - UpdatePaintRect(gfx::Rect(uncovered_rect)); - } - - // Invalidate the scroll rect. It will be drawn from the canvas bitmap on the - // next WM_PAINT call. - RECT r = clip_rect.ToRECT(); - ::InvalidateRect(view_, &r, FALSE); -} - -void WebWidgetHost::SetCursor(HCURSOR cursor) { - DCHECK(view_); - SetClassLong(view_, GCL_HCURSOR, - static_cast(reinterpret_cast(cursor))); - ::SetCursor(cursor); -} - -WebWidgetHost::WebWidgetHost() - : view_(NULL), - paint_delegate_(NULL), - webwidget_(NULL), - canvas_w_(0), - canvas_h_(0), - popup_(false), - timer_executing_(false), - timer_wanted_(false), - track_mouse_leave_(false), - frame_delay_(1000 / kDefaultFrameRate), - tooltip_view_(NULL), - tooltip_showing_(false), - ime_notification_(false), - layouting_(false), - text_input_type_(WebKit::WebTextInputTypeNone) { - set_painting(false); -} - -WebWidgetHost::~WebWidgetHost() { - TrackMouseLeave(false); - ResetTooltip(); - - if (view_) { - ui::SetWindowUserData(view_, 0); - view_ = NULL; - } -} - -void WebWidgetHost::InvalidateWindow() { - int width, height; - GetSize(width, height); - const gfx::Rect client_rect(width, height); - InvalidateWindowRect(client_rect); -} - -void WebWidgetHost::InvalidateWindowRect(const gfx::Rect& rect) { - DCHECK(view_); - - RECT r = rect.ToRECT(); - ::InvalidateRect(view_, &r, FALSE); -} - -bool WebWidgetHost::WndProc(UINT message, WPARAM wparam, LPARAM lparam) { - switch (message) { - case WM_ACTIVATE: - if (wparam == WA_INACTIVE) { - PostMessage(view_, WM_CLOSE, 0, 0); - return true; - } - break; - } - - return false; -} - -void WebWidgetHost::Paint() { - int width, height; - GetSize(width, height); - gfx::Rect client_rect(width, height); - - // Damaged rectangle used for drawing when window rendering is disabled. - SkRegion damaged_rgn; - - if (view_ && !webwidget_->isAcceleratedCompositingActive()) { - // Number of pixels that the canvas is allowed to differ from the client - // area. - const int kCanvasGrowSize = 128; - - if (!canvas_.get() || - canvas_w_ < client_rect.width() || - canvas_h_ < client_rect.height() || - canvas_w_ > client_rect.width() + kCanvasGrowSize * 2 || - canvas_h_ > client_rect.height() + kCanvasGrowSize * 2) { - paint_rgn_.setRect(convertToSkiaRect(client_rect)); - - // Resize the canvas to be within a reasonable size of the client area. - canvas_w_ = client_rect.width() + kCanvasGrowSize; - canvas_h_ = client_rect.height() + kCanvasGrowSize; - canvas_.reset(skia::CreatePlatformCanvas(canvas_w_, canvas_h_, true)); - } - } else if (!canvas_.get() || canvas_w_ != client_rect.width() || - canvas_h_ != client_rect.height()) { - paint_rgn_.setRect(convertToSkiaRect(client_rect)); - - // The canvas must be the exact size of the client area. - canvas_w_ = client_rect.width(); - canvas_h_ = client_rect.height(); - canvas_.reset(skia::CreatePlatformCanvas(canvas_w_, canvas_h_, true)); - } - - webwidget_->animate(0.0); - - // This may result in more invalidation. - layouting_ = true; - webwidget_->layout(); - layouting_ = false; - - // Paint the canvas if necessary. Allow painting to generate extra rects the - // first time we call it. This is necessary because some WebCore rendering - // objects update their layout only when painted. - for (int i = 0; i < 2; ++i) { - SkRegion draw_rgn; - draw_rgn.swap(paint_rgn_); - - // Draw each dirty rect in the region. - SkRegion::Cliperator iterator(draw_rgn, convertToSkiaRect(client_rect)); - for (; !iterator.done(); iterator.next()) { - const SkIRect& r = iterator.rect(); - gfx::Rect paint_rect = - gfx::Rect(r.left(), r.top(), r.width(), r.height()); - PaintRect(paint_rect); - - if (!view_) - damaged_rgn.op(convertToSkiaRect(paint_rect), SkRegion::kUnion_Op); - } - - if (paint_rgn_.isEmpty()) - break; - } - - DCHECK(paint_rgn_.isEmpty()); - - if (!view_ && plugin_map_.size() > 0) { - typedef std::list PluginList; - PluginList visible_plugins; - - // Identify the visible plugins. - PluginMap::const_iterator it = plugin_map_.begin(); - for (; it != plugin_map_.end(); ++it) { - if (it->second.visible && client_rect.Intersects(it->second.window_rect)) - visible_plugins.push_back(&it->second); - } - - if (!visible_plugins.empty()) { - skia::ScopedPlatformPaint scoped_platform_paint(canvas_.get()); - HDC drawDC = scoped_platform_paint.GetPlatformSurface(); - HRGN oldRGN, newRGN; - POINT oldViewport; - - // Paint the plugin windows. - PluginList::const_iterator it = visible_plugins.begin(); - for (; it != visible_plugins.end(); ++it) { - const WebPluginGeometry* geom = *(it); - - oldRGN = CreateRectRgn(0, 0, 1, 1); - GetClipRgn(drawDC, oldRGN); - - // Only paint inside the clip region. - newRGN = CreateRectRgn(geom->clip_rect.x(), - geom->clip_rect.y(), - geom->clip_rect.right(), - geom->clip_rect.bottom()); - gfx::SubtractRectanglesFromRegion(newRGN, geom->cutout_rects); - OffsetRgn(newRGN, geom->window_rect.x(), geom->window_rect.y()); - SelectClipRgn(drawDC, newRGN); - - // Change the viewport origin to the plugin window origin. - SetViewportOrgEx(drawDC, geom->window_rect.x(), geom->window_rect.y(), - &oldViewport); - - SendMessageToPlugin(geom->window, WM_PRINT, - reinterpret_cast(drawDC), - PRF_OWNED | PRF_ERASEBKGND | PRF_CLIENT | PRF_NONCLIENT); - - SetViewportOrgEx(drawDC, oldViewport.x, oldViewport.y, NULL); - SelectClipRgn(drawDC, oldRGN); - - if (!view_) { - damaged_rgn.op(convertToSkiaRect(geom->window_rect), - SkRegion::kUnion_Op); - } - - DeleteObject(oldRGN); - DeleteObject(newRGN); - } - } - } - - if (view_) { - // Paint to the window. - PAINTSTRUCT ps; - BeginPaint(view_, &ps); - skia::DrawToNativeContext(canvas_.get(), ps.hdc, ps.rcPaint.left, - ps.rcPaint.top, &ps.rcPaint); - EndPaint(view_, &ps); - - // Draw children - UpdateWindow(view_); - } else { - if (damaged_rgn.isEmpty()) - return; - - // Paint to the delegate. - DCHECK(paint_delegate_); - const SkBitmap& bitmap = canvas_->getDevice()->accessBitmap(false); - DCHECK(bitmap.config() == SkBitmap::kARGB_8888_Config); - const void* pixels = bitmap.getPixels(); - - std::vector damaged_rects; - SkRegion::Cliperator iterator(damaged_rgn, convertToSkiaRect(client_rect)); - for (; !iterator.done(); iterator.next()) { - const SkIRect& r = iterator.rect(); - damaged_rects.push_back( - CefRect(r.left(), r.top(), r.width(), r.height())); - } - - paint_delegate_->Paint(popup_, damaged_rects, pixels); - } -} - -WebScreenInfo WebWidgetHost::GetScreenInfo() { - return WebScreenInfoFactory::screenInfo(view_); -} - -void WebWidgetHost::MouseEvent(UINT message, WPARAM wparam, LPARAM lparam) { - const WebMouseEvent& event = WebInputEventFactory::mouseEvent( - view_, message, wparam, lparam); - switch (event.type) { - case WebInputEvent::MouseMove: - TrackMouseLeave(true); - break; - case WebInputEvent::MouseLeave: - TrackMouseLeave(false); - break; - case WebInputEvent::MouseDown: - if (!popup()) { - SetCapture(view_); - - if (::GetFocus() != view_) { - // Set focus to this window. - HWND parent_hwnd = ::GetParent(view_); - if (parent_hwnd) { - CefRefPtr browser = - static_cast( - ui::GetWindowUserData(parent_hwnd)); - if (browser.get()) { - // This mimics a temporary workaround in RenderWidgetHostViewWin - // for bug 765011 to get focus when the mouse is clicked. This - // happens after the mouse down event is sent to the renderer - // because normally Windows does a WM_SETFOCUS after - // WM_LBUTTONDOWN. - browser->SetFocus(true); - } - } - } - } - break; - case WebInputEvent::MouseUp: - if (!popup()) { - if (GetCapture() == view_) - ReleaseCapture(); - } - break; - } - webwidget_->handleInputEvent(event); -} - -void WebWidgetHost::WheelEvent(WPARAM wparam, LPARAM lparam) { - const WebMouseWheelEvent& event = WebInputEventFactory::mouseWheelEvent( - view_, WM_MOUSEWHEEL, wparam, lparam); - webwidget_->handleInputEvent(event); -} - -void WebWidgetHost::KeyEvent(UINT message, WPARAM wparam, LPARAM lparam) { - const WebKeyboardEvent& event = WebInputEventFactory::keyboardEvent( - view_, message, wparam, lparam); - last_key_event_ = event; - webwidget_->handleInputEvent(event); -} - -void WebWidgetHost::CaptureLostEvent() { - webwidget_->mouseCaptureLost(); -} - -void WebWidgetHost::SetFocus(bool enable) { - webwidget_->setFocus(enable); -} - -void WebWidgetHost::OnNotify(WPARAM wparam, NMHDR* header) { - if (tooltip_view_ == NULL) - return; - - switch (header->code) { - case TTN_GETDISPINFO: - { - NMTTDISPINFOW* tooltip_info = reinterpret_cast(header); - tooltip_info->szText[0] = L'\0'; - tooltip_info->lpszText = const_cast(tooltip_text_.c_str()); - ::SendMessage(tooltip_view_, TTM_SETMAXTIPWIDTH, 0, 1024); - } - break; - - case TTN_POP: - tooltip_showing_ = false; - break; - - case TTN_SHOW: - tooltip_showing_ = true; - break; - } -} - -void WebWidgetHost::SetTooltipText(const CefString& tooltip_text) { - if (!view_) - return; - - std::wstring new_tooltip_text(tooltip_text); - if (new_tooltip_text != tooltip_text_) { - tooltip_text_ = new_tooltip_text; - - // Need to check if the tooltip is already showing so that we don't - // immediately show the tooltip with no delay when we move the mouse from - // a region with no tooltip to a region with a tooltip. - if (::IsWindow(tooltip_view_) && tooltip_showing_) { - ::SendMessage(tooltip_view_, TTM_POP, 0, 0); - ::SendMessage(tooltip_view_, TTM_POPUP, 0, 0); - } - } else { - // Make sure the tooltip gets closed after TTN_POP gets sent. For some - // reason this doesn't happen automatically, so moving the mouse around - // within the same link/image/etc doesn't cause the tooltip to re-appear. - if (!tooltip_showing_) { - if (::IsWindow(tooltip_view_)) - ::SendMessage(tooltip_view_, TTM_POP, 0, 0); - } - } -} - -void WebWidgetHost::EnsureTooltip() { - if (!view_) - return; - - UINT message = TTM_NEWTOOLRECT; - - TOOLINFO ti; - ti.cbSize = sizeof(ti); - ti.hwnd = view_; - ti.uId = 0; - if (!::IsWindow(tooltip_view_)) { - message = TTM_ADDTOOL; - tooltip_view_ = CreateWindowEx( - WS_EX_TRANSPARENT, - TOOLTIPS_CLASS, L"tooltip_view_", TTS_NOPREFIX, 0, 0, 0, 0, - view_, NULL, - NULL, NULL); - ti.uFlags = TTF_SUBCLASS; - ti.lpszText = LPSTR_TEXTCALLBACK; - } - - GetClientRect(view_, &ti.rect); - SendMessage(tooltip_view_, message, NULL, reinterpret_cast(&ti)); -} - -void WebWidgetHost::ResetTooltip() { - if (!view_) - return; - - if (::IsWindow(tooltip_view_)) - ::DestroyWindow(tooltip_view_); - tooltip_view_ = NULL; -} - -void WebWidgetHost::TrackMouseLeave(bool track) { - if (!view_) - return; - - if (track == track_mouse_leave_) - return; - track_mouse_leave_ = track; - - DCHECK(view_); - - TRACKMOUSEEVENT tme; - tme.cbSize = sizeof(TRACKMOUSEEVENT); - tme.dwFlags = TME_LEAVE; - if (!track_mouse_leave_) - tme.dwFlags |= TME_CANCEL; - tme.hwndTrack = view_; - - TrackMouseEvent(&tme); -} - -void WebWidgetHost::SendKeyEvent(cef_key_type_t type, - const cef_key_info_t& keyInfo, - int modifiers) { - UINT message = 0; - WPARAM wparam = keyInfo.key; - LPARAM lparam = modifiers; - - if (type == KT_KEYUP) { - if (keyInfo.sysChar) - message = WM_SYSKEYUP; - else if (keyInfo.imeChar) - message = WM_IME_KEYUP; - else - message = WM_KEYUP; - } else if (type == KT_KEYDOWN) { - if (keyInfo.sysChar) - message = WM_SYSKEYDOWN; - else if (keyInfo.imeChar) - message = WM_IME_KEYDOWN; - else - message = WM_KEYDOWN; - } else if (type == KT_CHAR) { - if (keyInfo.sysChar) - message = WM_SYSCHAR; - else if (keyInfo.imeChar) - message = WM_IME_CHAR; - else - message = WM_CHAR; - } - - if (message == 0) { - NOTREACHED(); - return; - } - - const WebKeyboardEvent& event = WebInputEventFactory::keyboardEvent( - NULL, message, wparam, lparam); - last_key_event_ = event; - - webwidget_->handleInputEvent(event); -} - -void WebWidgetHost::SendMouseClickEvent(int x, int y, - cef_mouse_button_type_t type, - bool mouseUp, int clickCount) { - DCHECK(clickCount >=1 && clickCount <= 2); - - UINT message = 0; - WPARAM wparam = 0; - LPARAM lparam = MAKELPARAM(x, y); - - if (type == MBT_LEFT) { - if (mouseUp) - message = (clickCount == 1?WM_LBUTTONUP:WM_LBUTTONDBLCLK); - else - message = WM_LBUTTONDOWN; - } else if (type == MBT_MIDDLE) { - if (mouseUp) - message = (clickCount == 1?WM_MBUTTONUP:WM_MBUTTONDBLCLK); - else - message = WM_MBUTTONDOWN; - } else if (type == MBT_RIGHT) { - if (mouseUp) - message = (clickCount == 1?WM_RBUTTONUP:WM_RBUTTONDBLCLK); - else - message = WM_RBUTTONDOWN; - } - - if (message == 0) { - NOTREACHED(); - return; - } - - if (GetKeyState(VK_CONTROL) & 0x8000) - wparam |= MK_CONTROL; - if (GetKeyState(VK_SHIFT) & 0x8000) - wparam |= MK_SHIFT; - if (GetKeyState(VK_LBUTTON) & 0x8000) - wparam |= MK_LBUTTON; - if (GetKeyState(VK_MBUTTON) & 0x8000) - wparam |= MK_MBUTTON; - if (GetKeyState(VK_RBUTTON) & 0x8000) - wparam |= MK_RBUTTON; - - gfx::PluginWindowHandle plugin = GetWindowedPluginAt(x, y); - if (plugin) { - SendMessageToPlugin(plugin, message, wparam, lparam); - } else { - const WebMouseEvent& event = WebInputEventFactory::mouseEvent(NULL, message, - wparam, lparam); - webwidget_->handleInputEvent(event); - } -} - -void WebWidgetHost::SendMouseMoveEvent(int x, int y, bool mouseLeave) { - UINT message; - WPARAM wparam = 0; - LPARAM lparam = 0; - - if (mouseLeave) { - message = WM_MOUSELEAVE; - } else { - message = WM_MOUSEMOVE; - lparam = MAKELPARAM(x, y); - } - - if (GetKeyState(VK_CONTROL) & 0x8000) - wparam |= MK_CONTROL; - if (GetKeyState(VK_SHIFT) & 0x8000) - wparam |= MK_SHIFT; - if (GetKeyState(VK_LBUTTON) & 0x8000) - wparam |= MK_LBUTTON; - if (GetKeyState(VK_MBUTTON) & 0x8000) - wparam |= MK_MBUTTON; - if (GetKeyState(VK_RBUTTON) & 0x8000) - wparam |= MK_RBUTTON; - - gfx::PluginWindowHandle plugin = GetWindowedPluginAt(x, y); - if (plugin) { - SendMessageToPlugin(plugin, message, wparam, lparam); - } else { - const WebMouseEvent& event = WebInputEventFactory::mouseEvent(NULL, message, - wparam, lparam); - webwidget_->handleInputEvent(event); - } -} - -void WebWidgetHost::SendMouseWheelEvent(int x, int y, int deltaX, int deltaY) { - WPARAM wparam = MAKEWPARAM(0, deltaY); - LPARAM lparam = MAKELPARAM(x, y); - - if (GetKeyState(VK_CONTROL) & 0x8000) - wparam |= MK_CONTROL; - if (GetKeyState(VK_SHIFT) & 0x8000) - wparam |= MK_SHIFT; - if (GetKeyState(VK_LBUTTON) & 0x8000) - wparam |= MK_LBUTTON; - if (GetKeyState(VK_MBUTTON) & 0x8000) - wparam |= MK_MBUTTON; - if (GetKeyState(VK_RBUTTON) & 0x8000) - wparam |= MK_RBUTTON; - - gfx::PluginWindowHandle plugin = GetWindowedPluginAt(x, y); - if (plugin) { - SendMessageToPlugin(plugin, WM_MOUSEWHEEL, wparam, lparam); - } else { - const WebMouseWheelEvent& event = WebInputEventFactory::mouseWheelEvent( - NULL, WM_MOUSEWHEEL, wparam, lparam); - webwidget_->handleInputEvent(event); - } -} - -void WebWidgetHost::SendFocusEvent(bool setFocus) { - SetFocus(setFocus); -} - -void WebWidgetHost::SendCaptureLostEvent() { - CaptureLostEvent(); -} - -LRESULT WebWidgetHost::OnImeSetContext(UINT message, WPARAM wparam, - LPARAM lparam, BOOL& handled) { - if (!webwidget_) - return 0; - - // We need to start the IME timer when: - // * the current input context has IMEs, and; - // * an application is activated. - // This seems to indicate that we should also check if the current input - // context has IMEs before starting the timer, however, this WM_IME_SETCONTEXT - // is fortunately sent to an application only while the input context has - // IMEs. Therefore, we just start/stop the timer according to the activation - // status of this application without checks. - ime_notification_ = (wparam == TRUE); - if (ime_notification_) - ime_input_.CreateImeWindow(view_); - - ime_input_.CleanupComposition(view_); - ime_input_.SetImeWindowStyle(view_, message, wparam, lparam, &handled); - - ToggleImeTimer(); - return 0; -} - -LRESULT WebWidgetHost::OnImeStartComposition(UINT message, WPARAM wparam, - LPARAM lparam, BOOL& handled) { - if (!webwidget_) - return 0; - - // Reset the composition status and create IME windows. - ime_input_.CreateImeWindow(view_); - ime_input_.ResetComposition(view_); - // We have to prevent WTL from calling ::DefWindowProc() because the function - // calls ::ImmSetCompositionWindow() and ::ImmSetCandidateWindow() to - // over-write the position of IME windows. - handled = TRUE; - return 0; -} - -LRESULT WebWidgetHost::OnImeComposition(UINT message, WPARAM wparam, - LPARAM lparam, BOOL& handled) { - if (!webwidget_) - return 0; - - // At first, update the position of the IME window. - ime_input_.UpdateImeWindow(view_); - - // ui::CompositionUnderline should be identical to - // WebKit::WebCompositionUnderline, so that we can do reinterpret_cast safely. - COMPILE_ASSERT(sizeof(ui::CompositionUnderline) == - sizeof(WebKit::WebCompositionUnderline), - ui_CompositionUnderline__WebKit_WebCompositionUnderline_diff); - - // Retrieve the result string and its attributes of the ongoing composition - // and send to WebKit. - ui::CompositionText composition; - if (ime_input_.GetResult(view_, lparam, &composition.text)) { - webwidget_->setComposition(composition.text, - std::vector(), - 0, 0); - webwidget_->confirmComposition(); - ime_input_.ResetComposition(view_); - // Fall though and try reading the composition string. - // Japanese IMEs send a message containing both GCS_RESULTSTR and - // GCS_COMPSTR, which means an ongoing composition has been finished - // by the start of another composition. - } - // Retrieve the composition string and its attributes of the ongoing - // composition and send to WebKit. - if (ime_input_.GetComposition(view_, lparam, &composition)) { - // TODO(suzhe): due to a bug of webkit, we can't use selection range with - // composition string. See: https://bugs.webkit.org/show_bug.cgi?id=37788 - composition.selection = ui::Range(composition.selection.end()); - - const std::vector& underlines = - reinterpret_cast&>( - composition.underlines); - webwidget_->setComposition( - composition.text, underlines, - composition.selection.start(), composition.selection.end()); - } - // We have to prevent WTL from calling ::DefWindowProc() because we do not - // want for the IMM (Input Method Manager) to send WM_IME_CHAR messages. - handled = TRUE; - return 0; -} - -LRESULT WebWidgetHost::OnImeEndComposition(UINT message, WPARAM wparam, - LPARAM lparam, BOOL& handled) { - if (!webwidget_) - return 0; - - if (ime_input_.is_composing()) { - webwidget_->setComposition(WebKit::WebString(), - std::vector(), - 0, 0); - } - - ime_input_.ResetComposition(view_); - ime_input_.DestroyImeWindow(view_); - - // Let WTL call ::DefWindowProc() and release its resources. - handled = FALSE; - return 0; -} - -void WebWidgetHost::OnInputLangChange(DWORD character_set, - HKL input_language_id) { - if (!webwidget_) - return; - - // Send the given Locale ID to the ImeInput object and retrieves whether - // or not the current input context has IMEs. Toggle the timer based on - // whether the current input context has IMEs. - bool ime_status = ime_input_.SetInputLanguage(); - if (ime_status != ime_notification_) { - ime_notification_ = ime_status; - ToggleImeTimer(); - } -} - -void WebWidgetHost::UpdateImeInputState() { - if (!webwidget_ || !ime_notification_) { - ToggleImeTimer(); - return; - } - - WebKit::WebTextInputType type = webwidget_->textInputType(); - WebKit::WebRect caret_bounds; - - WebKit::WebRect startRect, endRect; - if (webwidget_->selectionBounds(startRect, endRect)) - caret_bounds = endRect; - - if (text_input_type_ != type) { - text_input_type_ = type; - if (type != WebKit::WebTextInputTypeNone) - ime_input_.EnableIME(view_); - else - ime_input_.DisableIME(view_); - } - - // Only update caret position if the input method is enabled and the caret - // position has changed. - if (type != WebKit::WebTextInputTypeNone && caret_bounds != caret_bounds_) { - caret_bounds_ = caret_bounds; - ime_input_.UpdateCaretRect(view_, caret_bounds); - } -} - -void WebWidgetHost::ToggleImeTimer() { - if (view_ && !popup_ && ime_notification_ && webwidget_) { - if (!ime_timer_.IsRunning()) { - ime_timer_.Start( - FROM_HERE, - base::TimeDelta::FromMilliseconds(200), - this, - &WebWidgetHost::UpdateImeInputState); - } - } else if (ime_timer_.IsRunning()) { - ime_timer_.Stop(); - } -} diff --git a/cef1/libcef/xml_reader_impl.cc b/cef1/libcef/xml_reader_impl.cc deleted file mode 100644 index 27a4106f7..000000000 --- a/cef1/libcef/xml_reader_impl.cc +++ /dev/null @@ -1,446 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/xml_reader_impl.h" -#include "include/cef_stream.h" -#include "base/logging.h" - -// Static functions - -// static -CefRefPtr CefXmlReader::Create(CefRefPtr stream, - EncodingType encodingType, - const CefString& URI) { - CefRefPtr impl(new CefXmlReaderImpl()); - if (!impl->Initialize(stream, encodingType, URI)) - return NULL; - return impl.get(); -} - - -// CefXmlReaderImpl - -namespace { - -/** - * xmlInputReadCallback: - * @context: an Input context - * @buffer: the buffer to store data read - * @len: the length of the buffer in bytes - * - * Callback used in the I/O Input API to read the resource - * - * Returns the number of bytes read or -1 in case of error - */ -int XMLCALL xml_read_callback(void * context, char * buffer, int len) { - CefRefPtr reader(static_cast(context)); - return reader->Read(buffer, 1, len); -} - -/** - * xmlTextReaderErrorFunc: - * @arg: the user argument - * @msg: the message - * @severity: the severity of the error - * @locator: a locator indicating where the error occured - * - * Signature of an error callback from a reader parser - */ -void XMLCALL xml_error_callback(void *arg, const char *msg, - xmlParserSeverities severity, - xmlTextReaderLocatorPtr locator) { - if (!msg) - return; - - std::string error_str(msg); - if (!error_str.empty() && error_str[error_str.length()-1] == '\n') - error_str.resize(error_str.length()-1); - - std::stringstream ss; - ss << error_str << ", line " << xmlTextReaderLocatorLineNumber(locator); - - LOG(INFO) << ss.str(); - - CefRefPtr impl(static_cast(arg)); - impl->AppendError(ss.str()); -} - -/** - * xmlStructuredErrorFunc: - * @userData: user provided data for the error callback - * @error: the error being raised. - * - * Signature of the function to use when there is an error and - * the module handles the new error reporting mechanism. - */ -void XMLCALL xml_structured_error_callback(void *userData, xmlErrorPtr error) { - if (!error->message) - return; - - std::string error_str(error->message); - if (!error_str.empty() && error_str[error_str.length()-1] == '\n') - error_str.resize(error_str.length()-1); - - std::stringstream ss; - ss << error_str << ", line " << error->line; - - LOG(INFO) << ss.str(); - - CefRefPtr impl(static_cast(userData)); - impl->AppendError(ss.str()); -} - -CefString xmlCharToString(const xmlChar* xmlStr, bool free) { - if (!xmlStr) - return CefString(); - - const char* str = reinterpret_cast(xmlStr); - CefString wstr = std::string(str); - - if (free) - xmlFree(const_cast(xmlStr)); - - return wstr; -} - -} // namespace - -CefXmlReaderImpl::CefXmlReaderImpl() - : supported_thread_id_(base::PlatformThread::CurrentId()), reader_(NULL) { -} - -CefXmlReaderImpl::~CefXmlReaderImpl() { - if (reader_ != NULL) { - if (!VerifyContext()) { - // Close() is supposed to be called directly. We'll try to free the reader - // now on the wrong thread but there's no guarantee this call won't crash. - xmlFreeTextReader(reader_); - } else { - Close(); - } - } -} - -bool CefXmlReaderImpl::Initialize(CefRefPtr stream, - EncodingType encodingType, - const CefString& URI) { - xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; - switch (encodingType) { - case XML_ENCODING_UTF8: - enc = XML_CHAR_ENCODING_UTF8; - break; - case XML_ENCODING_UTF16LE: - enc = XML_CHAR_ENCODING_UTF16LE; - break; - case XML_ENCODING_UTF16BE: - enc = XML_CHAR_ENCODING_UTF16BE; - break; - case XML_ENCODING_ASCII: - enc = XML_CHAR_ENCODING_ASCII; - break; - default: - break; - } - - // Create the input buffer. - xmlParserInputBufferPtr input_buffer = xmlAllocParserInputBuffer(enc); - if (!input_buffer) - return false; - - input_buffer->context = stream.get(); - input_buffer->readcallback = xml_read_callback; - - // Create the text reader. - std::string uriStr = URI; - reader_ = xmlNewTextReader(input_buffer, uriStr.c_str()); - if (!reader_) { - // Free the input buffer. - xmlFreeParserInputBuffer(input_buffer); - return false; - } - - // Keep a reference to the stream. - stream_ = stream; - - // Register the error callbacks. - xmlTextReaderSetErrorHandler(reader_, xml_error_callback, this); - xmlTextReaderSetStructuredErrorHandler(reader_, - xml_structured_error_callback, this); - - return true; -} - -bool CefXmlReaderImpl::MoveToNextNode() { - if (!VerifyContext()) - return false; - - return xmlTextReaderRead(reader_) == 1 ? true : false; -} - -bool CefXmlReaderImpl::Close() { - if (!VerifyContext()) - return false; - - // The input buffer will be freed automatically. - xmlFreeTextReader(reader_); - reader_ = NULL; - return true; -} - -bool CefXmlReaderImpl::HasError() { - if (!VerifyContext()) - return false; - - return !error_buf_.str().empty(); -} - -CefString CefXmlReaderImpl::GetError() { - if (!VerifyContext()) - return CefString(); - - return error_buf_.str(); -} - -CefXmlReader::NodeType CefXmlReaderImpl::GetType() { - if (!VerifyContext()) - return XML_NODE_UNSUPPORTED; - - switch (xmlTextReaderNodeType(reader_)) { - case XML_READER_TYPE_ELEMENT: - return XML_NODE_ELEMENT_START; - case XML_READER_TYPE_END_ELEMENT: - return XML_NODE_ELEMENT_END; - case XML_READER_TYPE_ATTRIBUTE: - return XML_NODE_ATTRIBUTE; - case XML_READER_TYPE_TEXT: - return XML_NODE_TEXT; - case XML_READER_TYPE_SIGNIFICANT_WHITESPACE: - case XML_READER_TYPE_WHITESPACE: - return XML_NODE_WHITESPACE; - case XML_READER_TYPE_CDATA: - return XML_NODE_CDATA; - case XML_READER_TYPE_ENTITY_REFERENCE: - return XML_NODE_ENTITY_REFERENCE; - case XML_READER_TYPE_PROCESSING_INSTRUCTION: - return XML_NODE_PROCESSING_INSTRUCTION; - case XML_READER_TYPE_COMMENT: - return XML_NODE_COMMENT; - case XML_READER_TYPE_DOCUMENT_TYPE: - return XML_NODE_DOCUMENT_TYPE; - default: - break; - } - - return XML_NODE_UNSUPPORTED; -} - -int CefXmlReaderImpl::GetDepth() { - if (!VerifyContext()) - return -1; - - return xmlTextReaderDepth(reader_); -} - -CefString CefXmlReaderImpl::GetLocalName() { - if (!VerifyContext()) - return CefString(); - - return xmlCharToString(xmlTextReaderConstLocalName(reader_), false); -} - -CefString CefXmlReaderImpl::GetPrefix() { - if (!VerifyContext()) - return CefString(); - - return xmlCharToString(xmlTextReaderConstPrefix(reader_), false); -} - -CefString CefXmlReaderImpl::GetQualifiedName() { - if (!VerifyContext()) - return CefString(); - - return xmlCharToString(xmlTextReaderConstName(reader_), false); -} - -CefString CefXmlReaderImpl::GetNamespaceURI() { - if (!VerifyContext()) - return CefString(); - - return xmlCharToString(xmlTextReaderConstNamespaceUri(reader_), false); -} - -CefString CefXmlReaderImpl::GetBaseURI() { - if (!VerifyContext()) - return CefString(); - - return xmlCharToString(xmlTextReaderConstBaseUri(reader_), false); -} - -CefString CefXmlReaderImpl::GetXmlLang() { - if (!VerifyContext()) - return CefString(); - - return xmlCharToString(xmlTextReaderConstXmlLang(reader_), false); -} - -bool CefXmlReaderImpl::IsEmptyElement() { - if (!VerifyContext()) - return false; - - return xmlTextReaderIsEmptyElement(reader_) == 1 ? true : false; -} - -bool CefXmlReaderImpl::HasValue() { - if (!VerifyContext()) - return false; - - if (xmlTextReaderNodeType(reader_) == XML_READER_TYPE_ENTITY_REFERENCE) { - // Provide special handling to return entity reference values. - return true; - } else { - return xmlTextReaderHasValue(reader_) == 1 ? true : false; - } -} - -CefString CefXmlReaderImpl::GetValue() { - if (!VerifyContext()) - return CefString(); - - if (xmlTextReaderNodeType(reader_) == XML_READER_TYPE_ENTITY_REFERENCE) { - // Provide special handling to return entity reference values. - xmlNodePtr node = xmlTextReaderCurrentNode(reader_); - if (node->content != NULL) - return xmlCharToString(node->content, false); - return CefString(); - } else { - return xmlCharToString(xmlTextReaderConstValue(reader_), false); - } -} - -bool CefXmlReaderImpl::HasAttributes() { - if (!VerifyContext()) - return false; - - return xmlTextReaderHasAttributes(reader_) == 1 ? true : false; -} - -size_t CefXmlReaderImpl::GetAttributeCount() { - if (!VerifyContext()) - return 0; - - return xmlTextReaderAttributeCount(reader_); -} - -CefString CefXmlReaderImpl::GetAttribute(int index) { - if (!VerifyContext()) - return CefString(); - - return xmlCharToString(xmlTextReaderGetAttributeNo(reader_, index), true); -} - -CefString CefXmlReaderImpl::GetAttribute(const CefString& qualifiedName) { - if (!VerifyContext()) - return CefString(); - - std::string qualifiedNameStr = qualifiedName; - return xmlCharToString(xmlTextReaderGetAttribute(reader_, - BAD_CAST qualifiedNameStr.c_str()), true); -} - -CefString CefXmlReaderImpl::GetAttribute(const CefString& localName, - const CefString& namespaceURI) { - if (!VerifyContext()) - return CefString(); - - std::string localNameStr = localName; - std::string namespaceURIStr = namespaceURI; - return xmlCharToString(xmlTextReaderGetAttributeNs(reader_, - BAD_CAST localNameStr.c_str(), BAD_CAST namespaceURIStr.c_str()), true); -} - -CefString CefXmlReaderImpl::GetInnerXml() { - if (!VerifyContext()) - return CefString(); - - return xmlCharToString(xmlTextReaderReadInnerXml(reader_), true); -} - -CefString CefXmlReaderImpl::GetOuterXml() { - if (!VerifyContext()) - return CefString(); - - return xmlCharToString(xmlTextReaderReadOuterXml(reader_), true); -} - -int CefXmlReaderImpl::GetLineNumber() { - if (!VerifyContext()) - return -1; - - return xmlTextReaderGetParserLineNumber(reader_); -} - -bool CefXmlReaderImpl::MoveToAttribute(int index) { - if (!VerifyContext()) - return false; - - return xmlTextReaderMoveToAttributeNo(reader_, index) == 1 ? true : false; -} - -bool CefXmlReaderImpl::MoveToAttribute(const CefString& qualifiedName) { - if (!VerifyContext()) - return false; - - std::string qualifiedNameStr = qualifiedName; - return xmlTextReaderMoveToAttribute(reader_, - BAD_CAST qualifiedNameStr.c_str()) == 1 ? true : false; -} - -bool CefXmlReaderImpl::MoveToAttribute(const CefString& localName, - const CefString& namespaceURI) { - if (!VerifyContext()) - return false; - - std::string localNameStr = localName; - std::string namespaceURIStr = namespaceURI; - return xmlTextReaderMoveToAttributeNs(reader_, - BAD_CAST localNameStr.c_str(), BAD_CAST namespaceURIStr.c_str()) == 1 ? - true : false; -} - -bool CefXmlReaderImpl::MoveToFirstAttribute() { - if (!VerifyContext()) - return false; - - return xmlTextReaderMoveToFirstAttribute(reader_) == 1 ? true : false; -} - -bool CefXmlReaderImpl::MoveToNextAttribute() { - if (!VerifyContext()) - return false; - - return xmlTextReaderMoveToNextAttribute(reader_) == 1 ? true : false; -} - -bool CefXmlReaderImpl::MoveToCarryingElement() { - if (!VerifyContext()) - return false; - - return xmlTextReaderMoveToElement(reader_) == 1 ? true : false; -} - -void CefXmlReaderImpl::AppendError(const CefString& error_str) { - if (!error_buf_.str().empty()) - error_buf_ << L"\n"; - error_buf_ << error_str; -} - -bool CefXmlReaderImpl::VerifyContext() { - if (base::PlatformThread::CurrentId() != supported_thread_id_) { - // This object should only be accessed from the thread that created it. - NOTREACHED(); - return false; - } - - return (reader_ != NULL); -} diff --git a/cef1/libcef/xml_reader_impl.h b/cef1/libcef/xml_reader_impl.h deleted file mode 100644 index 714be0a33..000000000 --- a/cef1/libcef/xml_reader_impl.h +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_XML_READER_IMPL_H_ -#define CEF_LIBCEF_XML_READER_IMPL_H_ -#pragma once - -#include -#include - -#include "include/cef_xml_reader.h" -#include "base/threading/platform_thread.h" - -// Implementation of CefXmlReader -class CefXmlReaderImpl : public CefXmlReader { - public: - CefXmlReaderImpl(); - ~CefXmlReaderImpl(); - - // Initialize the reader context. - bool Initialize(CefRefPtr stream, - EncodingType encodingType, const CefString& URI); - - virtual bool MoveToNextNode() OVERRIDE; - virtual bool Close() OVERRIDE; - virtual bool HasError() OVERRIDE; - virtual CefString GetError() OVERRIDE; - virtual NodeType GetType() OVERRIDE; - virtual int GetDepth() OVERRIDE; - virtual CefString GetLocalName() OVERRIDE; - virtual CefString GetPrefix() OVERRIDE; - virtual CefString GetQualifiedName() OVERRIDE; - virtual CefString GetNamespaceURI() OVERRIDE; - virtual CefString GetBaseURI() OVERRIDE; - virtual CefString GetXmlLang() OVERRIDE; - virtual bool IsEmptyElement() OVERRIDE; - virtual bool HasValue() OVERRIDE; - virtual CefString GetValue() OVERRIDE; - virtual bool HasAttributes() OVERRIDE; - virtual size_t GetAttributeCount() OVERRIDE; - virtual CefString GetAttribute(int index) OVERRIDE; - virtual CefString GetAttribute(const CefString& qualifiedName) OVERRIDE; - virtual CefString GetAttribute(const CefString& localName, - const CefString& namespaceURI) OVERRIDE; - virtual CefString GetInnerXml() OVERRIDE; - virtual CefString GetOuterXml() OVERRIDE; - virtual int GetLineNumber() OVERRIDE; - virtual bool MoveToAttribute(int index) OVERRIDE; - virtual bool MoveToAttribute(const CefString& qualifiedName) OVERRIDE; - virtual bool MoveToAttribute(const CefString& localName, - const CefString& namespaceURI) OVERRIDE; - virtual bool MoveToFirstAttribute() OVERRIDE; - virtual bool MoveToNextAttribute() OVERRIDE; - virtual bool MoveToCarryingElement() OVERRIDE; - - // Add another line to the error string. - void AppendError(const CefString& error_str); - - // Verify that the reader exists and is being accessed from the correct - // thread. - bool VerifyContext(); - - protected: - base::PlatformThreadId supported_thread_id_; - CefRefPtr stream_; - xmlTextReaderPtr reader_; - std::stringstream error_buf_; - - IMPLEMENT_REFCOUNTING(CefXMLReaderImpl); -}; - -#endif // CEF_LIBCEF_XML_READER_IMPL_H_ diff --git a/cef1/libcef/zip_reader_impl.cc b/cef1/libcef/zip_reader_impl.cc deleted file mode 100644 index 8ab50342a..000000000 --- a/cef1/libcef/zip_reader_impl.cc +++ /dev/null @@ -1,280 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "libcef/zip_reader_impl.h" -#include -#include "include/cef_stream.h" -#include "base/logging.h" - -// Static functions - -// static -CefRefPtr CefZipReader::Create( - CefRefPtr stream) { - CefRefPtr impl(new CefZipReaderImpl()); - if (!impl->Initialize(stream)) - return NULL; - return impl.get(); -} - - -// CefZipReaderImpl - -namespace { - -voidpf ZCALLBACK zlib_open_callback OF((voidpf opaque, const void* filename, - int mode)) { - // The stream is already implicitly open so just return the pointer. - return opaque; -} - -uLong ZCALLBACK zlib_read_callback OF((voidpf opaque, voidpf stream, void* buf, - uLong size)) { - CefRefPtr reader(static_cast(opaque)); - return reader->Read(buf, 1, size); -} - -ZPOS64_T ZCALLBACK zlib_tell_callback OF((voidpf opaque, voidpf stream)) { - CefRefPtr reader(static_cast(opaque)); - return reader->Tell(); -} - -long ZCALLBACK zlib_seek_callback OF((voidpf opaque, // NOLINT(runtime/int) - voidpf stream, ZPOS64_T offset, - int origin)) { - CefRefPtr reader(static_cast(opaque)); - int whence; - switch (origin) { - case ZLIB_FILEFUNC_SEEK_CUR: - whence = SEEK_CUR; - break; - case ZLIB_FILEFUNC_SEEK_END: - whence = SEEK_END; - break; - case ZLIB_FILEFUNC_SEEK_SET: - whence = SEEK_SET; - break; - default: - NOTREACHED(); - return -1; - } - return reader->Seek(offset, whence); -} - -int ZCALLBACK zlib_close_callback OF((voidpf opaque, voidpf stream)) { - CefRefPtr reader(static_cast(opaque)); - // Release the reference added by CefZipReaderImpl::Initialize(). - reader->Release(); - return 0; -} - -int ZCALLBACK zlib_error_callback OF((voidpf opaque, voidpf stream)) { - return 0; -} - -} // namespace - -CefZipReaderImpl::CefZipReaderImpl() - : supported_thread_id_(base::PlatformThread::CurrentId()), reader_(NULL), - has_fileopen_(false), - has_fileinfo_(false), - filesize_(0), - filemodified_(0) { -} - -CefZipReaderImpl::~CefZipReaderImpl() { - if (reader_ != NULL) { - if (!VerifyContext()) { - // Close() is supposed to be called directly. We'll try to free the reader - // now on the wrong thread but there's no guarantee this call won't crash. - if (has_fileopen_) - unzCloseCurrentFile(reader_); - unzClose(reader_); - } else { - Close(); - } - } -} - -bool CefZipReaderImpl::Initialize(CefRefPtr stream) { - zlib_filefunc64_def filefunc_def; - filefunc_def.zopen64_file = zlib_open_callback; - filefunc_def.zread_file = zlib_read_callback; - filefunc_def.zwrite_file = NULL; - filefunc_def.ztell64_file = zlib_tell_callback; - filefunc_def.zseek64_file = zlib_seek_callback; - filefunc_def.zclose_file = zlib_close_callback; - filefunc_def.zerror_file = zlib_error_callback; - filefunc_def.opaque = stream.get(); - - // Add a reference that will be released by zlib_close_callback(). - stream->AddRef(); - - reader_ = unzOpen2_64("", &filefunc_def); - return (reader_ != NULL); -} - -bool CefZipReaderImpl::MoveToFirstFile() { - if (!VerifyContext()) - return false; - - if (has_fileopen_) - CloseFile(); - - has_fileinfo_ = false; - - return (unzGoToFirstFile(reader_) == UNZ_OK); -} - -bool CefZipReaderImpl::MoveToNextFile() { - if (!VerifyContext()) - return false; - - if (has_fileopen_) - CloseFile(); - - has_fileinfo_ = false; - - return (unzGoToNextFile(reader_) == UNZ_OK); -} - -bool CefZipReaderImpl::MoveToFile(const CefString& fileName, - bool caseSensitive) { - if (!VerifyContext()) - return false; - - if (has_fileopen_) - CloseFile(); - - has_fileinfo_ = false; - - std::string fileNameStr = fileName; - return (unzLocateFile(reader_, fileNameStr.c_str(), - (caseSensitive ? 1 : 2)) == UNZ_OK); -} - -bool CefZipReaderImpl::Close() { - if (!VerifyContext()) - return false; - - if (has_fileopen_) - CloseFile(); - - int result = unzClose(reader_); - reader_ = NULL; - return (result == UNZ_OK); -} - -CefString CefZipReaderImpl::GetFileName() { - if (!VerifyContext() || !GetFileInfo()) - return CefString(); - - return filename_; -} - -int64 CefZipReaderImpl::GetFileSize() { - if (!VerifyContext() || !GetFileInfo()) - return -1; - - return filesize_; -} - -time_t CefZipReaderImpl::GetFileLastModified() { - if (!VerifyContext() || !GetFileInfo()) - return 0; - - return filemodified_; -} - -bool CefZipReaderImpl::OpenFile(const CefString& password) { - if (!VerifyContext()) - return false; - - if (has_fileopen_) - CloseFile(); - - bool ret; - - if (password.empty()) { - ret = (unzOpenCurrentFile(reader_) == UNZ_OK); - } else { - std::string passwordStr = password; - ret = (unzOpenCurrentFilePassword(reader_, passwordStr.c_str()) == UNZ_OK); - } - - if (ret) - has_fileopen_ = true; - return ret; -} - -bool CefZipReaderImpl::CloseFile() { - if (!VerifyContext() || !has_fileopen_) - return false; - - has_fileopen_ = false; - has_fileinfo_ = false; - - return (unzCloseCurrentFile(reader_) == UNZ_OK); -} - -int CefZipReaderImpl::ReadFile(void* buffer, size_t bufferSize) { - if (!VerifyContext() || !has_fileopen_) - return -1; - - return unzReadCurrentFile(reader_, buffer, bufferSize); -} - -int64 CefZipReaderImpl::Tell() { - if (!VerifyContext() || !has_fileopen_) - return -1; - - return unztell64(reader_); -} - -bool CefZipReaderImpl::Eof() { - if (!VerifyContext() || !has_fileopen_) - return true; - - return (unzeof(reader_) == 1 ? true : false); -} - -bool CefZipReaderImpl::GetFileInfo() { - if (has_fileinfo_) - return true; - - char file_name[512] = {0}; - unz_file_info file_info; - memset(&file_info, 0, sizeof(file_info)); - - if (unzGetCurrentFileInfo(reader_, &file_info, file_name, sizeof(file_name), - NULL, 0, NULL, 0) != UNZ_OK) { - return false; - } - - has_fileinfo_ = true; - filename_ = std::string(file_name); - filesize_ = file_info.uncompressed_size; - - struct tm time; - memset(&time, 0, sizeof(time)); - time.tm_sec = file_info.tmu_date.tm_sec; - time.tm_min = file_info.tmu_date.tm_min; - time.tm_hour = file_info.tmu_date.tm_hour; - time.tm_mday = file_info.tmu_date.tm_mday; - time.tm_mon = file_info.tmu_date.tm_mon; - time.tm_year = file_info.tmu_date.tm_year; - filemodified_ = mktime(&time); - - return true; -} - -bool CefZipReaderImpl::VerifyContext() { - if (base::PlatformThread::CurrentId() != supported_thread_id_) { - // This object should only be accessed from the thread that created it. - NOTREACHED(); - return false; - } - - return (reader_ != NULL); -} diff --git a/cef1/libcef/zip_reader_impl.h b/cef1/libcef/zip_reader_impl.h deleted file mode 100644 index fa8d194ad..000000000 --- a/cef1/libcef/zip_reader_impl.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_ZIP_READER_IMPL_H_ -#define CEF_LIBCEF_ZIP_READER_IMPL_H_ -#pragma once - -#include - -#include "include/cef_zip_reader.h" -#include "base/threading/platform_thread.h" -#include "third_party/zlib/contrib/minizip/unzip.h" - -// Implementation of CefZipReader -class CefZipReaderImpl : public CefZipReader { - public: - CefZipReaderImpl(); - ~CefZipReaderImpl(); - - // Initialize the reader context. - bool Initialize(CefRefPtr stream); - - virtual bool MoveToFirstFile(); - virtual bool MoveToNextFile(); - virtual bool MoveToFile(const CefString& fileName, bool caseSensitive); - virtual bool Close(); - virtual CefString GetFileName(); - virtual int64 GetFileSize(); - virtual time_t GetFileLastModified(); - virtual bool OpenFile(const CefString& password); - virtual bool CloseFile(); - virtual int ReadFile(void* buffer, size_t bufferSize); - virtual int64 Tell(); - virtual bool Eof(); - - bool GetFileInfo(); - - // Verify that the reader exists and is being accessed from the correct - // thread. - bool VerifyContext(); - - protected: - base::PlatformThreadId supported_thread_id_; - unzFile reader_; - bool has_fileopen_; - bool has_fileinfo_; - CefString filename_; - int64 filesize_; - time_t filemodified_; - - IMPLEMENT_REFCOUNTING(CefZipReaderImpl); -}; - -#endif // CEF_LIBCEF_ZIP_READER_IMPL_H_ diff --git a/cef1/libcef_dll/cef_logging.h b/cef1/libcef_dll/cef_logging.h deleted file mode 100644 index 5d28a004e..000000000 --- a/cef1/libcef_dll/cef_logging.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_DLL_CEF_LOGGING_H_ -#define CEF_LIBCEF_DLL_CEF_LOGGING_H_ -#pragma once - -#ifdef BUILDING_CEF_SHARED -#include "base/logging.h" -#else -#include // NOLINT(build/include_order) -#define DCHECK(condition) assert(condition) -#define DCHECK_EQ(val1, val2) DCHECK(val1 == val2) -#define DCHECK_NE(val1, val2) DCHECK(val1 != val2) -#define DCHECK_LE(val1, val2) DCHECK(val1 <= val2) -#define DCHECK_LT(val1, val2) DCHECK(val1 < val2) -#define DCHECK_GE(val1, val2) DCHECK(val1 >= val2) -#define DCHECK_GT(val1, val2) DCHECK(val1 > val2) -#endif - -#endif // CEF_LIBCEF_DLL_CEF_LOGGING_H_ diff --git a/cef1/libcef_dll/cpptoc/app_cpptoc.cc b/cef1/libcef_dll/cpptoc/app_cpptoc.cc deleted file mode 100644 index 9ba613da1..000000000 --- a/cef1/libcef_dll/cpptoc/app_cpptoc.cc +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/app_cpptoc.h" -#include "libcef_dll/cpptoc/proxy_handler_cpptoc.h" -#include "libcef_dll/cpptoc/resource_bundle_handler_cpptoc.h" -#include "libcef_dll/ctocpp/scheme_registrar_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK app_on_register_custom_schemes(struct _cef_app_t* self, - struct _cef_scheme_registrar_t* registrar) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: registrar; type: refptr_diff - DCHECK(registrar); - if (!registrar) - return; - - // Execute - CefAppCppToC::Get(self)->OnRegisterCustomSchemes( - CefSchemeRegistrarCToCpp::Wrap(registrar)); -} - -struct _cef_resource_bundle_handler_t* CEF_CALLBACK app_get_resource_bundle_handler( - struct _cef_app_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefAppCppToC::Get( - self)->GetResourceBundleHandler(); - - // Return type: refptr_same - return CefResourceBundleHandlerCppToC::Wrap(_retval); -} - -struct _cef_proxy_handler_t* CEF_CALLBACK app_get_proxy_handler( - struct _cef_app_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefAppCppToC::Get(self)->GetProxyHandler( - ); - - // Return type: refptr_same - return CefProxyHandlerCppToC::Wrap(_retval); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefAppCppToC::CefAppCppToC(CefApp* cls) - : CefCppToC(cls) { - struct_.struct_.on_register_custom_schemes = app_on_register_custom_schemes; - struct_.struct_.get_resource_bundle_handler = app_get_resource_bundle_handler; - struct_.struct_.get_proxy_handler = app_get_proxy_handler; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/app_cpptoc.h b/cef1/libcef_dll/cpptoc/app_cpptoc.h deleted file mode 100644 index 3daad00fc..000000000 --- a/cef1/libcef_dll/cpptoc/app_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_APP_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_APP_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_app.h" -#include "include/capi/cef_app_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefAppCppToC - : public CefCppToC { - public: - explicit CefAppCppToC(CefApp* cls); - virtual ~CefAppCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_APP_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/base_cpptoc.h b/cef1/libcef_dll/cpptoc/base_cpptoc.h deleted file mode 100644 index 1184d718a..000000000 --- a/cef1/libcef_dll/cpptoc/base_cpptoc.h +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_DLL_CPPTOC_BASE_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_BASE_CPPTOC_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/capi/cef_base_capi.h" -#include "libcef_dll/cef_logging.h" - - -// CefCppToC implementation for CefBase. -class CefBaseCppToC : public CefBase { - public: - // Use this method to retrieve the underlying class instance from our - // own structure when the structure is passed as the required first - // parameter of a C API function call. No explicit reference counting - // is done in this case. - static CefRefPtr Get(cef_base_t* s) { - DCHECK(s); - - // Cast our structure to the wrapper structure type. - CefBaseCppToC::Struct* wrapperStruct = - reinterpret_cast(s); - // Return the underlying object instance. - return wrapperStruct->class_->GetClass(); - } - - // Use this method to create a wrapper structure for passing our class - // instance to the other side. - static cef_base_t* Wrap(CefRefPtr c) { - if (!c.get()) - return NULL; - - // Wrap our object with the CefCppToC class. - CefBaseCppToC* wrapper = new CefBaseCppToC(c); - // Add a reference to our wrapper object that will be released once our - // structure arrives on the other side. - wrapper->AddRef(); - // Return the structure pointer that can now be passed to the other side. - return wrapper->GetStruct(); - } - - // Use this method to retrieve the underlying class instance when receiving - // our wrapper structure back from the other side. - static CefRefPtr Unwrap(cef_base_t* s) { - if (!s) - return NULL; - - // Cast our structure to the wrapper structure type. - CefBaseCppToC::Struct* wrapperStruct = - reinterpret_cast(s); - // Add the underlying object instance to a smart pointer. - CefRefPtr objectPtr(wrapperStruct->class_->GetClass()); - // Release the reference to our wrapper object that was added before the - // structure was passed back to us. - wrapperStruct->class_->Release(); - // Return the underlying object instance. - return objectPtr; - } - - // Structure representation with pointer to the C++ class. - struct Struct { - cef_base_t struct_; - CefBaseCppToC* class_; - }; - - explicit CefBaseCppToC(CefBase* cls) - : class_(cls) { - DCHECK(cls); - - struct_.class_ = this; - - // zero the underlying structure and set base members - memset(&struct_.struct_, 0, sizeof(cef_base_t)); - struct_.struct_.size = sizeof(cef_base_t); - struct_.struct_.add_ref = struct_add_ref; - struct_.struct_.release = struct_release; - struct_.struct_.get_refct = struct_get_refct; - } - virtual ~CefBaseCppToC() {} - - CefBase* GetClass() { return class_; } - - // If returning the structure across the DLL boundary you should call - // AddRef() on this CefCppToC object. On the other side of the DLL boundary, - // call UnderlyingRelease() on the wrapping CefCToCpp object. - cef_base_t* GetStruct() { return &struct_.struct_; } - - // CefBase methods increment/decrement reference counts on both this object - // and the underlying wrapper class. - int AddRef() { - UnderlyingAddRef(); - return refct_.AddRef(); - } - int Release() { - UnderlyingRelease(); - int retval = refct_.Release(); - if (retval == 0) - delete this; - return retval; - } - int GetRefCt() { return refct_.GetRefCt(); } - - // Increment/decrement reference counts on only the underlying class. - int UnderlyingAddRef() { return class_->AddRef(); } - int UnderlyingRelease() { return class_->Release(); } - int UnderlyingGetRefCt() { return class_->GetRefCt(); } - - private: - static int CEF_CALLBACK struct_add_ref(struct _cef_base_t* base) { - DCHECK(base); - if (!base) - return 0; - - Struct* impl = reinterpret_cast(base); - return impl->class_->AddRef(); - } - - static int CEF_CALLBACK struct_release(struct _cef_base_t* base) { - DCHECK(base); - if (!base) - return 0; - - Struct* impl = reinterpret_cast(base); - return impl->class_->Release(); - } - - static int CEF_CALLBACK struct_get_refct(struct _cef_base_t* base) { - DCHECK(base); - if (!base) - return 0; - - Struct* impl = reinterpret_cast(base); - return impl->class_->GetRefCt(); - } - - protected: - CefRefCount refct_; - Struct struct_; - CefBase* class_; -}; - -#endif // CEF_LIBCEF_DLL_CPPTOC_BASE_CPPTOC_H_ diff --git a/cef1/libcef_dll/cpptoc/browser_cpptoc.cc b/cef1/libcef_dll/cpptoc/browser_cpptoc.cc deleted file mode 100644 index 53b017e52..000000000 --- a/cef1/libcef_dll/cpptoc/browser_cpptoc.cc +++ /dev/null @@ -1,772 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/frame_cpptoc.h" -#include "libcef_dll/ctocpp/client_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT int cef_browser_create(cef_window_info_t* windowInfo, - struct _cef_client_t* client, const cef_string_t* url, - const struct _cef_browser_settings_t* settings) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: windowInfo; type: struct_byref - DCHECK(windowInfo); - if (!windowInfo) - return 0; - // Verify param: client; type: refptr_diff - DCHECK(client); - if (!client) - return 0; - // Verify param: settings; type: struct_byref_const - DCHECK(settings); - if (!settings) - return 0; - // Unverified params: url - - // Translate param: windowInfo; type: struct_byref - CefWindowInfo windowInfoObj; - if (windowInfo) - windowInfoObj.AttachTo(*windowInfo); - // Translate param: settings; type: struct_byref_const - CefBrowserSettings settingsObj; - if (settings) - settingsObj.Set(*settings, false); - - // Execute - bool _retval = CefBrowser::CreateBrowser( - windowInfoObj, - CefClientCToCpp::Wrap(client), - CefString(url), - settingsObj); - - // Restore param: windowInfo; type: struct_byref - if (windowInfo) - windowInfoObj.DetachTo(*windowInfo); - - // Return type: bool - return _retval; -} - -CEF_EXPORT cef_browser_t* cef_browser_create_sync(cef_window_info_t* windowInfo, - struct _cef_client_t* client, const cef_string_t* url, - const struct _cef_browser_settings_t* settings) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: windowInfo; type: struct_byref - DCHECK(windowInfo); - if (!windowInfo) - return NULL; - // Verify param: client; type: refptr_diff - DCHECK(client); - if (!client) - return NULL; - // Verify param: settings; type: struct_byref_const - DCHECK(settings); - if (!settings) - return NULL; - // Unverified params: url - - // Translate param: windowInfo; type: struct_byref - CefWindowInfo windowInfoObj; - if (windowInfo) - windowInfoObj.AttachTo(*windowInfo); - // Translate param: settings; type: struct_byref_const - CefBrowserSettings settingsObj; - if (settings) - settingsObj.Set(*settings, false); - - // Execute - CefRefPtr _retval = CefBrowser::CreateBrowserSync( - windowInfoObj, - CefClientCToCpp::Wrap(client), - CefString(url), - settingsObj); - - // Restore param: windowInfo; type: struct_byref - if (windowInfo) - windowInfoObj.DetachTo(*windowInfo); - - // Return type: refptr_same - return CefBrowserCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK browser_parent_window_will_close( - struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->ParentWindowWillClose(); -} - -void CEF_CALLBACK browser_close_browser(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->CloseBrowser(); -} - -int CEF_CALLBACK browser_can_go_back(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefBrowserCppToC::Get(self)->CanGoBack(); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK browser_go_back(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->GoBack(); -} - -int CEF_CALLBACK browser_can_go_forward(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefBrowserCppToC::Get(self)->CanGoForward(); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK browser_go_forward(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->GoForward(); -} - -void CEF_CALLBACK browser_reload(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->Reload(); -} - -void CEF_CALLBACK browser_reload_ignore_cache(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->ReloadIgnoreCache(); -} - -void CEF_CALLBACK browser_stop_load(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->StopLoad(); -} - -void CEF_CALLBACK browser_set_focus(struct _cef_browser_t* self, int enable) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->SetFocus( - enable?true:false); -} - -cef_window_handle_t CEF_CALLBACK browser_get_window_handle( - struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - cef_window_handle_t _retval = CefBrowserCppToC::Get(self)->GetWindowHandle(); - - // Return type: simple - return _retval; -} - -cef_window_handle_t CEF_CALLBACK browser_get_opener_window_handle( - struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - cef_window_handle_t _retval = CefBrowserCppToC::Get( - self)->GetOpenerWindowHandle(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK browser_get_identifier(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefBrowserCppToC::Get(self)->GetIdentifier(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK browser_is_popup(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefBrowserCppToC::Get(self)->IsPopup(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK browser_has_document(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefBrowserCppToC::Get(self)->HasDocument(); - - // Return type: bool - return _retval; -} - -struct _cef_client_t* CEF_CALLBACK browser_get_client( - struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefBrowserCppToC::Get(self)->GetClient(); - - // Return type: refptr_diff - return CefClientCToCpp::Unwrap(_retval); -} - -struct _cef_frame_t* CEF_CALLBACK browser_get_main_frame( - struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefBrowserCppToC::Get(self)->GetMainFrame(); - - // Return type: refptr_same - return CefFrameCppToC::Wrap(_retval); -} - -struct _cef_frame_t* CEF_CALLBACK browser_get_focused_frame( - struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefBrowserCppToC::Get(self)->GetFocusedFrame(); - - // Return type: refptr_same - return CefFrameCppToC::Wrap(_retval); -} - -struct _cef_frame_t* CEF_CALLBACK browser_get_frame(struct _cef_browser_t* self, - const cef_string_t* name) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: name; type: string_byref_const - DCHECK(name); - if (!name) - return NULL; - - // Execute - CefRefPtr _retval = CefBrowserCppToC::Get(self)->GetFrame( - CefString(name)); - - // Return type: refptr_same - return CefFrameCppToC::Wrap(_retval); -} - -void CEF_CALLBACK browser_get_frame_names(struct _cef_browser_t* self, - cef_string_list_t names) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: names; type: string_vec_byref - DCHECK(names); - if (!names) - return; - - // Translate param: names; type: string_vec_byref - std::vector namesList; - transfer_string_list_contents(names, namesList); - - // Execute - CefBrowserCppToC::Get(self)->GetFrameNames( - namesList); - - // Restore param: names; type: string_vec_byref - cef_string_list_clear(names); - transfer_string_list_contents(namesList, names); -} - -void CEF_CALLBACK browser_find(struct _cef_browser_t* self, int identifier, - const cef_string_t* searchText, int forward, int matchCase, - int findNext) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: searchText; type: string_byref_const - DCHECK(searchText); - if (!searchText) - return; - - // Execute - CefBrowserCppToC::Get(self)->Find( - identifier, - CefString(searchText), - forward?true:false, - matchCase?true:false, - findNext?true:false); -} - -void CEF_CALLBACK browser_stop_finding(struct _cef_browser_t* self, - int clearSelection) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->StopFinding( - clearSelection?true:false); -} - -double CEF_CALLBACK browser_get_zoom_level(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - double _retval = CefBrowserCppToC::Get(self)->GetZoomLevel(); - - // Return type: simple - return _retval; -} - -void CEF_CALLBACK browser_set_zoom_level(struct _cef_browser_t* self, - double zoomLevel) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->SetZoomLevel( - zoomLevel); -} - -void CEF_CALLBACK browser_clear_history(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->ClearHistory(); -} - -void CEF_CALLBACK browser_show_dev_tools(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->ShowDevTools(); -} - -void CEF_CALLBACK browser_close_dev_tools(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->CloseDevTools(); -} - -int CEF_CALLBACK browser_is_window_rendering_disabled( - struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefBrowserCppToC::Get(self)->IsWindowRenderingDisabled(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK browser_get_size(struct _cef_browser_t* self, - enum cef_paint_element_type_t type, int* width, int* height) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: width; type: simple_byref - DCHECK(width); - if (!width) - return 0; - // Verify param: height; type: simple_byref - DCHECK(height); - if (!height) - return 0; - - // Translate param: width; type: simple_byref - int widthVal = width?*width:0; - // Translate param: height; type: simple_byref - int heightVal = height?*height:0; - - // Execute - bool _retval = CefBrowserCppToC::Get(self)->GetSize( - type, - widthVal, - heightVal); - - // Restore param: width; type: simple_byref - if (width) - *width = widthVal; - // Restore param: height; type: simple_byref - if (height) - *height = heightVal; - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK browser_set_size(struct _cef_browser_t* self, - enum cef_paint_element_type_t type, int width, int height) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->SetSize( - type, - width, - height); -} - -int CEF_CALLBACK browser_is_popup_visible(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefBrowserCppToC::Get(self)->IsPopupVisible(); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK browser_hide_popup(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->HidePopup(); -} - -void CEF_CALLBACK browser_invalidate(struct _cef_browser_t* self, - const cef_rect_t* dirtyRect) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: dirtyRect; type: simple_byref_const - DCHECK(dirtyRect); - if (!dirtyRect) - return; - - // Translate param: dirtyRect; type: simple_byref_const - CefRect dirtyRectVal = dirtyRect?*dirtyRect:CefRect(); - - // Execute - CefBrowserCppToC::Get(self)->Invalidate( - dirtyRectVal); -} - -int CEF_CALLBACK browser_get_image(struct _cef_browser_t* self, - enum cef_paint_element_type_t type, int width, int height, void* buffer) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: buffer; type: simple_byaddr - DCHECK(buffer); - if (!buffer) - return 0; - - // Execute - bool _retval = CefBrowserCppToC::Get(self)->GetImage( - type, - width, - height, - buffer); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK browser_send_key_event(struct _cef_browser_t* self, - enum cef_key_type_t type, const struct _cef_key_info_t* keyInfo, - int modifiers) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: keyInfo; type: struct_byref_const - DCHECK(keyInfo); - if (!keyInfo) - return; - - // Translate param: keyInfo; type: struct_byref_const - CefKeyInfo keyInfoObj; - if (keyInfo) - keyInfoObj.Set(*keyInfo, false); - - // Execute - CefBrowserCppToC::Get(self)->SendKeyEvent( - type, - keyInfoObj, - modifiers); -} - -void CEF_CALLBACK browser_send_mouse_click_event(struct _cef_browser_t* self, - int x, int y, enum cef_mouse_button_type_t type, int mouseUp, - int clickCount) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->SendMouseClickEvent( - x, - y, - type, - mouseUp?true:false, - clickCount); -} - -void CEF_CALLBACK browser_send_mouse_move_event(struct _cef_browser_t* self, - int x, int y, int mouseLeave) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->SendMouseMoveEvent( - x, - y, - mouseLeave?true:false); -} - -void CEF_CALLBACK browser_send_mouse_wheel_event(struct _cef_browser_t* self, - int x, int y, int deltaX, int deltaY) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->SendMouseWheelEvent( - x, - y, - deltaX, - deltaY); -} - -void CEF_CALLBACK browser_send_focus_event(struct _cef_browser_t* self, - int setFocus) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->SendFocusEvent( - setFocus?true:false); -} - -void CEF_CALLBACK browser_send_capture_lost_event(struct _cef_browser_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefBrowserCppToC::Get(self)->SendCaptureLostEvent(); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefBrowserCppToC::CefBrowserCppToC(CefBrowser* cls) - : CefCppToC(cls) { - struct_.struct_.parent_window_will_close = browser_parent_window_will_close; - struct_.struct_.close_browser = browser_close_browser; - struct_.struct_.can_go_back = browser_can_go_back; - struct_.struct_.go_back = browser_go_back; - struct_.struct_.can_go_forward = browser_can_go_forward; - struct_.struct_.go_forward = browser_go_forward; - struct_.struct_.reload = browser_reload; - struct_.struct_.reload_ignore_cache = browser_reload_ignore_cache; - struct_.struct_.stop_load = browser_stop_load; - struct_.struct_.set_focus = browser_set_focus; - struct_.struct_.get_window_handle = browser_get_window_handle; - struct_.struct_.get_opener_window_handle = browser_get_opener_window_handle; - struct_.struct_.get_identifier = browser_get_identifier; - struct_.struct_.is_popup = browser_is_popup; - struct_.struct_.has_document = browser_has_document; - struct_.struct_.get_client = browser_get_client; - struct_.struct_.get_main_frame = browser_get_main_frame; - struct_.struct_.get_focused_frame = browser_get_focused_frame; - struct_.struct_.get_frame = browser_get_frame; - struct_.struct_.get_frame_names = browser_get_frame_names; - struct_.struct_.find = browser_find; - struct_.struct_.stop_finding = browser_stop_finding; - struct_.struct_.get_zoom_level = browser_get_zoom_level; - struct_.struct_.set_zoom_level = browser_set_zoom_level; - struct_.struct_.clear_history = browser_clear_history; - struct_.struct_.show_dev_tools = browser_show_dev_tools; - struct_.struct_.close_dev_tools = browser_close_dev_tools; - struct_.struct_.is_window_rendering_disabled = - browser_is_window_rendering_disabled; - struct_.struct_.get_size = browser_get_size; - struct_.struct_.set_size = browser_set_size; - struct_.struct_.is_popup_visible = browser_is_popup_visible; - struct_.struct_.hide_popup = browser_hide_popup; - struct_.struct_.invalidate = browser_invalidate; - struct_.struct_.get_image = browser_get_image; - struct_.struct_.send_key_event = browser_send_key_event; - struct_.struct_.send_mouse_click_event = browser_send_mouse_click_event; - struct_.struct_.send_mouse_move_event = browser_send_mouse_move_event; - struct_.struct_.send_mouse_wheel_event = browser_send_mouse_wheel_event; - struct_.struct_.send_focus_event = browser_send_focus_event; - struct_.struct_.send_capture_lost_event = browser_send_capture_lost_event; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/browser_cpptoc.h b/cef1/libcef_dll/cpptoc/browser_cpptoc.h deleted file mode 100644 index 2a6d25dcb..000000000 --- a/cef1/libcef_dll/cpptoc/browser_cpptoc.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_BROWSER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_BROWSER_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_browser.h" -#include "include/capi/cef_browser_capi.h" -#include "include/cef_client.h" -#include "include/capi/cef_client_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefBrowserCppToC - : public CefCppToC { - public: - explicit CefBrowserCppToC(CefBrowser* cls); - virtual ~CefBrowserCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_BROWSER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/client_cpptoc.cc b/cef1/libcef_dll/cpptoc/client_cpptoc.cc deleted file mode 100644 index 301b0165c..000000000 --- a/cef1/libcef_dll/cpptoc/client_cpptoc.cc +++ /dev/null @@ -1,317 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/client_cpptoc.h" -#include "libcef_dll/cpptoc/display_handler_cpptoc.h" -#include "libcef_dll/cpptoc/drag_handler_cpptoc.h" -#include "libcef_dll/cpptoc/find_handler_cpptoc.h" -#include "libcef_dll/cpptoc/focus_handler_cpptoc.h" -#include "libcef_dll/cpptoc/geolocation_handler_cpptoc.h" -#include "libcef_dll/cpptoc/jsdialog_handler_cpptoc.h" -#include "libcef_dll/cpptoc/keyboard_handler_cpptoc.h" -#include "libcef_dll/cpptoc/life_span_handler_cpptoc.h" -#include "libcef_dll/cpptoc/load_handler_cpptoc.h" -#include "libcef_dll/cpptoc/menu_handler_cpptoc.h" -#include "libcef_dll/cpptoc/permission_handler_cpptoc.h" -#include "libcef_dll/cpptoc/print_handler_cpptoc.h" -#include "libcef_dll/cpptoc/render_handler_cpptoc.h" -#include "libcef_dll/cpptoc/request_handler_cpptoc.h" -#include "libcef_dll/cpptoc/v8context_handler_cpptoc.h" -#include "libcef_dll/cpptoc/zoom_handler_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -struct _cef_life_span_handler_t* CEF_CALLBACK client_get_life_span_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetLifeSpanHandler(); - - // Return type: refptr_same - return CefLifeSpanHandlerCppToC::Wrap(_retval); -} - -struct _cef_load_handler_t* CEF_CALLBACK client_get_load_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetLoadHandler(); - - // Return type: refptr_same - return CefLoadHandlerCppToC::Wrap(_retval); -} - -struct _cef_request_handler_t* CEF_CALLBACK client_get_request_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetRequestHandler(); - - // Return type: refptr_same - return CefRequestHandlerCppToC::Wrap(_retval); -} - -struct _cef_display_handler_t* CEF_CALLBACK client_get_display_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetDisplayHandler(); - - // Return type: refptr_same - return CefDisplayHandlerCppToC::Wrap(_retval); -} - -struct _cef_focus_handler_t* CEF_CALLBACK client_get_focus_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetFocusHandler(); - - // Return type: refptr_same - return CefFocusHandlerCppToC::Wrap(_retval); -} - -struct _cef_keyboard_handler_t* CEF_CALLBACK client_get_keyboard_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetKeyboardHandler(); - - // Return type: refptr_same - return CefKeyboardHandlerCppToC::Wrap(_retval); -} - -struct _cef_menu_handler_t* CEF_CALLBACK client_get_menu_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetMenuHandler(); - - // Return type: refptr_same - return CefMenuHandlerCppToC::Wrap(_retval); -} - -struct _cef_permission_handler_t* CEF_CALLBACK client_get_permission_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetPermissionHandler(); - - // Return type: refptr_same - return CefPermissionHandlerCppToC::Wrap(_retval); -} - -struct _cef_print_handler_t* CEF_CALLBACK client_get_print_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetPrintHandler(); - - // Return type: refptr_same - return CefPrintHandlerCppToC::Wrap(_retval); -} - -struct _cef_find_handler_t* CEF_CALLBACK client_get_find_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetFindHandler(); - - // Return type: refptr_same - return CefFindHandlerCppToC::Wrap(_retval); -} - -struct _cef_jsdialog_handler_t* CEF_CALLBACK client_get_jsdialog_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetJSDialogHandler(); - - // Return type: refptr_same - return CefJSDialogHandlerCppToC::Wrap(_retval); -} - -struct _cef_v8context_handler_t* CEF_CALLBACK client_get_v8context_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetV8ContextHandler(); - - // Return type: refptr_same - return CefV8ContextHandlerCppToC::Wrap(_retval); -} - -struct _cef_render_handler_t* CEF_CALLBACK client_get_render_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetRenderHandler(); - - // Return type: refptr_same - return CefRenderHandlerCppToC::Wrap(_retval); -} - -struct _cef_drag_handler_t* CEF_CALLBACK client_get_drag_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetDragHandler(); - - // Return type: refptr_same - return CefDragHandlerCppToC::Wrap(_retval); -} - -struct _cef_geolocation_handler_t* CEF_CALLBACK client_get_geolocation_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetGeolocationHandler(); - - // Return type: refptr_same - return CefGeolocationHandlerCppToC::Wrap(_retval); -} - -struct _cef_zoom_handler_t* CEF_CALLBACK client_get_zoom_handler( - struct _cef_client_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefClientCppToC::Get( - self)->GetZoomHandler(); - - // Return type: refptr_same - return CefZoomHandlerCppToC::Wrap(_retval); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefClientCppToC::CefClientCppToC(CefClient* cls) - : CefCppToC(cls) { - struct_.struct_.get_life_span_handler = client_get_life_span_handler; - struct_.struct_.get_load_handler = client_get_load_handler; - struct_.struct_.get_request_handler = client_get_request_handler; - struct_.struct_.get_display_handler = client_get_display_handler; - struct_.struct_.get_focus_handler = client_get_focus_handler; - struct_.struct_.get_keyboard_handler = client_get_keyboard_handler; - struct_.struct_.get_menu_handler = client_get_menu_handler; - struct_.struct_.get_permission_handler = client_get_permission_handler; - struct_.struct_.get_print_handler = client_get_print_handler; - struct_.struct_.get_find_handler = client_get_find_handler; - struct_.struct_.get_jsdialog_handler = client_get_jsdialog_handler; - struct_.struct_.get_v8context_handler = client_get_v8context_handler; - struct_.struct_.get_render_handler = client_get_render_handler; - struct_.struct_.get_drag_handler = client_get_drag_handler; - struct_.struct_.get_geolocation_handler = client_get_geolocation_handler; - struct_.struct_.get_zoom_handler = client_get_zoom_handler; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/client_cpptoc.h b/cef1/libcef_dll/cpptoc/client_cpptoc.h deleted file mode 100644 index 93731f15d..000000000 --- a/cef1/libcef_dll/cpptoc/client_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_CLIENT_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_CLIENT_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_client.h" -#include "include/capi/cef_client_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefClientCppToC - : public CefCppToC { - public: - explicit CefClientCppToC(CefClient* cls); - virtual ~CefClientCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_CLIENT_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/command_line_cpptoc.cc b/cef1/libcef_dll/cpptoc/command_line_cpptoc.cc deleted file mode 100644 index f5ac93d29..000000000 --- a/cef1/libcef_dll/cpptoc/command_line_cpptoc.cc +++ /dev/null @@ -1,316 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/command_line_cpptoc.h" -#include "libcef_dll/transfer_util.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_command_line_t* cef_command_line_create() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefCommandLine::CreateCommandLine(); - - // Return type: refptr_same - return CefCommandLineCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK command_line_init_from_argv(struct _cef_command_line_t* self, - int argc, const char* const* argv) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: argv; type: simple_byaddr - DCHECK(argv); - if (!argv) - return; - - // Execute - CefCommandLineCppToC::Get(self)->InitFromArgv( - argc, - argv); -} - -void CEF_CALLBACK command_line_init_from_string( - struct _cef_command_line_t* self, const cef_string_t* command_line) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: command_line; type: string_byref_const - DCHECK(command_line); - if (!command_line) - return; - - // Execute - CefCommandLineCppToC::Get(self)->InitFromString( - CefString(command_line)); -} - -cef_string_userfree_t CEF_CALLBACK command_line_get_command_line_string( - struct _cef_command_line_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefCommandLineCppToC::Get(self)->GetCommandLineString(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK command_line_get_program( - struct _cef_command_line_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefCommandLineCppToC::Get(self)->GetProgram(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -void CEF_CALLBACK command_line_set_program(struct _cef_command_line_t* self, - const cef_string_t* program) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: program; type: string_byref_const - DCHECK(program); - if (!program) - return; - - // Execute - CefCommandLineCppToC::Get(self)->SetProgram( - CefString(program)); -} - -int CEF_CALLBACK command_line_has_switches(struct _cef_command_line_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefCommandLineCppToC::Get(self)->HasSwitches(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK command_line_has_switch(struct _cef_command_line_t* self, - const cef_string_t* name) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: name; type: string_byref_const - DCHECK(name); - if (!name) - return 0; - - // Execute - bool _retval = CefCommandLineCppToC::Get(self)->HasSwitch( - CefString(name)); - - // Return type: bool - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK command_line_get_switch_value( - struct _cef_command_line_t* self, const cef_string_t* name) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: name; type: string_byref_const - DCHECK(name); - if (!name) - return NULL; - - // Execute - CefString _retval = CefCommandLineCppToC::Get(self)->GetSwitchValue( - CefString(name)); - - // Return type: string - return _retval.DetachToUserFree(); -} - -void CEF_CALLBACK command_line_get_switches(struct _cef_command_line_t* self, - cef_string_map_t switches) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: switches; type: string_map_single_byref - DCHECK(switches); - if (!switches) - return; - - // Translate param: switches; type: string_map_single_byref - std::map switchesMap; - transfer_string_map_contents(switches, switchesMap); - - // Execute - CefCommandLineCppToC::Get(self)->GetSwitches( - switchesMap); - - // Restore param: switches; type: string_map_single_byref - cef_string_map_clear(switches); - transfer_string_map_contents(switchesMap, switches); -} - -void CEF_CALLBACK command_line_append_switch(struct _cef_command_line_t* self, - const cef_string_t* name) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: name; type: string_byref_const - DCHECK(name); - if (!name) - return; - - // Execute - CefCommandLineCppToC::Get(self)->AppendSwitch( - CefString(name)); -} - -void CEF_CALLBACK command_line_append_switch_with_value( - struct _cef_command_line_t* self, const cef_string_t* name, - const cef_string_t* value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: name; type: string_byref_const - DCHECK(name); - if (!name) - return; - // Verify param: value; type: string_byref_const - DCHECK(value); - if (!value) - return; - - // Execute - CefCommandLineCppToC::Get(self)->AppendSwitchWithValue( - CefString(name), - CefString(value)); -} - -int CEF_CALLBACK command_line_has_arguments(struct _cef_command_line_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefCommandLineCppToC::Get(self)->HasArguments(); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK command_line_get_arguments(struct _cef_command_line_t* self, - cef_string_list_t arguments) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: arguments; type: string_vec_byref - DCHECK(arguments); - if (!arguments) - return; - - // Translate param: arguments; type: string_vec_byref - std::vector argumentsList; - transfer_string_list_contents(arguments, argumentsList); - - // Execute - CefCommandLineCppToC::Get(self)->GetArguments( - argumentsList); - - // Restore param: arguments; type: string_vec_byref - cef_string_list_clear(arguments); - transfer_string_list_contents(argumentsList, arguments); -} - -void CEF_CALLBACK command_line_append_argument(struct _cef_command_line_t* self, - const cef_string_t* argument) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: argument; type: string_byref_const - DCHECK(argument); - if (!argument) - return; - - // Execute - CefCommandLineCppToC::Get(self)->AppendArgument( - CefString(argument)); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefCommandLineCppToC::CefCommandLineCppToC(CefCommandLine* cls) - : CefCppToC(cls) { - struct_.struct_.init_from_argv = command_line_init_from_argv; - struct_.struct_.init_from_string = command_line_init_from_string; - struct_.struct_.get_command_line_string = - command_line_get_command_line_string; - struct_.struct_.get_program = command_line_get_program; - struct_.struct_.set_program = command_line_set_program; - struct_.struct_.has_switches = command_line_has_switches; - struct_.struct_.has_switch = command_line_has_switch; - struct_.struct_.get_switch_value = command_line_get_switch_value; - struct_.struct_.get_switches = command_line_get_switches; - struct_.struct_.append_switch = command_line_append_switch; - struct_.struct_.append_switch_with_value = - command_line_append_switch_with_value; - struct_.struct_.has_arguments = command_line_has_arguments; - struct_.struct_.get_arguments = command_line_get_arguments; - struct_.struct_.append_argument = command_line_append_argument; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/command_line_cpptoc.h b/cef1/libcef_dll/cpptoc/command_line_cpptoc.h deleted file mode 100644 index 38e0856b0..000000000 --- a/cef1/libcef_dll/cpptoc/command_line_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_COMMAND_LINE_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_COMMAND_LINE_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_command_line.h" -#include "include/capi/cef_command_line_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefCommandLineCppToC - : public CefCppToC { - public: - explicit CefCommandLineCppToC(CefCommandLine* cls); - virtual ~CefCommandLineCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_COMMAND_LINE_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/content_filter_cpptoc.cc b/cef1/libcef_dll/cpptoc/content_filter_cpptoc.cc deleted file mode 100644 index dfdc9f11b..000000000 --- a/cef1/libcef_dll/cpptoc/content_filter_cpptoc.cc +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/content_filter_cpptoc.h" -#include "libcef_dll/ctocpp/stream_reader_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK content_filter_process_data( - struct _cef_content_filter_t* self, const void* data, int data_size, - struct _cef_stream_reader_t** substitute_data) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: data; type: simple_byaddr - DCHECK(data); - if (!data) - return; - // Verify param: substitute_data; type: refptr_diff_byref - DCHECK(substitute_data); - if (!substitute_data) - return; - - // Translate param: substitute_data; type: refptr_diff_byref - CefRefPtr substitute_dataPtr; - if (substitute_data && *substitute_data) - substitute_dataPtr = CefStreamReaderCToCpp::Wrap(*substitute_data); - CefStreamReader* substitute_dataOrig = substitute_dataPtr.get(); - - // Execute - CefContentFilterCppToC::Get(self)->ProcessData( - data, - data_size, - substitute_dataPtr); - - // Restore param: substitute_data; type: refptr_diff_byref - if (substitute_data) { - if (substitute_dataPtr.get()) { - if (substitute_dataPtr.get() != substitute_dataOrig) { - *substitute_data = CefStreamReaderCToCpp::Unwrap(substitute_dataPtr); - } - } else { - *substitute_data = NULL; - } - } -} - -void CEF_CALLBACK content_filter_drain(struct _cef_content_filter_t* self, - struct _cef_stream_reader_t** remainder) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: remainder; type: refptr_diff_byref - DCHECK(remainder); - if (!remainder) - return; - - // Translate param: remainder; type: refptr_diff_byref - CefRefPtr remainderPtr; - if (remainder && *remainder) - remainderPtr = CefStreamReaderCToCpp::Wrap(*remainder); - CefStreamReader* remainderOrig = remainderPtr.get(); - - // Execute - CefContentFilterCppToC::Get(self)->Drain( - remainderPtr); - - // Restore param: remainder; type: refptr_diff_byref - if (remainder) { - if (remainderPtr.get()) { - if (remainderPtr.get() != remainderOrig) { - *remainder = CefStreamReaderCToCpp::Unwrap(remainderPtr); - } - } else { - *remainder = NULL; - } - } -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefContentFilterCppToC::CefContentFilterCppToC(CefContentFilter* cls) - : CefCppToC( - cls) { - struct_.struct_.process_data = content_filter_process_data; - struct_.struct_.drain = content_filter_drain; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/content_filter_cpptoc.h b/cef1/libcef_dll/cpptoc/content_filter_cpptoc.h deleted file mode 100644 index c06b1ff3f..000000000 --- a/cef1/libcef_dll/cpptoc/content_filter_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_CONTENT_FILTER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_CONTENT_FILTER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_content_filter.h" -#include "include/capi/cef_content_filter_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefContentFilterCppToC - : public CefCppToC { - public: - explicit CefContentFilterCppToC(CefContentFilter* cls); - virtual ~CefContentFilterCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_CONTENT_FILTER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/cookie_manager_cpptoc.cc b/cef1/libcef_dll/cpptoc/cookie_manager_cpptoc.cc deleted file mode 100644 index 042bdd47a..000000000 --- a/cef1/libcef_dll/cpptoc/cookie_manager_cpptoc.cc +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/cookie_manager_cpptoc.h" -#include "libcef_dll/ctocpp/cookie_visitor_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_cookie_manager_t* cef_cookie_manager_get_global_manager() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefCookieManager::GetGlobalManager(); - - // Return type: refptr_same - return CefCookieManagerCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_cookie_manager_t* cef_cookie_manager_create_manager( - const cef_string_t* path) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: path - - // Execute - CefRefPtr _retval = CefCookieManager::CreateManager( - CefString(path)); - - // Return type: refptr_same - return CefCookieManagerCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK cookie_manager_set_supported_schemes( - struct _cef_cookie_manager_t* self, cef_string_list_t schemes) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: schemes; type: string_vec_byref_const - DCHECK(schemes); - if (!schemes) - return; - - // Translate param: schemes; type: string_vec_byref_const - std::vector schemesList; - transfer_string_list_contents(schemes, schemesList); - - // Execute - CefCookieManagerCppToC::Get(self)->SetSupportedSchemes( - schemesList); -} - -int CEF_CALLBACK cookie_manager_visit_all_cookies( - struct _cef_cookie_manager_t* self, - struct _cef_cookie_visitor_t* visitor) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: visitor; type: refptr_diff - DCHECK(visitor); - if (!visitor) - return 0; - - // Execute - bool _retval = CefCookieManagerCppToC::Get(self)->VisitAllCookies( - CefCookieVisitorCToCpp::Wrap(visitor)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK cookie_manager_visit_url_cookies( - struct _cef_cookie_manager_t* self, const cef_string_t* url, - int includeHttpOnly, struct _cef_cookie_visitor_t* visitor) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return 0; - // Verify param: visitor; type: refptr_diff - DCHECK(visitor); - if (!visitor) - return 0; - - // Execute - bool _retval = CefCookieManagerCppToC::Get(self)->VisitUrlCookies( - CefString(url), - includeHttpOnly?true:false, - CefCookieVisitorCToCpp::Wrap(visitor)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK cookie_manager_set_cookie(struct _cef_cookie_manager_t* self, - const cef_string_t* url, const struct _cef_cookie_t* cookie) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return 0; - // Verify param: cookie; type: struct_byref_const - DCHECK(cookie); - if (!cookie) - return 0; - - // Translate param: cookie; type: struct_byref_const - CefCookie cookieObj; - if (cookie) - cookieObj.Set(*cookie, false); - - // Execute - bool _retval = CefCookieManagerCppToC::Get(self)->SetCookie( - CefString(url), - cookieObj); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK cookie_manager_delete_cookies( - struct _cef_cookie_manager_t* self, const cef_string_t* url, - const cef_string_t* cookie_name) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Unverified params: url, cookie_name - - // Execute - bool _retval = CefCookieManagerCppToC::Get(self)->DeleteCookies( - CefString(url), - CefString(cookie_name)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK cookie_manager_set_storage_path( - struct _cef_cookie_manager_t* self, const cef_string_t* path) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Unverified params: path - - // Execute - bool _retval = CefCookieManagerCppToC::Get(self)->SetStoragePath( - CefString(path)); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefCookieManagerCppToC::CefCookieManagerCppToC(CefCookieManager* cls) - : CefCppToC( - cls) { - struct_.struct_.set_supported_schemes = cookie_manager_set_supported_schemes; - struct_.struct_.visit_all_cookies = cookie_manager_visit_all_cookies; - struct_.struct_.visit_url_cookies = cookie_manager_visit_url_cookies; - struct_.struct_.set_cookie = cookie_manager_set_cookie; - struct_.struct_.delete_cookies = cookie_manager_delete_cookies; - struct_.struct_.set_storage_path = cookie_manager_set_storage_path; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/cookie_manager_cpptoc.h b/cef1/libcef_dll/cpptoc/cookie_manager_cpptoc.h deleted file mode 100644 index 89b1e12dd..000000000 --- a/cef1/libcef_dll/cpptoc/cookie_manager_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_COOKIE_MANAGER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_COOKIE_MANAGER_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_cookie.h" -#include "include/capi/cef_cookie_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefCookieManagerCppToC - : public CefCppToC { - public: - explicit CefCookieManagerCppToC(CefCookieManager* cls); - virtual ~CefCookieManagerCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_COOKIE_MANAGER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/cookie_visitor_cpptoc.cc b/cef1/libcef_dll/cpptoc/cookie_visitor_cpptoc.cc deleted file mode 100644 index 0b26e62b5..000000000 --- a/cef1/libcef_dll/cpptoc/cookie_visitor_cpptoc.cc +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/cookie_visitor_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK cookie_visitor_visit(struct _cef_cookie_visitor_t* self, - const struct _cef_cookie_t* cookie, int count, int total, - int* deleteCookie) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: cookie; type: struct_byref_const - DCHECK(cookie); - if (!cookie) - return 0; - // Verify param: deleteCookie; type: bool_byref - DCHECK(deleteCookie); - if (!deleteCookie) - return 0; - - // Translate param: cookie; type: struct_byref_const - CefCookie cookieObj; - if (cookie) - cookieObj.Set(*cookie, false); - // Translate param: deleteCookie; type: bool_byref - bool deleteCookieBool = (deleteCookie && *deleteCookie)?true:false; - - // Execute - bool _retval = CefCookieVisitorCppToC::Get(self)->Visit( - cookieObj, - count, - total, - deleteCookieBool); - - // Restore param: deleteCookie; type: bool_byref - if (deleteCookie) - *deleteCookie = deleteCookieBool?true:false; - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefCookieVisitorCppToC::CefCookieVisitorCppToC(CefCookieVisitor* cls) - : CefCppToC( - cls) { - struct_.struct_.visit = cookie_visitor_visit; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/cookie_visitor_cpptoc.h b/cef1/libcef_dll/cpptoc/cookie_visitor_cpptoc.h deleted file mode 100644 index 24d7d62f9..000000000 --- a/cef1/libcef_dll/cpptoc/cookie_visitor_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_COOKIE_VISITOR_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_COOKIE_VISITOR_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_cookie.h" -#include "include/capi/cef_cookie_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefCookieVisitorCppToC - : public CefCppToC { - public: - explicit CefCookieVisitorCppToC(CefCookieVisitor* cls); - virtual ~CefCookieVisitorCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_COOKIE_VISITOR_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/cpptoc.h b/cef1/libcef_dll/cpptoc/cpptoc.h deleted file mode 100644 index 3449264f9..000000000 --- a/cef1/libcef_dll/cpptoc/cpptoc.h +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_DLL_CPPTOC_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_CPPTOC_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/capi/cef_base_capi.h" -#include "libcef_dll/cef_logging.h" - - -// Wrap a C++ class with a C structure. This is used when the class -// implementation exists on this side of the DLL boundary but will have methods -// called from the other side of the DLL boundary. -template -class CefCppToC : public CefBase { - public: - // Structure representation with pointer to the C++ class. - struct Struct { - StructName struct_; - CefCppToC* class_; - }; - - // Use this method to retrieve the underlying class instance from our - // own structure when the structure is passed as the required first - // parameter of a C API function call. No explicit reference counting - // is done in this case. - static CefRefPtr Get(StructName* s) { - DCHECK(s); - - // Cast our structure to the wrapper structure type. - Struct* wrapperStruct = reinterpret_cast(s); - // Return the underlying object instance. - return wrapperStruct->class_->GetClass(); - } - - // Use this method to create a wrapper structure for passing our class - // instance to the other side. - static StructName* Wrap(CefRefPtr c) { - if (!c.get()) - return NULL; - - // Wrap our object with the CefCppToC class. - ClassName* wrapper = new ClassName(c); - // Add a reference to our wrapper object that will be released once our - // structure arrives on the other side. - wrapper->AddRef(); - // Return the structure pointer that can now be passed to the other side. - return wrapper->GetStruct(); - } - - // Use this method to retrieve the underlying class instance when receiving - // our wrapper structure back from the other side. - static CefRefPtr Unwrap(StructName* s) { - if (!s) - return NULL; - - // Cast our structure to the wrapper structure type. - Struct* wrapperStruct = reinterpret_cast(s); - // Add the underlying object instance to a smart pointer. - CefRefPtr objectPtr(wrapperStruct->class_->GetClass()); - // Release the reference to our wrapper object that was added before the - // structure was passed back to us. - wrapperStruct->class_->Release(); - // Return the underlying object instance. - return objectPtr; - } - - explicit CefCppToC(BaseName* cls) - : class_(cls) { - DCHECK(cls); - - struct_.class_ = this; - - // zero the underlying structure and set base members - memset(&struct_.struct_, 0, sizeof(StructName)); - struct_.struct_.base.size = sizeof(StructName); - struct_.struct_.base.add_ref = struct_add_ref; - struct_.struct_.base.release = struct_release; - struct_.struct_.base.get_refct = struct_get_refct; - -#ifndef NDEBUG - CefAtomicIncrement(&DebugObjCt); -#endif - } - virtual ~CefCppToC() { -#ifndef NDEBUG - CefAtomicDecrement(&DebugObjCt); -#endif - } - - BaseName* GetClass() { return class_; } - - // If returning the structure across the DLL boundary you should call - // AddRef() on this CefCppToC object. On the other side of the DLL boundary, - // call UnderlyingRelease() on the wrapping CefCToCpp object. - StructName* GetStruct() { return &struct_.struct_; } - - // CefBase methods increment/decrement reference counts on both this object - // and the underlying wrapper class. - int AddRef() { - UnderlyingAddRef(); - return refct_.AddRef(); - } - int Release() { - UnderlyingRelease(); - int retval = refct_.Release(); - if (retval == 0) - delete this; - return retval; - } - int GetRefCt() { return refct_.GetRefCt(); } - - // Increment/decrement reference counts on only the underlying class. - int UnderlyingAddRef() { return class_->AddRef(); } - int UnderlyingRelease() { return class_->Release(); } - int UnderlyingGetRefCt() { return class_->GetRefCt(); } - -#ifndef NDEBUG - // Simple tracking of allocated objects. - static long DebugObjCt; // NOLINT(runtime/int) -#endif - - private: - static int CEF_CALLBACK struct_add_ref(struct _cef_base_t* base) { - DCHECK(base); - if (!base) - return 0; - - Struct* impl = reinterpret_cast(base); - return impl->class_->AddRef(); - } - - static int CEF_CALLBACK struct_release(struct _cef_base_t* base) { - DCHECK(base); - if (!base) - return 0; - - Struct* impl = reinterpret_cast(base); - return impl->class_->Release(); - } - - static int CEF_CALLBACK struct_get_refct(struct _cef_base_t* base) { - DCHECK(base); - if (!base) - return 0; - - Struct* impl = reinterpret_cast(base); - return impl->class_->GetRefCt(); - } - - protected: - CefRefCount refct_; - Struct struct_; - BaseName* class_; -}; - -#endif // CEF_LIBCEF_DLL_CPPTOC_CPPTOC_H_ diff --git a/cef1/libcef_dll/cpptoc/display_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/display_handler_cpptoc.cc deleted file mode 100644 index 046c16a30..000000000 --- a/cef1/libcef_dll/cpptoc/display_handler_cpptoc.cc +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/display_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/frame_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK display_handler_on_nav_state_change( - struct _cef_display_handler_t* self, cef_browser_t* browser, int canGoBack, - int canGoForward) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - - // Execute - CefDisplayHandlerCppToC::Get(self)->OnNavStateChange( - CefBrowserCToCpp::Wrap(browser), - canGoBack?true:false, - canGoForward?true:false); -} - -void CEF_CALLBACK display_handler_on_address_change( - struct _cef_display_handler_t* self, cef_browser_t* browser, - struct _cef_frame_t* frame, const cef_string_t* url) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return; - - // Execute - CefDisplayHandlerCppToC::Get(self)->OnAddressChange( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - CefString(url)); -} - -void CEF_CALLBACK display_handler_on_contents_size_change( - struct _cef_display_handler_t* self, cef_browser_t* browser, - struct _cef_frame_t* frame, int width, int height) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return; - - // Execute - CefDisplayHandlerCppToC::Get(self)->OnContentsSizeChange( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - width, - height); -} - -void CEF_CALLBACK display_handler_on_title_change( - struct _cef_display_handler_t* self, cef_browser_t* browser, - const cef_string_t* title) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Unverified params: title - - // Execute - CefDisplayHandlerCppToC::Get(self)->OnTitleChange( - CefBrowserCToCpp::Wrap(browser), - CefString(title)); -} - -void CEF_CALLBACK display_handler_on_favicon_urlchange( - struct _cef_display_handler_t* self, cef_browser_t* browser, - cef_string_list_t icon_urls) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: icon_urls; type: string_vec_byref_const - DCHECK(icon_urls); - if (!icon_urls) - return; - - // Translate param: icon_urls; type: string_vec_byref_const - std::vector icon_urlsList; - transfer_string_list_contents(icon_urls, icon_urlsList); - - // Execute - CefDisplayHandlerCppToC::Get(self)->OnFaviconURLChange( - CefBrowserCToCpp::Wrap(browser), - icon_urlsList); -} - -int CEF_CALLBACK display_handler_on_tooltip(struct _cef_display_handler_t* self, - cef_browser_t* browser, cef_string_t* text) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Unverified params: text - - // Translate param: text; type: string_byref - CefString textStr(text); - - // Execute - bool _retval = CefDisplayHandlerCppToC::Get(self)->OnTooltip( - CefBrowserCToCpp::Wrap(browser), - textStr); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK display_handler_on_status_message( - struct _cef_display_handler_t* self, cef_browser_t* browser, - const cef_string_t* value, enum cef_handler_statustype_t type) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Unverified params: value - - // Execute - CefDisplayHandlerCppToC::Get(self)->OnStatusMessage( - CefBrowserCToCpp::Wrap(browser), - CefString(value), - type); -} - -int CEF_CALLBACK display_handler_on_console_message( - struct _cef_display_handler_t* self, cef_browser_t* browser, - const cef_string_t* message, const cef_string_t* source, int line) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Unverified params: message, source - - // Execute - bool _retval = CefDisplayHandlerCppToC::Get(self)->OnConsoleMessage( - CefBrowserCToCpp::Wrap(browser), - CefString(message), - CefString(source), - line); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefDisplayHandlerCppToC::CefDisplayHandlerCppToC(CefDisplayHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_nav_state_change = display_handler_on_nav_state_change; - struct_.struct_.on_address_change = display_handler_on_address_change; - struct_.struct_.on_contents_size_change = - display_handler_on_contents_size_change; - struct_.struct_.on_title_change = display_handler_on_title_change; - struct_.struct_.on_favicon_urlchange = display_handler_on_favicon_urlchange; - struct_.struct_.on_tooltip = display_handler_on_tooltip; - struct_.struct_.on_status_message = display_handler_on_status_message; - struct_.struct_.on_console_message = display_handler_on_console_message; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/display_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/display_handler_cpptoc.h deleted file mode 100644 index bfa04645d..000000000 --- a/cef1/libcef_dll/cpptoc/display_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_DISPLAY_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_DISPLAY_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_display_handler.h" -#include "include/capi/cef_display_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefDisplayHandlerCppToC - : public CefCppToC { - public: - explicit CefDisplayHandlerCppToC(CefDisplayHandler* cls); - virtual ~CefDisplayHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_DISPLAY_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/domdocument_cpptoc.cc b/cef1/libcef_dll/cpptoc/domdocument_cpptoc.cc deleted file mode 100644 index 74ca72f43..000000000 --- a/cef1/libcef_dll/cpptoc/domdocument_cpptoc.cc +++ /dev/null @@ -1,303 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/domdocument_cpptoc.h" -#include "libcef_dll/cpptoc/domnode_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -enum cef_dom_document_type_t CEF_CALLBACK domdocument_get_type( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return DOM_DOCUMENT_TYPE_UNKNOWN; - - // Execute - cef_dom_document_type_t _retval = CefDOMDocumentCppToC::Get(self)->GetType(); - - // Return type: simple - return _retval; -} - -struct _cef_domnode_t* CEF_CALLBACK domdocument_get_document( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMDocumentCppToC::Get(self)->GetDocument( - ); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -struct _cef_domnode_t* CEF_CALLBACK domdocument_get_body( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMDocumentCppToC::Get(self)->GetBody(); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -struct _cef_domnode_t* CEF_CALLBACK domdocument_get_head( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMDocumentCppToC::Get(self)->GetHead(); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -cef_string_userfree_t CEF_CALLBACK domdocument_get_title( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDOMDocumentCppToC::Get(self)->GetTitle(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -struct _cef_domnode_t* CEF_CALLBACK domdocument_get_element_by_id( - struct _cef_domdocument_t* self, const cef_string_t* id) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: id; type: string_byref_const - DCHECK(id); - if (!id) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMDocumentCppToC::Get( - self)->GetElementById( - CefString(id)); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -struct _cef_domnode_t* CEF_CALLBACK domdocument_get_focused_node( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMDocumentCppToC::Get( - self)->GetFocusedNode(); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -int CEF_CALLBACK domdocument_has_selection(struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefDOMDocumentCppToC::Get(self)->HasSelection(); - - // Return type: bool - return _retval; -} - -struct _cef_domnode_t* CEF_CALLBACK domdocument_get_selection_start_node( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMDocumentCppToC::Get( - self)->GetSelectionStartNode(); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -int CEF_CALLBACK domdocument_get_selection_start_offset( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefDOMDocumentCppToC::Get(self)->GetSelectionStartOffset(); - - // Return type: simple - return _retval; -} - -struct _cef_domnode_t* CEF_CALLBACK domdocument_get_selection_end_node( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMDocumentCppToC::Get( - self)->GetSelectionEndNode(); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -int CEF_CALLBACK domdocument_get_selection_end_offset( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefDOMDocumentCppToC::Get(self)->GetSelectionEndOffset(); - - // Return type: simple - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK domdocument_get_selection_as_markup( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDOMDocumentCppToC::Get(self)->GetSelectionAsMarkup(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK domdocument_get_selection_as_text( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDOMDocumentCppToC::Get(self)->GetSelectionAsText(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK domdocument_get_base_url( - struct _cef_domdocument_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDOMDocumentCppToC::Get(self)->GetBaseURL(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK domdocument_get_complete_url( - struct _cef_domdocument_t* self, const cef_string_t* partialURL) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: partialURL; type: string_byref_const - DCHECK(partialURL); - if (!partialURL) - return NULL; - - // Execute - CefString _retval = CefDOMDocumentCppToC::Get(self)->GetCompleteURL( - CefString(partialURL)); - - // Return type: string - return _retval.DetachToUserFree(); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefDOMDocumentCppToC::CefDOMDocumentCppToC(CefDOMDocument* cls) - : CefCppToC(cls) { - struct_.struct_.get_type = domdocument_get_type; - struct_.struct_.get_document = domdocument_get_document; - struct_.struct_.get_body = domdocument_get_body; - struct_.struct_.get_head = domdocument_get_head; - struct_.struct_.get_title = domdocument_get_title; - struct_.struct_.get_element_by_id = domdocument_get_element_by_id; - struct_.struct_.get_focused_node = domdocument_get_focused_node; - struct_.struct_.has_selection = domdocument_has_selection; - struct_.struct_.get_selection_start_node = - domdocument_get_selection_start_node; - struct_.struct_.get_selection_start_offset = - domdocument_get_selection_start_offset; - struct_.struct_.get_selection_end_node = domdocument_get_selection_end_node; - struct_.struct_.get_selection_end_offset = - domdocument_get_selection_end_offset; - struct_.struct_.get_selection_as_markup = domdocument_get_selection_as_markup; - struct_.struct_.get_selection_as_text = domdocument_get_selection_as_text; - struct_.struct_.get_base_url = domdocument_get_base_url; - struct_.struct_.get_complete_url = domdocument_get_complete_url; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/domdocument_cpptoc.h b/cef1/libcef_dll/cpptoc/domdocument_cpptoc.h deleted file mode 100644 index 5c394b3f0..000000000 --- a/cef1/libcef_dll/cpptoc/domdocument_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_DOMDOCUMENT_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_DOMDOCUMENT_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_dom.h" -#include "include/capi/cef_dom_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefDOMDocumentCppToC - : public CefCppToC { - public: - explicit CefDOMDocumentCppToC(CefDOMDocument* cls); - virtual ~CefDOMDocumentCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_DOMDOCUMENT_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/domevent_cpptoc.cc b/cef1/libcef_dll/cpptoc/domevent_cpptoc.cc deleted file mode 100644 index 41ef97905..000000000 --- a/cef1/libcef_dll/cpptoc/domevent_cpptoc.cc +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/domdocument_cpptoc.h" -#include "libcef_dll/cpptoc/domevent_cpptoc.h" -#include "libcef_dll/cpptoc/domnode_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -cef_string_userfree_t CEF_CALLBACK domevent_get_type( - struct _cef_domevent_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDOMEventCppToC::Get(self)->GetType(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -enum cef_dom_event_category_t CEF_CALLBACK domevent_get_category( - struct _cef_domevent_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return DOM_EVENT_CATEGORY_UNKNOWN; - - // Execute - cef_dom_event_category_t _retval = CefDOMEventCppToC::Get(self)->GetCategory( - ); - - // Return type: simple - return _retval; -} - -enum cef_dom_event_phase_t CEF_CALLBACK domevent_get_phase( - struct _cef_domevent_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return DOM_EVENT_PHASE_UNKNOWN; - - // Execute - cef_dom_event_phase_t _retval = CefDOMEventCppToC::Get(self)->GetPhase(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK domevent_can_bubble(struct _cef_domevent_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefDOMEventCppToC::Get(self)->CanBubble(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK domevent_can_cancel(struct _cef_domevent_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefDOMEventCppToC::Get(self)->CanCancel(); - - // Return type: bool - return _retval; -} - -cef_domdocument_t* CEF_CALLBACK domevent_get_document( - struct _cef_domevent_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMEventCppToC::Get(self)->GetDocument( - ); - - // Return type: refptr_same - return CefDOMDocumentCppToC::Wrap(_retval); -} - -cef_domnode_t* CEF_CALLBACK domevent_get_target(struct _cef_domevent_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMEventCppToC::Get(self)->GetTarget(); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -cef_domnode_t* CEF_CALLBACK domevent_get_current_target( - struct _cef_domevent_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMEventCppToC::Get( - self)->GetCurrentTarget(); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefDOMEventCppToC::CefDOMEventCppToC(CefDOMEvent* cls) - : CefCppToC(cls) { - struct_.struct_.get_type = domevent_get_type; - struct_.struct_.get_category = domevent_get_category; - struct_.struct_.get_phase = domevent_get_phase; - struct_.struct_.can_bubble = domevent_can_bubble; - struct_.struct_.can_cancel = domevent_can_cancel; - struct_.struct_.get_document = domevent_get_document; - struct_.struct_.get_target = domevent_get_target; - struct_.struct_.get_current_target = domevent_get_current_target; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/domevent_cpptoc.h b/cef1/libcef_dll/cpptoc/domevent_cpptoc.h deleted file mode 100644 index 956688d39..000000000 --- a/cef1/libcef_dll/cpptoc/domevent_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_DOMEVENT_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_DOMEVENT_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_dom.h" -#include "include/capi/cef_dom_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefDOMEventCppToC - : public CefCppToC { - public: - explicit CefDOMEventCppToC(CefDOMEvent* cls); - virtual ~CefDOMEventCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_DOMEVENT_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/domevent_listener_cpptoc.cc b/cef1/libcef_dll/cpptoc/domevent_listener_cpptoc.cc deleted file mode 100644 index 50e0158a2..000000000 --- a/cef1/libcef_dll/cpptoc/domevent_listener_cpptoc.cc +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/domevent_listener_cpptoc.h" -#include "libcef_dll/ctocpp/domevent_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK domevent_listener_handle_event( - struct _cef_domevent_listener_t* self, cef_domevent_t* event) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: event; type: refptr_diff - DCHECK(event); - if (!event) - return; - - // Execute - CefDOMEventListenerCppToC::Get(self)->HandleEvent( - CefDOMEventCToCpp::Wrap(event)); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefDOMEventListenerCppToC::CefDOMEventListenerCppToC(CefDOMEventListener* cls) - : CefCppToC(cls) { - struct_.struct_.handle_event = domevent_listener_handle_event; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/domevent_listener_cpptoc.h b/cef1/libcef_dll/cpptoc/domevent_listener_cpptoc.h deleted file mode 100644 index 4e8c84d7b..000000000 --- a/cef1/libcef_dll/cpptoc/domevent_listener_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_DOMEVENT_LISTENER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_DOMEVENT_LISTENER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_dom.h" -#include "include/capi/cef_dom_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefDOMEventListenerCppToC - : public CefCppToC { - public: - explicit CefDOMEventListenerCppToC(CefDOMEventListener* cls); - virtual ~CefDOMEventListenerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_DOMEVENT_LISTENER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/domnode_cpptoc.cc b/cef1/libcef_dll/cpptoc/domnode_cpptoc.cc deleted file mode 100644 index f8e23b1b0..000000000 --- a/cef1/libcef_dll/cpptoc/domnode_cpptoc.cc +++ /dev/null @@ -1,479 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/domdocument_cpptoc.h" -#include "libcef_dll/cpptoc/domnode_cpptoc.h" -#include "libcef_dll/ctocpp/domevent_listener_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -enum cef_dom_node_type_t CEF_CALLBACK domnode_get_type( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return DOM_NODE_TYPE_UNSUPPORTED; - - // Execute - cef_dom_node_type_t _retval = CefDOMNodeCppToC::Get(self)->GetType(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK domnode_is_text(struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefDOMNodeCppToC::Get(self)->IsText(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK domnode_is_element(struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefDOMNodeCppToC::Get(self)->IsElement(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK domnode_is_form_control_element(struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefDOMNodeCppToC::Get(self)->IsFormControlElement(); - - // Return type: bool - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK domnode_get_form_control_element_type( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDOMNodeCppToC::Get(self)->GetFormControlElementType(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -int CEF_CALLBACK domnode_is_same(struct _cef_domnode_t* self, - struct _cef_domnode_t* that) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: that; type: refptr_same - DCHECK(that); - if (!that) - return 0; - - // Execute - bool _retval = CefDOMNodeCppToC::Get(self)->IsSame( - CefDOMNodeCppToC::Unwrap(that)); - - // Return type: bool - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK domnode_get_name( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDOMNodeCppToC::Get(self)->GetName(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK domnode_get_value( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDOMNodeCppToC::Get(self)->GetValue(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -int CEF_CALLBACK domnode_set_value(struct _cef_domnode_t* self, - const cef_string_t* value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: value; type: string_byref_const - DCHECK(value); - if (!value) - return 0; - - // Execute - bool _retval = CefDOMNodeCppToC::Get(self)->SetValue( - CefString(value)); - - // Return type: bool - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK domnode_get_as_markup( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDOMNodeCppToC::Get(self)->GetAsMarkup(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_domdocument_t* CEF_CALLBACK domnode_get_document( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMNodeCppToC::Get(self)->GetDocument( - ); - - // Return type: refptr_same - return CefDOMDocumentCppToC::Wrap(_retval); -} - -struct _cef_domnode_t* CEF_CALLBACK domnode_get_parent( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMNodeCppToC::Get(self)->GetParent(); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -struct _cef_domnode_t* CEF_CALLBACK domnode_get_previous_sibling( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMNodeCppToC::Get( - self)->GetPreviousSibling(); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -struct _cef_domnode_t* CEF_CALLBACK domnode_get_next_sibling( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMNodeCppToC::Get(self)->GetNextSibling(); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -int CEF_CALLBACK domnode_has_children(struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefDOMNodeCppToC::Get(self)->HasChildren(); - - // Return type: bool - return _retval; -} - -struct _cef_domnode_t* CEF_CALLBACK domnode_get_first_child( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMNodeCppToC::Get(self)->GetFirstChild(); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -struct _cef_domnode_t* CEF_CALLBACK domnode_get_last_child( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefDOMNodeCppToC::Get(self)->GetLastChild(); - - // Return type: refptr_same - return CefDOMNodeCppToC::Wrap(_retval); -} - -void CEF_CALLBACK domnode_add_event_listener(struct _cef_domnode_t* self, - const cef_string_t* eventType, struct _cef_domevent_listener_t* listener, - int useCapture) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: eventType; type: string_byref_const - DCHECK(eventType); - if (!eventType) - return; - // Verify param: listener; type: refptr_diff - DCHECK(listener); - if (!listener) - return; - - // Execute - CefDOMNodeCppToC::Get(self)->AddEventListener( - CefString(eventType), - CefDOMEventListenerCToCpp::Wrap(listener), - useCapture?true:false); -} - -cef_string_userfree_t CEF_CALLBACK domnode_get_element_tag_name( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDOMNodeCppToC::Get(self)->GetElementTagName(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -int CEF_CALLBACK domnode_has_element_attributes(struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefDOMNodeCppToC::Get(self)->HasElementAttributes(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK domnode_has_element_attribute(struct _cef_domnode_t* self, - const cef_string_t* attrName) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: attrName; type: string_byref_const - DCHECK(attrName); - if (!attrName) - return 0; - - // Execute - bool _retval = CefDOMNodeCppToC::Get(self)->HasElementAttribute( - CefString(attrName)); - - // Return type: bool - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK domnode_get_element_attribute( - struct _cef_domnode_t* self, const cef_string_t* attrName) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: attrName; type: string_byref_const - DCHECK(attrName); - if (!attrName) - return NULL; - - // Execute - CefString _retval = CefDOMNodeCppToC::Get(self)->GetElementAttribute( - CefString(attrName)); - - // Return type: string - return _retval.DetachToUserFree(); -} - -void CEF_CALLBACK domnode_get_element_attributes(struct _cef_domnode_t* self, - cef_string_map_t attrMap) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: attrMap; type: string_map_single_byref - DCHECK(attrMap); - if (!attrMap) - return; - - // Translate param: attrMap; type: string_map_single_byref - std::map attrMapMap; - transfer_string_map_contents(attrMap, attrMapMap); - - // Execute - CefDOMNodeCppToC::Get(self)->GetElementAttributes( - attrMapMap); - - // Restore param: attrMap; type: string_map_single_byref - cef_string_map_clear(attrMap); - transfer_string_map_contents(attrMapMap, attrMap); -} - -int CEF_CALLBACK domnode_set_element_attribute(struct _cef_domnode_t* self, - const cef_string_t* attrName, const cef_string_t* value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: attrName; type: string_byref_const - DCHECK(attrName); - if (!attrName) - return 0; - // Verify param: value; type: string_byref_const - DCHECK(value); - if (!value) - return 0; - - // Execute - bool _retval = CefDOMNodeCppToC::Get(self)->SetElementAttribute( - CefString(attrName), - CefString(value)); - - // Return type: bool - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK domnode_get_element_inner_text( - struct _cef_domnode_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDOMNodeCppToC::Get(self)->GetElementInnerText(); - - // Return type: string - return _retval.DetachToUserFree(); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefDOMNodeCppToC::CefDOMNodeCppToC(CefDOMNode* cls) - : CefCppToC(cls) { - struct_.struct_.get_type = domnode_get_type; - struct_.struct_.is_text = domnode_is_text; - struct_.struct_.is_element = domnode_is_element; - struct_.struct_.is_form_control_element = domnode_is_form_control_element; - struct_.struct_.get_form_control_element_type = - domnode_get_form_control_element_type; - struct_.struct_.is_same = domnode_is_same; - struct_.struct_.get_name = domnode_get_name; - struct_.struct_.get_value = domnode_get_value; - struct_.struct_.set_value = domnode_set_value; - struct_.struct_.get_as_markup = domnode_get_as_markup; - struct_.struct_.get_document = domnode_get_document; - struct_.struct_.get_parent = domnode_get_parent; - struct_.struct_.get_previous_sibling = domnode_get_previous_sibling; - struct_.struct_.get_next_sibling = domnode_get_next_sibling; - struct_.struct_.has_children = domnode_has_children; - struct_.struct_.get_first_child = domnode_get_first_child; - struct_.struct_.get_last_child = domnode_get_last_child; - struct_.struct_.add_event_listener = domnode_add_event_listener; - struct_.struct_.get_element_tag_name = domnode_get_element_tag_name; - struct_.struct_.has_element_attributes = domnode_has_element_attributes; - struct_.struct_.has_element_attribute = domnode_has_element_attribute; - struct_.struct_.get_element_attribute = domnode_get_element_attribute; - struct_.struct_.get_element_attributes = domnode_get_element_attributes; - struct_.struct_.set_element_attribute = domnode_set_element_attribute; - struct_.struct_.get_element_inner_text = domnode_get_element_inner_text; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/domnode_cpptoc.h b/cef1/libcef_dll/cpptoc/domnode_cpptoc.h deleted file mode 100644 index c874c2c79..000000000 --- a/cef1/libcef_dll/cpptoc/domnode_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_DOMNODE_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_DOMNODE_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_dom.h" -#include "include/capi/cef_dom_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefDOMNodeCppToC - : public CefCppToC { - public: - explicit CefDOMNodeCppToC(CefDOMNode* cls); - virtual ~CefDOMNodeCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_DOMNODE_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/domvisitor_cpptoc.cc b/cef1/libcef_dll/cpptoc/domvisitor_cpptoc.cc deleted file mode 100644 index e3c649648..000000000 --- a/cef1/libcef_dll/cpptoc/domvisitor_cpptoc.cc +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/domvisitor_cpptoc.h" -#include "libcef_dll/ctocpp/domdocument_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK domvisitor_visit(struct _cef_domvisitor_t* self, - struct _cef_domdocument_t* document) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: document; type: refptr_diff - DCHECK(document); - if (!document) - return; - - // Execute - CefDOMVisitorCppToC::Get(self)->Visit( - CefDOMDocumentCToCpp::Wrap(document)); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefDOMVisitorCppToC::CefDOMVisitorCppToC(CefDOMVisitor* cls) - : CefCppToC(cls) { - struct_.struct_.visit = domvisitor_visit; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/domvisitor_cpptoc.h b/cef1/libcef_dll/cpptoc/domvisitor_cpptoc.h deleted file mode 100644 index 21d015c89..000000000 --- a/cef1/libcef_dll/cpptoc/domvisitor_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_DOMVISITOR_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_DOMVISITOR_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_dom.h" -#include "include/capi/cef_dom_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefDOMVisitorCppToC - : public CefCppToC { - public: - explicit CefDOMVisitorCppToC(CefDOMVisitor* cls); - virtual ~CefDOMVisitorCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_DOMVISITOR_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/download_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/download_handler_cpptoc.cc deleted file mode 100644 index d56e0981a..000000000 --- a/cef1/libcef_dll/cpptoc/download_handler_cpptoc.cc +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/download_handler_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK download_handler_received_data( - struct _cef_download_handler_t* self, void* data, int data_size) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: data; type: simple_byaddr - DCHECK(data); - if (!data) - return 0; - - // Execute - bool _retval = CefDownloadHandlerCppToC::Get(self)->ReceivedData( - data, - data_size); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK download_handler_complete( - struct _cef_download_handler_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefDownloadHandlerCppToC::Get(self)->Complete(); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefDownloadHandlerCppToC::CefDownloadHandlerCppToC(CefDownloadHandler* cls) - : CefCppToC(cls) { - struct_.struct_.received_data = download_handler_received_data; - struct_.struct_.complete = download_handler_complete; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/download_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/download_handler_cpptoc.h deleted file mode 100644 index b8c9ec319..000000000 --- a/cef1/libcef_dll/cpptoc/download_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_DOWNLOAD_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_DOWNLOAD_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_download_handler.h" -#include "include/capi/cef_download_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefDownloadHandlerCppToC - : public CefCppToC { - public: - explicit CefDownloadHandlerCppToC(CefDownloadHandler* cls); - virtual ~CefDownloadHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_DOWNLOAD_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/drag_data_cpptoc.cc b/cef1/libcef_dll/cpptoc/drag_data_cpptoc.cc deleted file mode 100644 index 0b2d21bb1..000000000 --- a/cef1/libcef_dll/cpptoc/drag_data_cpptoc.cc +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/drag_data_cpptoc.h" -#include "libcef_dll/transfer_util.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK drag_data_is_link(struct _cef_drag_data_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefDragDataCppToC::Get(self)->IsLink(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK drag_data_is_fragment(struct _cef_drag_data_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefDragDataCppToC::Get(self)->IsFragment(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK drag_data_is_file(struct _cef_drag_data_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefDragDataCppToC::Get(self)->IsFile(); - - // Return type: bool - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK drag_data_get_link_url( - struct _cef_drag_data_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDragDataCppToC::Get(self)->GetLinkURL(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK drag_data_get_link_title( - struct _cef_drag_data_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDragDataCppToC::Get(self)->GetLinkTitle(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK drag_data_get_link_metadata( - struct _cef_drag_data_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDragDataCppToC::Get(self)->GetLinkMetadata(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK drag_data_get_fragment_text( - struct _cef_drag_data_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDragDataCppToC::Get(self)->GetFragmentText(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK drag_data_get_fragment_html( - struct _cef_drag_data_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDragDataCppToC::Get(self)->GetFragmentHtml(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK drag_data_get_fragment_base_url( - struct _cef_drag_data_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDragDataCppToC::Get(self)->GetFragmentBaseURL(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK drag_data_get_file_name( - struct _cef_drag_data_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefDragDataCppToC::Get(self)->GetFileName(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -int CEF_CALLBACK drag_data_get_file_names(struct _cef_drag_data_t* self, - cef_string_list_t names) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: names; type: string_vec_byref - DCHECK(names); - if (!names) - return 0; - - // Translate param: names; type: string_vec_byref - std::vector namesList; - transfer_string_list_contents(names, namesList); - - // Execute - bool _retval = CefDragDataCppToC::Get(self)->GetFileNames( - namesList); - - // Restore param: names; type: string_vec_byref - cef_string_list_clear(names); - transfer_string_list_contents(namesList, names); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefDragDataCppToC::CefDragDataCppToC(CefDragData* cls) - : CefCppToC(cls) { - struct_.struct_.is_link = drag_data_is_link; - struct_.struct_.is_fragment = drag_data_is_fragment; - struct_.struct_.is_file = drag_data_is_file; - struct_.struct_.get_link_url = drag_data_get_link_url; - struct_.struct_.get_link_title = drag_data_get_link_title; - struct_.struct_.get_link_metadata = drag_data_get_link_metadata; - struct_.struct_.get_fragment_text = drag_data_get_fragment_text; - struct_.struct_.get_fragment_html = drag_data_get_fragment_html; - struct_.struct_.get_fragment_base_url = drag_data_get_fragment_base_url; - struct_.struct_.get_file_name = drag_data_get_file_name; - struct_.struct_.get_file_names = drag_data_get_file_names; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/drag_data_cpptoc.h b/cef1/libcef_dll/cpptoc/drag_data_cpptoc.h deleted file mode 100644 index a423e4ac2..000000000 --- a/cef1/libcef_dll/cpptoc/drag_data_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_DRAG_DATA_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_DRAG_DATA_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_drag_data.h" -#include "include/capi/cef_drag_data_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefDragDataCppToC - : public CefCppToC { - public: - explicit CefDragDataCppToC(CefDragData* cls); - virtual ~CefDragDataCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_DRAG_DATA_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/drag_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/drag_handler_cpptoc.cc deleted file mode 100644 index 514f3bd63..000000000 --- a/cef1/libcef_dll/cpptoc/drag_handler_cpptoc.cc +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/drag_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/drag_data_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK drag_handler_on_drag_start(struct _cef_drag_handler_t* self, - cef_browser_t* browser, cef_drag_data_t* dragData, - enum cef_drag_operations_mask_t mask) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: dragData; type: refptr_diff - DCHECK(dragData); - if (!dragData) - return 0; - - // Execute - bool _retval = CefDragHandlerCppToC::Get(self)->OnDragStart( - CefBrowserCToCpp::Wrap(browser), - CefDragDataCToCpp::Wrap(dragData), - mask); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK drag_handler_on_drag_enter(struct _cef_drag_handler_t* self, - cef_browser_t* browser, cef_drag_data_t* dragData, - enum cef_drag_operations_mask_t mask) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: dragData; type: refptr_diff - DCHECK(dragData); - if (!dragData) - return 0; - - // Execute - bool _retval = CefDragHandlerCppToC::Get(self)->OnDragEnter( - CefBrowserCToCpp::Wrap(browser), - CefDragDataCToCpp::Wrap(dragData), - mask); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefDragHandlerCppToC::CefDragHandlerCppToC(CefDragHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_drag_start = drag_handler_on_drag_start; - struct_.struct_.on_drag_enter = drag_handler_on_drag_enter; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/drag_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/drag_handler_cpptoc.h deleted file mode 100644 index c3377d1eb..000000000 --- a/cef1/libcef_dll/cpptoc/drag_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_DRAG_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_DRAG_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_drag_handler.h" -#include "include/capi/cef_drag_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefDragHandlerCppToC - : public CefCppToC { - public: - explicit CefDragHandlerCppToC(CefDragHandler* cls); - virtual ~CefDragHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_DRAG_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/find_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/find_handler_cpptoc.cc deleted file mode 100644 index b2ce6ac34..000000000 --- a/cef1/libcef_dll/cpptoc/find_handler_cpptoc.cc +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/find_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK find_handler_on_find_result(struct _cef_find_handler_t* self, - cef_browser_t* browser, int identifier, int count, - const cef_rect_t* selectionRect, int activeMatchOrdinal, - int finalUpdate) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: selectionRect; type: simple_byref_const - DCHECK(selectionRect); - if (!selectionRect) - return; - - // Translate param: selectionRect; type: simple_byref_const - CefRect selectionRectVal = selectionRect?*selectionRect:CefRect(); - - // Execute - CefFindHandlerCppToC::Get(self)->OnFindResult( - CefBrowserCToCpp::Wrap(browser), - identifier, - count, - selectionRectVal, - activeMatchOrdinal, - finalUpdate?true:false); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefFindHandlerCppToC::CefFindHandlerCppToC(CefFindHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_find_result = find_handler_on_find_result; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/find_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/find_handler_cpptoc.h deleted file mode 100644 index 738592dfb..000000000 --- a/cef1/libcef_dll/cpptoc/find_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_FIND_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_FIND_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_find_handler.h" -#include "include/capi/cef_find_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefFindHandlerCppToC - : public CefCppToC { - public: - explicit CefFindHandlerCppToC(CefFindHandler* cls); - virtual ~CefFindHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_FIND_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/focus_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/focus_handler_cpptoc.cc deleted file mode 100644 index 84a567269..000000000 --- a/cef1/libcef_dll/cpptoc/focus_handler_cpptoc.cc +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/focus_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/domnode_ctocpp.h" -#include "libcef_dll/ctocpp/frame_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK focus_handler_on_take_focus(struct _cef_focus_handler_t* self, - cef_browser_t* browser, int next) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - - // Execute - CefFocusHandlerCppToC::Get(self)->OnTakeFocus( - CefBrowserCToCpp::Wrap(browser), - next?true:false); -} - -int CEF_CALLBACK focus_handler_on_set_focus(struct _cef_focus_handler_t* self, - cef_browser_t* browser, enum cef_handler_focus_source_t source) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - - // Execute - bool _retval = CefFocusHandlerCppToC::Get(self)->OnSetFocus( - CefBrowserCToCpp::Wrap(browser), - source); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK focus_handler_on_focused_node_changed( - struct _cef_focus_handler_t* self, cef_browser_t* browser, - struct _cef_frame_t* frame, cef_domnode_t* node) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Unverified params: frame, node - - // Execute - CefFocusHandlerCppToC::Get(self)->OnFocusedNodeChanged( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - CefDOMNodeCToCpp::Wrap(node)); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefFocusHandlerCppToC::CefFocusHandlerCppToC(CefFocusHandler* cls) - : CefCppToC( - cls) { - struct_.struct_.on_take_focus = focus_handler_on_take_focus; - struct_.struct_.on_set_focus = focus_handler_on_set_focus; - struct_.struct_.on_focused_node_changed = - focus_handler_on_focused_node_changed; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/focus_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/focus_handler_cpptoc.h deleted file mode 100644 index 5ed79a643..000000000 --- a/cef1/libcef_dll/cpptoc/focus_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_FOCUS_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_FOCUS_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_focus_handler.h" -#include "include/capi/cef_focus_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefFocusHandlerCppToC - : public CefCppToC { - public: - explicit CefFocusHandlerCppToC(CefFocusHandler* cls); - virtual ~CefFocusHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_FOCUS_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/frame_cpptoc.cc b/cef1/libcef_dll/cpptoc/frame_cpptoc.cc deleted file mode 100644 index 139012c56..000000000 --- a/cef1/libcef_dll/cpptoc/frame_cpptoc.cc +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/frame_cpptoc.h" -#include "libcef_dll/cpptoc/request_cpptoc.h" -#include "libcef_dll/cpptoc/stream_reader_cpptoc.h" -#include "libcef_dll/cpptoc/v8context_cpptoc.h" -#include "libcef_dll/ctocpp/domvisitor_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK frame_undo(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefFrameCppToC::Get(self)->Undo(); -} - -void CEF_CALLBACK frame_redo(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefFrameCppToC::Get(self)->Redo(); -} - -void CEF_CALLBACK frame_cut(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefFrameCppToC::Get(self)->Cut(); -} - -void CEF_CALLBACK frame_copy(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefFrameCppToC::Get(self)->Copy(); -} - -void CEF_CALLBACK frame_paste(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefFrameCppToC::Get(self)->Paste(); -} - -void CEF_CALLBACK frame_del(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefFrameCppToC::Get(self)->Delete(); -} - -void CEF_CALLBACK frame_select_all(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefFrameCppToC::Get(self)->SelectAll(); -} - -void CEF_CALLBACK frame_print(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefFrameCppToC::Get(self)->Print(); -} - -void CEF_CALLBACK frame_view_source(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefFrameCppToC::Get(self)->ViewSource(); -} - -cef_string_userfree_t CEF_CALLBACK frame_get_source(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefFrameCppToC::Get(self)->GetSource(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK frame_get_text(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefFrameCppToC::Get(self)->GetText(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -void CEF_CALLBACK frame_load_request(struct _cef_frame_t* self, - struct _cef_request_t* request) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: request; type: refptr_same - DCHECK(request); - if (!request) - return; - - // Execute - CefFrameCppToC::Get(self)->LoadRequest( - CefRequestCppToC::Unwrap(request)); -} - -void CEF_CALLBACK frame_load_url(struct _cef_frame_t* self, - const cef_string_t* url) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return; - - // Execute - CefFrameCppToC::Get(self)->LoadURL( - CefString(url)); -} - -void CEF_CALLBACK frame_load_string(struct _cef_frame_t* self, - const cef_string_t* string_val, const cef_string_t* url) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: string_val; type: string_byref_const - DCHECK(string_val); - if (!string_val) - return; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return; - - // Execute - CefFrameCppToC::Get(self)->LoadString( - CefString(string_val), - CefString(url)); -} - -void CEF_CALLBACK frame_load_stream(struct _cef_frame_t* self, - struct _cef_stream_reader_t* stream, const cef_string_t* url) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: stream; type: refptr_same - DCHECK(stream); - if (!stream) - return; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return; - - // Execute - CefFrameCppToC::Get(self)->LoadStream( - CefStreamReaderCppToC::Unwrap(stream), - CefString(url)); -} - -void CEF_CALLBACK frame_execute_java_script(struct _cef_frame_t* self, - const cef_string_t* jsCode, const cef_string_t* scriptUrl, - int startLine) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: jsCode; type: string_byref_const - DCHECK(jsCode); - if (!jsCode) - return; - // Unverified params: scriptUrl - - // Execute - CefFrameCppToC::Get(self)->ExecuteJavaScript( - CefString(jsCode), - CefString(scriptUrl), - startLine); -} - -int CEF_CALLBACK frame_is_main(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefFrameCppToC::Get(self)->IsMain(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK frame_is_focused(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefFrameCppToC::Get(self)->IsFocused(); - - // Return type: bool - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK frame_get_name(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefFrameCppToC::Get(self)->GetName(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -int64 CEF_CALLBACK frame_get_identifier(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int64 _retval = CefFrameCppToC::Get(self)->GetIdentifier(); - - // Return type: simple - return _retval; -} - -struct _cef_frame_t* CEF_CALLBACK frame_get_parent(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefFrameCppToC::Get(self)->GetParent(); - - // Return type: refptr_same - return CefFrameCppToC::Wrap(_retval); -} - -cef_string_userfree_t CEF_CALLBACK frame_get_url(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefFrameCppToC::Get(self)->GetURL(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_browser_t* CEF_CALLBACK frame_get_browser(struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefFrameCppToC::Get(self)->GetBrowser(); - - // Return type: refptr_same - return CefBrowserCppToC::Wrap(_retval); -} - -void CEF_CALLBACK frame_visit_dom(struct _cef_frame_t* self, - cef_domvisitor_t* visitor) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: visitor; type: refptr_diff - DCHECK(visitor); - if (!visitor) - return; - - // Execute - CefFrameCppToC::Get(self)->VisitDOM( - CefDOMVisitorCToCpp::Wrap(visitor)); -} - -struct _cef_v8context_t* CEF_CALLBACK frame_get_v8context( - struct _cef_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefFrameCppToC::Get(self)->GetV8Context(); - - // Return type: refptr_same - return CefV8ContextCppToC::Wrap(_retval); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefFrameCppToC::CefFrameCppToC(CefFrame* cls) - : CefCppToC(cls) { - struct_.struct_.undo = frame_undo; - struct_.struct_.redo = frame_redo; - struct_.struct_.cut = frame_cut; - struct_.struct_.copy = frame_copy; - struct_.struct_.paste = frame_paste; - struct_.struct_.del = frame_del; - struct_.struct_.select_all = frame_select_all; - struct_.struct_.print = frame_print; - struct_.struct_.view_source = frame_view_source; - struct_.struct_.get_source = frame_get_source; - struct_.struct_.get_text = frame_get_text; - struct_.struct_.load_request = frame_load_request; - struct_.struct_.load_url = frame_load_url; - struct_.struct_.load_string = frame_load_string; - struct_.struct_.load_stream = frame_load_stream; - struct_.struct_.execute_java_script = frame_execute_java_script; - struct_.struct_.is_main = frame_is_main; - struct_.struct_.is_focused = frame_is_focused; - struct_.struct_.get_name = frame_get_name; - struct_.struct_.get_identifier = frame_get_identifier; - struct_.struct_.get_parent = frame_get_parent; - struct_.struct_.get_url = frame_get_url; - struct_.struct_.get_browser = frame_get_browser; - struct_.struct_.visit_dom = frame_visit_dom; - struct_.struct_.get_v8context = frame_get_v8context; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = - 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/frame_cpptoc.h b/cef1/libcef_dll/cpptoc/frame_cpptoc.h deleted file mode 100644 index 5027e2192..000000000 --- a/cef1/libcef_dll/cpptoc/frame_cpptoc.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_FRAME_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_FRAME_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_frame.h" -#include "include/capi/cef_frame_capi.h" -#include "include/cef_browser.h" -#include "include/capi/cef_browser_capi.h" -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefFrameCppToC - : public CefCppToC { - public: - explicit CefFrameCppToC(CefFrame* cls); - virtual ~CefFrameCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_FRAME_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/geolocation_callback_cpptoc.cc b/cef1/libcef_dll/cpptoc/geolocation_callback_cpptoc.cc deleted file mode 100644 index 402aeefcf..000000000 --- a/cef1/libcef_dll/cpptoc/geolocation_callback_cpptoc.cc +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/geolocation_callback_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK geolocation_callback_cont( - struct _cef_geolocation_callback_t* self, int allow) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefGeolocationCallbackCppToC::Get(self)->Continue( - allow?true:false); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefGeolocationCallbackCppToC::CefGeolocationCallbackCppToC( - CefGeolocationCallback* cls) - : CefCppToC(cls) { - struct_.struct_.cont = geolocation_callback_cont; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/geolocation_callback_cpptoc.h b/cef1/libcef_dll/cpptoc/geolocation_callback_cpptoc.h deleted file mode 100644 index 7f8fdd487..000000000 --- a/cef1/libcef_dll/cpptoc/geolocation_callback_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_GEOLOCATION_CALLBACK_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_GEOLOCATION_CALLBACK_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_geolocation_handler.h" -#include "include/capi/cef_geolocation_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefGeolocationCallbackCppToC - : public CefCppToC { - public: - explicit CefGeolocationCallbackCppToC(CefGeolocationCallback* cls); - virtual ~CefGeolocationCallbackCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_GEOLOCATION_CALLBACK_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/geolocation_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/geolocation_handler_cpptoc.cc deleted file mode 100644 index d9c852e91..000000000 --- a/cef1/libcef_dll/cpptoc/geolocation_handler_cpptoc.cc +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/geolocation_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/geolocation_callback_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK geolocation_handler_on_request_geolocation_permission( - struct _cef_geolocation_handler_t* self, cef_browser_t* browser, - const cef_string_t* requesting_url, int request_id, - cef_geolocation_callback_t* callback) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: requesting_url; type: string_byref_const - DCHECK(requesting_url); - if (!requesting_url) - return; - // Verify param: callback; type: refptr_diff - DCHECK(callback); - if (!callback) - return; - - // Execute - CefGeolocationHandlerCppToC::Get(self)->OnRequestGeolocationPermission( - CefBrowserCToCpp::Wrap(browser), - CefString(requesting_url), - request_id, - CefGeolocationCallbackCToCpp::Wrap(callback)); -} - -void CEF_CALLBACK geolocation_handler_on_cancel_geolocation_permission( - struct _cef_geolocation_handler_t* self, cef_browser_t* browser, - const cef_string_t* requesting_url, int request_id) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: requesting_url; type: string_byref_const - DCHECK(requesting_url); - if (!requesting_url) - return; - - // Execute - CefGeolocationHandlerCppToC::Get(self)->OnCancelGeolocationPermission( - CefBrowserCToCpp::Wrap(browser), - CefString(requesting_url), - request_id); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefGeolocationHandlerCppToC::CefGeolocationHandlerCppToC( - CefGeolocationHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_request_geolocation_permission = - geolocation_handler_on_request_geolocation_permission; - struct_.struct_.on_cancel_geolocation_permission = - geolocation_handler_on_cancel_geolocation_permission; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/geolocation_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/geolocation_handler_cpptoc.h deleted file mode 100644 index 577422796..000000000 --- a/cef1/libcef_dll/cpptoc/geolocation_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_GEOLOCATION_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_GEOLOCATION_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_geolocation_handler.h" -#include "include/capi/cef_geolocation_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefGeolocationHandlerCppToC - : public CefCppToC { - public: - explicit CefGeolocationHandlerCppToC(CefGeolocationHandler* cls); - virtual ~CefGeolocationHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_GEOLOCATION_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/get_geolocation_callback_cpptoc.cc b/cef1/libcef_dll/cpptoc/get_geolocation_callback_cpptoc.cc deleted file mode 100644 index e51cda2e8..000000000 --- a/cef1/libcef_dll/cpptoc/get_geolocation_callback_cpptoc.cc +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/get_geolocation_callback_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK get_geolocation_callback_on_location_update( - struct _cef_get_geolocation_callback_t* self, - const struct _cef_geoposition_t* position) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: position; type: struct_byref_const - DCHECK(position); - if (!position) - return; - - // Translate param: position; type: struct_byref_const - CefGeoposition positionObj; - if (position) - positionObj.Set(*position, false); - - // Execute - CefGetGeolocationCallbackCppToC::Get(self)->OnLocationUpdate( - positionObj); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefGetGeolocationCallbackCppToC::CefGetGeolocationCallbackCppToC( - CefGetGeolocationCallback* cls) - : CefCppToC(cls) { - struct_.struct_.on_location_update = - get_geolocation_callback_on_location_update; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = - 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/get_geolocation_callback_cpptoc.h b/cef1/libcef_dll/cpptoc/get_geolocation_callback_cpptoc.h deleted file mode 100644 index d239c6962..000000000 --- a/cef1/libcef_dll/cpptoc/get_geolocation_callback_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_GET_GEOLOCATION_CALLBACK_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_GET_GEOLOCATION_CALLBACK_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_geolocation.h" -#include "include/capi/cef_geolocation_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefGetGeolocationCallbackCppToC - : public CefCppToC { - public: - explicit CefGetGeolocationCallbackCppToC(CefGetGeolocationCallback* cls); - virtual ~CefGetGeolocationCallbackCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_GET_GEOLOCATION_CALLBACK_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/jsdialog_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/jsdialog_handler_cpptoc.cc deleted file mode 100644 index c13ae51ef..000000000 --- a/cef1/libcef_dll/cpptoc/jsdialog_handler_cpptoc.cc +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/jsdialog_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/frame_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK jsdialog_handler_on_jsalert( - struct _cef_jsdialog_handler_t* self, cef_browser_t* browser, - cef_frame_t* frame, const cef_string_t* message) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return 0; - // Unverified params: message - - // Execute - bool _retval = CefJSDialogHandlerCppToC::Get(self)->OnJSAlert( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - CefString(message)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK jsdialog_handler_on_jsconfirm( - struct _cef_jsdialog_handler_t* self, cef_browser_t* browser, - cef_frame_t* frame, const cef_string_t* message, int* retval) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return 0; - // Verify param: retval; type: bool_byref - DCHECK(retval); - if (!retval) - return 0; - // Unverified params: message - - // Translate param: retval; type: bool_byref - bool retvalBool = (retval && *retval)?true:false; - - // Execute - bool _retval = CefJSDialogHandlerCppToC::Get(self)->OnJSConfirm( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - CefString(message), - retvalBool); - - // Restore param: retval; type: bool_byref - if (retval) - *retval = retvalBool?true:false; - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK jsdialog_handler_on_jsprompt( - struct _cef_jsdialog_handler_t* self, cef_browser_t* browser, - cef_frame_t* frame, const cef_string_t* message, - const cef_string_t* defaultValue, int* retval, cef_string_t* result) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return 0; - // Verify param: retval; type: bool_byref - DCHECK(retval); - if (!retval) - return 0; - // Verify param: result; type: string_byref - DCHECK(result); - if (!result) - return 0; - // Unverified params: message, defaultValue - - // Translate param: retval; type: bool_byref - bool retvalBool = (retval && *retval)?true:false; - // Translate param: result; type: string_byref - CefString resultStr(result); - - // Execute - bool _retval = CefJSDialogHandlerCppToC::Get(self)->OnJSPrompt( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - CefString(message), - CefString(defaultValue), - retvalBool, - resultStr); - - // Restore param: retval; type: bool_byref - if (retval) - *retval = retvalBool?true:false; - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefJSDialogHandlerCppToC::CefJSDialogHandlerCppToC(CefJSDialogHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_jsalert = jsdialog_handler_on_jsalert; - struct_.struct_.on_jsconfirm = jsdialog_handler_on_jsconfirm; - struct_.struct_.on_jsprompt = jsdialog_handler_on_jsprompt; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/jsdialog_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/jsdialog_handler_cpptoc.h deleted file mode 100644 index 68a07b83e..000000000 --- a/cef1/libcef_dll/cpptoc/jsdialog_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_JSDIALOG_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_JSDIALOG_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_jsdialog_handler.h" -#include "include/capi/cef_jsdialog_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefJSDialogHandlerCppToC - : public CefCppToC { - public: - explicit CefJSDialogHandlerCppToC(CefJSDialogHandler* cls); - virtual ~CefJSDialogHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_JSDIALOG_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/keyboard_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/keyboard_handler_cpptoc.cc deleted file mode 100644 index 17cdd1c3b..000000000 --- a/cef1/libcef_dll/cpptoc/keyboard_handler_cpptoc.cc +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/keyboard_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK keyboard_handler_on_key_event( - struct _cef_keyboard_handler_t* self, cef_browser_t* browser, - enum cef_handler_keyevent_type_t type, int code, int modifiers, - int isSystemKey, int isAfterJavaScript) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - - // Execute - bool _retval = CefKeyboardHandlerCppToC::Get(self)->OnKeyEvent( - CefBrowserCToCpp::Wrap(browser), - type, - code, - modifiers, - isSystemKey?true:false, - isAfterJavaScript?true:false); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefKeyboardHandlerCppToC::CefKeyboardHandlerCppToC(CefKeyboardHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_key_event = keyboard_handler_on_key_event; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/keyboard_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/keyboard_handler_cpptoc.h deleted file mode 100644 index 7a4829b7d..000000000 --- a/cef1/libcef_dll/cpptoc/keyboard_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_KEYBOARD_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_KEYBOARD_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_keyboard_handler.h" -#include "include/capi/cef_keyboard_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefKeyboardHandlerCppToC - : public CefCppToC { - public: - explicit CefKeyboardHandlerCppToC(CefKeyboardHandler* cls); - virtual ~CefKeyboardHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_KEYBOARD_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/life_span_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/life_span_handler_cpptoc.cc deleted file mode 100644 index cdb031b2d..000000000 --- a/cef1/libcef_dll/cpptoc/life_span_handler_cpptoc.cc +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/client_cpptoc.h" -#include "libcef_dll/cpptoc/life_span_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK life_span_handler_on_before_popup( - struct _cef_life_span_handler_t* self, cef_browser_t* parentBrowser, - const struct _cef_popup_features_t* popupFeatures, - cef_window_info_t* windowInfo, const cef_string_t* url, - cef_client_t** client, struct _cef_browser_settings_t* settings) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: parentBrowser; type: refptr_diff - DCHECK(parentBrowser); - if (!parentBrowser) - return 0; - // Verify param: popupFeatures; type: struct_byref_const - DCHECK(popupFeatures); - if (!popupFeatures) - return 0; - // Verify param: windowInfo; type: struct_byref - DCHECK(windowInfo); - if (!windowInfo) - return 0; - // Verify param: client; type: refptr_same_byref - DCHECK(client); - if (!client) - return 0; - // Verify param: settings; type: struct_byref - DCHECK(settings); - if (!settings) - return 0; - // Unverified params: url - - // Translate param: popupFeatures; type: struct_byref_const - CefPopupFeatures popupFeaturesObj; - if (popupFeatures) - popupFeaturesObj.Set(*popupFeatures, false); - // Translate param: windowInfo; type: struct_byref - CefWindowInfo windowInfoObj; - if (windowInfo) - windowInfoObj.AttachTo(*windowInfo); - // Translate param: client; type: refptr_same_byref - CefRefPtr clientPtr; - if (client && *client) - clientPtr = CefClientCppToC::Unwrap(*client); - CefClient* clientOrig = clientPtr.get(); - // Translate param: settings; type: struct_byref - CefBrowserSettings settingsObj; - if (settings) - settingsObj.AttachTo(*settings); - - // Execute - bool _retval = CefLifeSpanHandlerCppToC::Get(self)->OnBeforePopup( - CefBrowserCToCpp::Wrap(parentBrowser), - popupFeaturesObj, - windowInfoObj, - CefString(url), - clientPtr, - settingsObj); - - // Restore param: windowInfo; type: struct_byref - if (windowInfo) - windowInfoObj.DetachTo(*windowInfo); - // Restore param: client; type: refptr_same_byref - if (client) { - if (clientPtr.get()) { - if (clientPtr.get() != clientOrig) { - *client = CefClientCppToC::Wrap(clientPtr); - } - } else { - *client = NULL; - } - } - // Restore param: settings; type: struct_byref - if (settings) - settingsObj.DetachTo(*settings); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK life_span_handler_on_after_created( - struct _cef_life_span_handler_t* self, cef_browser_t* browser) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - - // Execute - CefLifeSpanHandlerCppToC::Get(self)->OnAfterCreated( - CefBrowserCToCpp::Wrap(browser)); -} - -int CEF_CALLBACK life_span_handler_run_modal( - struct _cef_life_span_handler_t* self, cef_browser_t* browser) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - - // Execute - bool _retval = CefLifeSpanHandlerCppToC::Get(self)->RunModal( - CefBrowserCToCpp::Wrap(browser)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK life_span_handler_do_close( - struct _cef_life_span_handler_t* self, cef_browser_t* browser) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - - // Execute - bool _retval = CefLifeSpanHandlerCppToC::Get(self)->DoClose( - CefBrowserCToCpp::Wrap(browser)); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK life_span_handler_on_before_close( - struct _cef_life_span_handler_t* self, cef_browser_t* browser) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - - // Execute - CefLifeSpanHandlerCppToC::Get(self)->OnBeforeClose( - CefBrowserCToCpp::Wrap(browser)); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefLifeSpanHandlerCppToC::CefLifeSpanHandlerCppToC(CefLifeSpanHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_before_popup = life_span_handler_on_before_popup; - struct_.struct_.on_after_created = life_span_handler_on_after_created; - struct_.struct_.run_modal = life_span_handler_run_modal; - struct_.struct_.do_close = life_span_handler_do_close; - struct_.struct_.on_before_close = life_span_handler_on_before_close; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/life_span_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/life_span_handler_cpptoc.h deleted file mode 100644 index 360073aad..000000000 --- a/cef1/libcef_dll/cpptoc/life_span_handler_cpptoc.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_LIFE_SPAN_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_LIFE_SPAN_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_life_span_handler.h" -#include "include/capi/cef_life_span_handler_capi.h" -#include "include/cef_client.h" -#include "include/capi/cef_client_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefLifeSpanHandlerCppToC - : public CefCppToC { - public: - explicit CefLifeSpanHandlerCppToC(CefLifeSpanHandler* cls); - virtual ~CefLifeSpanHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_LIFE_SPAN_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/load_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/load_handler_cpptoc.cc deleted file mode 100644 index edd52c8a2..000000000 --- a/cef1/libcef_dll/cpptoc/load_handler_cpptoc.cc +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/load_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/frame_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK load_handler_on_load_start(struct _cef_load_handler_t* self, - cef_browser_t* browser, cef_frame_t* frame) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return; - - // Execute - CefLoadHandlerCppToC::Get(self)->OnLoadStart( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame)); -} - -void CEF_CALLBACK load_handler_on_load_end(struct _cef_load_handler_t* self, - cef_browser_t* browser, cef_frame_t* frame, int httpStatusCode) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return; - - // Execute - CefLoadHandlerCppToC::Get(self)->OnLoadEnd( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - httpStatusCode); -} - -int CEF_CALLBACK load_handler_on_load_error(struct _cef_load_handler_t* self, - cef_browser_t* browser, cef_frame_t* frame, - enum cef_handler_errorcode_t errorCode, const cef_string_t* failedUrl, - cef_string_t* errorText) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return 0; - // Verify param: failedUrl; type: string_byref_const - DCHECK(failedUrl); - if (!failedUrl) - return 0; - // Verify param: errorText; type: string_byref - DCHECK(errorText); - if (!errorText) - return 0; - - // Translate param: errorText; type: string_byref - CefString errorTextStr(errorText); - - // Execute - bool _retval = CefLoadHandlerCppToC::Get(self)->OnLoadError( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - errorCode, - CefString(failedUrl), - errorTextStr); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefLoadHandlerCppToC::CefLoadHandlerCppToC(CefLoadHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_load_start = load_handler_on_load_start; - struct_.struct_.on_load_end = load_handler_on_load_end; - struct_.struct_.on_load_error = load_handler_on_load_error; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/load_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/load_handler_cpptoc.h deleted file mode 100644 index 7043d0aad..000000000 --- a/cef1/libcef_dll/cpptoc/load_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_LOAD_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_LOAD_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_load_handler.h" -#include "include/capi/cef_load_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefLoadHandlerCppToC - : public CefCppToC { - public: - explicit CefLoadHandlerCppToC(CefLoadHandler* cls); - virtual ~CefLoadHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_LOAD_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/menu_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/menu_handler_cpptoc.cc deleted file mode 100644 index f5e3f7b5a..000000000 --- a/cef1/libcef_dll/cpptoc/menu_handler_cpptoc.cc +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/menu_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK menu_handler_on_before_menu(struct _cef_menu_handler_t* self, - cef_browser_t* browser, const struct _cef_menu_info_t* menuInfo) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: menuInfo; type: struct_byref_const - DCHECK(menuInfo); - if (!menuInfo) - return 0; - - // Translate param: menuInfo; type: struct_byref_const - CefMenuInfo menuInfoObj; - if (menuInfo) - menuInfoObj.Set(*menuInfo, false); - - // Execute - bool _retval = CefMenuHandlerCppToC::Get(self)->OnBeforeMenu( - CefBrowserCToCpp::Wrap(browser), - menuInfoObj); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK menu_handler_get_menu_label(struct _cef_menu_handler_t* self, - cef_browser_t* browser, enum cef_menu_id_t menuId, cef_string_t* label) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: label; type: string_byref - DCHECK(label); - if (!label) - return; - - // Translate param: label; type: string_byref - CefString labelStr(label); - - // Execute - CefMenuHandlerCppToC::Get(self)->GetMenuLabel( - CefBrowserCToCpp::Wrap(browser), - menuId, - labelStr); -} - -int CEF_CALLBACK menu_handler_on_menu_action(struct _cef_menu_handler_t* self, - cef_browser_t* browser, enum cef_menu_id_t menuId) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - - // Execute - bool _retval = CefMenuHandlerCppToC::Get(self)->OnMenuAction( - CefBrowserCToCpp::Wrap(browser), - menuId); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefMenuHandlerCppToC::CefMenuHandlerCppToC(CefMenuHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_before_menu = menu_handler_on_before_menu; - struct_.struct_.get_menu_label = menu_handler_get_menu_label; - struct_.struct_.on_menu_action = menu_handler_on_menu_action; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/menu_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/menu_handler_cpptoc.h deleted file mode 100644 index 11e1266f1..000000000 --- a/cef1/libcef_dll/cpptoc/menu_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_MENU_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_MENU_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_menu_handler.h" -#include "include/capi/cef_menu_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefMenuHandlerCppToC - : public CefCppToC { - public: - explicit CefMenuHandlerCppToC(CefMenuHandler* cls); - virtual ~CefMenuHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_MENU_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/permission_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/permission_handler_cpptoc.cc deleted file mode 100644 index 1011606db..000000000 --- a/cef1/libcef_dll/cpptoc/permission_handler_cpptoc.cc +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/permission_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/frame_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK permission_handler_on_before_script_extension_load( - struct _cef_permission_handler_t* self, cef_browser_t* browser, - cef_frame_t* frame, const cef_string_t* extensionName) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return 0; - // Verify param: extensionName; type: string_byref_const - DCHECK(extensionName); - if (!extensionName) - return 0; - - // Execute - bool _retval = CefPermissionHandlerCppToC::Get( - self)->OnBeforeScriptExtensionLoad( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - CefString(extensionName)); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefPermissionHandlerCppToC::CefPermissionHandlerCppToC( - CefPermissionHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_before_script_extension_load = - permission_handler_on_before_script_extension_load; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/permission_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/permission_handler_cpptoc.h deleted file mode 100644 index ab6d50a30..000000000 --- a/cef1/libcef_dll/cpptoc/permission_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_PERMISSION_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_PERMISSION_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_permission_handler.h" -#include "include/capi/cef_permission_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefPermissionHandlerCppToC - : public CefCppToC { - public: - explicit CefPermissionHandlerCppToC(CefPermissionHandler* cls); - virtual ~CefPermissionHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_PERMISSION_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/post_data_cpptoc.cc b/cef1/libcef_dll/cpptoc/post_data_cpptoc.cc deleted file mode 100644 index 7b935ba78..000000000 --- a/cef1/libcef_dll/cpptoc/post_data_cpptoc.cc +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/post_data_cpptoc.h" -#include "libcef_dll/cpptoc/post_data_element_cpptoc.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_post_data_t* cef_post_data_create() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefPostData::CreatePostData(); - - // Return type: refptr_same - return CefPostDataCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -size_t CEF_CALLBACK post_data_get_element_count(struct _cef_post_data_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - size_t _retval = CefPostDataCppToC::Get(self)->GetElementCount(); - - // Return type: simple - return _retval; -} - -void CEF_CALLBACK post_data_get_elements(struct _cef_post_data_t* self, - size_t* elementsCount, struct _cef_post_data_element_t** elements) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: elements; type: refptr_vec_same_byref - DCHECK(elementsCount && (*elementsCount == 0 || elements)); - if (!elementsCount || (*elementsCount > 0 && !elements)) - return; - - // Translate param: elements; type: refptr_vec_same_byref - std::vector > elementsList; - if (elementsCount && *elementsCount > 0 && elements) { - for (size_t i = 0; i < *elementsCount; ++i) { - elementsList.push_back(CefPostDataElementCppToC::Unwrap(elements[i])); - } - } - - // Execute - CefPostDataCppToC::Get(self)->GetElements( - elementsList); - - // Restore param: elements; type: refptr_vec_same_byref - if (elementsCount && elements) { - *elementsCount = std::min(elementsList.size(), *elementsCount); - if (*elementsCount > 0) { - for (size_t i = 0; i < *elementsCount; ++i) { - elements[i] = CefPostDataElementCppToC::Wrap(elementsList[i]); - } - } - } -} - -int CEF_CALLBACK post_data_remove_element(struct _cef_post_data_t* self, - struct _cef_post_data_element_t* element) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: element; type: refptr_same - DCHECK(element); - if (!element) - return 0; - - // Execute - bool _retval = CefPostDataCppToC::Get(self)->RemoveElement( - CefPostDataElementCppToC::Unwrap(element)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK post_data_add_element(struct _cef_post_data_t* self, - struct _cef_post_data_element_t* element) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: element; type: refptr_same - DCHECK(element); - if (!element) - return 0; - - // Execute - bool _retval = CefPostDataCppToC::Get(self)->AddElement( - CefPostDataElementCppToC::Unwrap(element)); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK post_data_remove_elements(struct _cef_post_data_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefPostDataCppToC::Get(self)->RemoveElements(); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefPostDataCppToC::CefPostDataCppToC(CefPostData* cls) - : CefCppToC(cls) { - struct_.struct_.get_element_count = post_data_get_element_count; - struct_.struct_.get_elements = post_data_get_elements; - struct_.struct_.remove_element = post_data_remove_element; - struct_.struct_.add_element = post_data_add_element; - struct_.struct_.remove_elements = post_data_remove_elements; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/post_data_cpptoc.h b/cef1/libcef_dll/cpptoc/post_data_cpptoc.h deleted file mode 100644 index 0b2886541..000000000 --- a/cef1/libcef_dll/cpptoc/post_data_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_POST_DATA_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_POST_DATA_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_request.h" -#include "include/capi/cef_request_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefPostDataCppToC - : public CefCppToC { - public: - explicit CefPostDataCppToC(CefPostData* cls); - virtual ~CefPostDataCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_POST_DATA_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/post_data_element_cpptoc.cc b/cef1/libcef_dll/cpptoc/post_data_element_cpptoc.cc deleted file mode 100644 index 917e4487d..000000000 --- a/cef1/libcef_dll/cpptoc/post_data_element_cpptoc.cc +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/post_data_element_cpptoc.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_post_data_element_t* cef_post_data_element_create() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = - CefPostDataElement::CreatePostDataElement(); - - // Return type: refptr_same - return CefPostDataElementCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK post_data_element_set_to_empty( - struct _cef_post_data_element_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefPostDataElementCppToC::Get(self)->SetToEmpty(); -} - -void CEF_CALLBACK post_data_element_set_to_file( - struct _cef_post_data_element_t* self, const cef_string_t* fileName) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: fileName; type: string_byref_const - DCHECK(fileName); - if (!fileName) - return; - - // Execute - CefPostDataElementCppToC::Get(self)->SetToFile( - CefString(fileName)); -} - -void CEF_CALLBACK post_data_element_set_to_bytes( - struct _cef_post_data_element_t* self, size_t size, const void* bytes) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: bytes; type: simple_byaddr - DCHECK(bytes); - if (!bytes) - return; - - // Execute - CefPostDataElementCppToC::Get(self)->SetToBytes( - size, - bytes); -} - -enum cef_postdataelement_type_t CEF_CALLBACK post_data_element_get_type( - struct _cef_post_data_element_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return PDE_TYPE_EMPTY; - - // Execute - cef_postdataelement_type_t _retval = CefPostDataElementCppToC::Get( - self)->GetType(); - - // Return type: simple - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK post_data_element_get_file( - struct _cef_post_data_element_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefPostDataElementCppToC::Get(self)->GetFile(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -size_t CEF_CALLBACK post_data_element_get_bytes_count( - struct _cef_post_data_element_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - size_t _retval = CefPostDataElementCppToC::Get(self)->GetBytesCount(); - - // Return type: simple - return _retval; -} - -size_t CEF_CALLBACK post_data_element_get_bytes( - struct _cef_post_data_element_t* self, size_t size, void* bytes) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: bytes; type: simple_byaddr - DCHECK(bytes); - if (!bytes) - return 0; - - // Execute - size_t _retval = CefPostDataElementCppToC::Get(self)->GetBytes( - size, - bytes); - - // Return type: simple - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefPostDataElementCppToC::CefPostDataElementCppToC(CefPostDataElement* cls) - : CefCppToC(cls) { - struct_.struct_.set_to_empty = post_data_element_set_to_empty; - struct_.struct_.set_to_file = post_data_element_set_to_file; - struct_.struct_.set_to_bytes = post_data_element_set_to_bytes; - struct_.struct_.get_type = post_data_element_get_type; - struct_.struct_.get_file = post_data_element_get_file; - struct_.struct_.get_bytes_count = post_data_element_get_bytes_count; - struct_.struct_.get_bytes = post_data_element_get_bytes; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/post_data_element_cpptoc.h b/cef1/libcef_dll/cpptoc/post_data_element_cpptoc.h deleted file mode 100644 index d7449c7ea..000000000 --- a/cef1/libcef_dll/cpptoc/post_data_element_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_POST_DATA_ELEMENT_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_POST_DATA_ELEMENT_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_request.h" -#include "include/capi/cef_request_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefPostDataElementCppToC - : public CefCppToC { - public: - explicit CefPostDataElementCppToC(CefPostDataElement* cls); - virtual ~CefPostDataElementCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_POST_DATA_ELEMENT_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/print_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/print_handler_cpptoc.cc deleted file mode 100644 index b7d7fc447..000000000 --- a/cef1/libcef_dll/cpptoc/print_handler_cpptoc.cc +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/print_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/frame_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK print_handler_get_print_options( - struct _cef_print_handler_t* self, cef_browser_t* browser, - struct _cef_print_options_t* printOptions) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: printOptions; type: struct_byref - DCHECK(printOptions); - if (!printOptions) - return 0; - - // Translate param: printOptions; type: struct_byref - CefPrintOptions printOptionsObj; - if (printOptions) - printOptionsObj.AttachTo(*printOptions); - - // Execute - bool _retval = CefPrintHandlerCppToC::Get(self)->GetPrintOptions( - CefBrowserCToCpp::Wrap(browser), - printOptionsObj); - - // Restore param: printOptions; type: struct_byref - if (printOptions) - printOptionsObj.DetachTo(*printOptions); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK print_handler_get_print_header_footer( - struct _cef_print_handler_t* self, cef_browser_t* browser, - cef_frame_t* frame, const cef_print_info_t* printInfo, - const cef_string_t* url, const cef_string_t* title, int currentPage, - int maxPages, cef_string_t* topLeft, cef_string_t* topCenter, - cef_string_t* topRight, cef_string_t* bottomLeft, - cef_string_t* bottomCenter, cef_string_t* bottomRight) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return 0; - // Verify param: printInfo; type: struct_byref_const - DCHECK(printInfo); - if (!printInfo) - return 0; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return 0; - // Verify param: title; type: string_byref_const - DCHECK(title); - if (!title) - return 0; - // Verify param: topLeft; type: string_byref - DCHECK(topLeft); - if (!topLeft) - return 0; - // Verify param: topCenter; type: string_byref - DCHECK(topCenter); - if (!topCenter) - return 0; - // Verify param: topRight; type: string_byref - DCHECK(topRight); - if (!topRight) - return 0; - // Verify param: bottomLeft; type: string_byref - DCHECK(bottomLeft); - if (!bottomLeft) - return 0; - // Verify param: bottomCenter; type: string_byref - DCHECK(bottomCenter); - if (!bottomCenter) - return 0; - // Verify param: bottomRight; type: string_byref - DCHECK(bottomRight); - if (!bottomRight) - return 0; - - // Translate param: printInfo; type: struct_byref_const - CefPrintInfo printInfoObj; - if (printInfo) - printInfoObj.Set(*printInfo, false); - // Translate param: topLeft; type: string_byref - CefString topLeftStr(topLeft); - // Translate param: topCenter; type: string_byref - CefString topCenterStr(topCenter); - // Translate param: topRight; type: string_byref - CefString topRightStr(topRight); - // Translate param: bottomLeft; type: string_byref - CefString bottomLeftStr(bottomLeft); - // Translate param: bottomCenter; type: string_byref - CefString bottomCenterStr(bottomCenter); - // Translate param: bottomRight; type: string_byref - CefString bottomRightStr(bottomRight); - - // Execute - bool _retval = CefPrintHandlerCppToC::Get(self)->GetPrintHeaderFooter( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - printInfoObj, - CefString(url), - CefString(title), - currentPage, - maxPages, - topLeftStr, - topCenterStr, - topRightStr, - bottomLeftStr, - bottomCenterStr, - bottomRightStr); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefPrintHandlerCppToC::CefPrintHandlerCppToC(CefPrintHandler* cls) - : CefCppToC( - cls) { - struct_.struct_.get_print_options = print_handler_get_print_options; - struct_.struct_.get_print_header_footer = - print_handler_get_print_header_footer; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/print_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/print_handler_cpptoc.h deleted file mode 100644 index 5c6a0725e..000000000 --- a/cef1/libcef_dll/cpptoc/print_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_PRINT_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_PRINT_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_print_handler.h" -#include "include/capi/cef_print_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefPrintHandlerCppToC - : public CefCppToC { - public: - explicit CefPrintHandlerCppToC(CefPrintHandler* cls); - virtual ~CefPrintHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_PRINT_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/proxy_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/proxy_handler_cpptoc.cc deleted file mode 100644 index 98aaeb7b5..000000000 --- a/cef1/libcef_dll/cpptoc/proxy_handler_cpptoc.cc +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/proxy_handler_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK proxy_handler_get_proxy_for_url( - struct _cef_proxy_handler_t* self, const cef_string_t* url, - struct _cef_proxy_info_t* proxy_info) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return; - // Verify param: proxy_info; type: struct_byref - DCHECK(proxy_info); - if (!proxy_info) - return; - - // Translate param: proxy_info; type: struct_byref - CefProxyInfo proxy_infoObj; - if (proxy_info) - proxy_infoObj.AttachTo(*proxy_info); - - // Execute - CefProxyHandlerCppToC::Get(self)->GetProxyForUrl( - CefString(url), - proxy_infoObj); - - // Restore param: proxy_info; type: struct_byref - if (proxy_info) - proxy_infoObj.DetachTo(*proxy_info); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefProxyHandlerCppToC::CefProxyHandlerCppToC(CefProxyHandler* cls) - : CefCppToC( - cls) { - struct_.struct_.get_proxy_for_url = proxy_handler_get_proxy_for_url; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/proxy_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/proxy_handler_cpptoc.h deleted file mode 100644 index 560b82698..000000000 --- a/cef1/libcef_dll/cpptoc/proxy_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_PROXY_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_PROXY_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_proxy_handler.h" -#include "include/capi/cef_proxy_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefProxyHandlerCppToC - : public CefCppToC { - public: - explicit CefProxyHandlerCppToC(CefProxyHandler* cls); - virtual ~CefProxyHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_PROXY_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/read_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/read_handler_cpptoc.cc deleted file mode 100644 index cc5495019..000000000 --- a/cef1/libcef_dll/cpptoc/read_handler_cpptoc.cc +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/read_handler_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -size_t CEF_CALLBACK read_handler_read(struct _cef_read_handler_t* self, - void* ptr, size_t size, size_t n) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: ptr; type: simple_byaddr - DCHECK(ptr); - if (!ptr) - return 0; - - // Execute - size_t _retval = CefReadHandlerCppToC::Get(self)->Read( - ptr, - size, - n); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK read_handler_seek(struct _cef_read_handler_t* self, - int64 offset, int whence) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefReadHandlerCppToC::Get(self)->Seek( - offset, - whence); - - // Return type: simple - return _retval; -} - -int64 CEF_CALLBACK read_handler_tell(struct _cef_read_handler_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int64 _retval = CefReadHandlerCppToC::Get(self)->Tell(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK read_handler_eof(struct _cef_read_handler_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefReadHandlerCppToC::Get(self)->Eof(); - - // Return type: simple - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefReadHandlerCppToC::CefReadHandlerCppToC(CefReadHandler* cls) - : CefCppToC(cls) { - struct_.struct_.read = read_handler_read; - struct_.struct_.seek = read_handler_seek; - struct_.struct_.tell = read_handler_tell; - struct_.struct_.eof = read_handler_eof; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/read_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/read_handler_cpptoc.h deleted file mode 100644 index 04ffba8d4..000000000 --- a/cef1/libcef_dll/cpptoc/read_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_READ_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_READ_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_stream.h" -#include "include/capi/cef_stream_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefReadHandlerCppToC - : public CefCppToC { - public: - explicit CefReadHandlerCppToC(CefReadHandler* cls); - virtual ~CefReadHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_READ_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/render_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/render_handler_cpptoc.cc deleted file mode 100644 index 1c7176c0b..000000000 --- a/cef1/libcef_dll/cpptoc/render_handler_cpptoc.cc +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/render_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK render_handler_get_view_rect( - struct _cef_render_handler_t* self, cef_browser_t* browser, - cef_rect_t* rect) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: rect; type: simple_byref - DCHECK(rect); - if (!rect) - return 0; - - // Translate param: rect; type: simple_byref - CefRect rectVal = rect?*rect:CefRect(); - - // Execute - bool _retval = CefRenderHandlerCppToC::Get(self)->GetViewRect( - CefBrowserCToCpp::Wrap(browser), - rectVal); - - // Restore param: rect; type: simple_byref - if (rect) - *rect = rectVal; - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK render_handler_get_screen_rect( - struct _cef_render_handler_t* self, cef_browser_t* browser, - cef_rect_t* rect) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: rect; type: simple_byref - DCHECK(rect); - if (!rect) - return 0; - - // Translate param: rect; type: simple_byref - CefRect rectVal = rect?*rect:CefRect(); - - // Execute - bool _retval = CefRenderHandlerCppToC::Get(self)->GetScreenRect( - CefBrowserCToCpp::Wrap(browser), - rectVal); - - // Restore param: rect; type: simple_byref - if (rect) - *rect = rectVal; - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK render_handler_get_screen_point( - struct _cef_render_handler_t* self, cef_browser_t* browser, int viewX, - int viewY, int* screenX, int* screenY) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: screenX; type: simple_byref - DCHECK(screenX); - if (!screenX) - return 0; - // Verify param: screenY; type: simple_byref - DCHECK(screenY); - if (!screenY) - return 0; - - // Translate param: screenX; type: simple_byref - int screenXVal = screenX?*screenX:0; - // Translate param: screenY; type: simple_byref - int screenYVal = screenY?*screenY:0; - - // Execute - bool _retval = CefRenderHandlerCppToC::Get(self)->GetScreenPoint( - CefBrowserCToCpp::Wrap(browser), - viewX, - viewY, - screenXVal, - screenYVal); - - // Restore param: screenX; type: simple_byref - if (screenX) - *screenX = screenXVal; - // Restore param: screenY; type: simple_byref - if (screenY) - *screenY = screenYVal; - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK render_handler_on_popup_show( - struct _cef_render_handler_t* self, cef_browser_t* browser, int show) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - - // Execute - CefRenderHandlerCppToC::Get(self)->OnPopupShow( - CefBrowserCToCpp::Wrap(browser), - show?true:false); -} - -void CEF_CALLBACK render_handler_on_popup_size( - struct _cef_render_handler_t* self, cef_browser_t* browser, - const cef_rect_t* rect) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: rect; type: simple_byref_const - DCHECK(rect); - if (!rect) - return; - - // Translate param: rect; type: simple_byref_const - CefRect rectVal = rect?*rect:CefRect(); - - // Execute - CefRenderHandlerCppToC::Get(self)->OnPopupSize( - CefBrowserCToCpp::Wrap(browser), - rectVal); -} - -void CEF_CALLBACK render_handler_on_paint(struct _cef_render_handler_t* self, - cef_browser_t* browser, enum cef_paint_element_type_t type, - size_t dirtyRectsCount, cef_rect_t const* dirtyRects, - const void* buffer) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: dirtyRects; type: simple_vec_byref_const - DCHECK(dirtyRectsCount == 0 || dirtyRects); - if (dirtyRectsCount > 0 && !dirtyRects) - return; - // Verify param: buffer; type: simple_byaddr - DCHECK(buffer); - if (!buffer) - return; - - // Translate param: dirtyRects; type: simple_vec_byref_const - std::vector dirtyRectsList; - if (dirtyRectsCount > 0) { - for (size_t i = 0; i < dirtyRectsCount; ++i) { - dirtyRectsList.push_back(dirtyRects[i]); - } - } - - // Execute - CefRenderHandlerCppToC::Get(self)->OnPaint( - CefBrowserCToCpp::Wrap(browser), - type, - dirtyRectsList, - buffer); -} - -void CEF_CALLBACK render_handler_on_cursor_change( - struct _cef_render_handler_t* self, cef_browser_t* browser, - cef_cursor_handle_t cursor) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - - // Execute - CefRenderHandlerCppToC::Get(self)->OnCursorChange( - CefBrowserCToCpp::Wrap(browser), - cursor); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefRenderHandlerCppToC::CefRenderHandlerCppToC(CefRenderHandler* cls) - : CefCppToC( - cls) { - struct_.struct_.get_view_rect = render_handler_get_view_rect; - struct_.struct_.get_screen_rect = render_handler_get_screen_rect; - struct_.struct_.get_screen_point = render_handler_get_screen_point; - struct_.struct_.on_popup_show = render_handler_on_popup_show; - struct_.struct_.on_popup_size = render_handler_on_popup_size; - struct_.struct_.on_paint = render_handler_on_paint; - struct_.struct_.on_cursor_change = render_handler_on_cursor_change; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/render_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/render_handler_cpptoc.h deleted file mode 100644 index 1fd90fe3f..000000000 --- a/cef1/libcef_dll/cpptoc/render_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_RENDER_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_RENDER_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_render_handler.h" -#include "include/capi/cef_render_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefRenderHandlerCppToC - : public CefCppToC { - public: - explicit CefRenderHandlerCppToC(CefRenderHandler* cls); - virtual ~CefRenderHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_RENDER_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/request_cpptoc.cc b/cef1/libcef_dll/cpptoc/request_cpptoc.cc deleted file mode 100644 index c45e19dff..000000000 --- a/cef1/libcef_dll/cpptoc/request_cpptoc.cc +++ /dev/null @@ -1,295 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/post_data_cpptoc.h" -#include "libcef_dll/cpptoc/request_cpptoc.h" -#include "libcef_dll/transfer_util.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_request_t* cef_request_create() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefRequest::CreateRequest(); - - // Return type: refptr_same - return CefRequestCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -cef_string_userfree_t CEF_CALLBACK request_get_url( - struct _cef_request_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefRequestCppToC::Get(self)->GetURL(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -void CEF_CALLBACK request_set_url(struct _cef_request_t* self, - const cef_string_t* url) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return; - - // Execute - CefRequestCppToC::Get(self)->SetURL( - CefString(url)); -} - -cef_string_userfree_t CEF_CALLBACK request_get_method( - struct _cef_request_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefRequestCppToC::Get(self)->GetMethod(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -void CEF_CALLBACK request_set_method(struct _cef_request_t* self, - const cef_string_t* method) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: method; type: string_byref_const - DCHECK(method); - if (!method) - return; - - // Execute - CefRequestCppToC::Get(self)->SetMethod( - CefString(method)); -} - -struct _cef_post_data_t* CEF_CALLBACK request_get_post_data( - struct _cef_request_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefRequestCppToC::Get(self)->GetPostData(); - - // Return type: refptr_same - return CefPostDataCppToC::Wrap(_retval); -} - -void CEF_CALLBACK request_set_post_data(struct _cef_request_t* self, - struct _cef_post_data_t* postData) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: postData; type: refptr_same - DCHECK(postData); - if (!postData) - return; - - // Execute - CefRequestCppToC::Get(self)->SetPostData( - CefPostDataCppToC::Unwrap(postData)); -} - -void CEF_CALLBACK request_get_header_map(struct _cef_request_t* self, - cef_string_multimap_t headerMap) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: headerMap; type: string_map_multi_byref - DCHECK(headerMap); - if (!headerMap) - return; - - // Translate param: headerMap; type: string_map_multi_byref - std::multimap headerMapMultimap; - transfer_string_multimap_contents(headerMap, headerMapMultimap); - - // Execute - CefRequestCppToC::Get(self)->GetHeaderMap( - headerMapMultimap); - - // Restore param: headerMap; type: string_map_multi_byref - cef_string_multimap_clear(headerMap); - transfer_string_multimap_contents(headerMapMultimap, headerMap); -} - -void CEF_CALLBACK request_set_header_map(struct _cef_request_t* self, - cef_string_multimap_t headerMap) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: headerMap; type: string_map_multi_byref_const - DCHECK(headerMap); - if (!headerMap) - return; - - // Translate param: headerMap; type: string_map_multi_byref_const - std::multimap headerMapMultimap; - transfer_string_multimap_contents(headerMap, headerMapMultimap); - - // Execute - CefRequestCppToC::Get(self)->SetHeaderMap( - headerMapMultimap); -} - -void CEF_CALLBACK request_set(struct _cef_request_t* self, - const cef_string_t* url, const cef_string_t* method, - struct _cef_post_data_t* postData, cef_string_multimap_t headerMap) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return; - // Verify param: method; type: string_byref_const - DCHECK(method); - if (!method) - return; - // Verify param: headerMap; type: string_map_multi_byref_const - DCHECK(headerMap); - if (!headerMap) - return; - // Unverified params: postData - - // Translate param: headerMap; type: string_map_multi_byref_const - std::multimap headerMapMultimap; - transfer_string_multimap_contents(headerMap, headerMapMultimap); - - // Execute - CefRequestCppToC::Get(self)->Set( - CefString(url), - CefString(method), - CefPostDataCppToC::Unwrap(postData), - headerMapMultimap); -} - -enum cef_weburlrequest_flags_t CEF_CALLBACK request_get_flags( - struct _cef_request_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return WUR_FLAG_NONE; - - // Execute - cef_weburlrequest_flags_t _retval = CefRequestCppToC::Get(self)->GetFlags(); - - // Return type: simple - return _retval; -} - -void CEF_CALLBACK request_set_flags(struct _cef_request_t* self, - enum cef_weburlrequest_flags_t flags) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefRequestCppToC::Get(self)->SetFlags( - flags); -} - -cef_string_userfree_t CEF_CALLBACK request_get_first_party_for_cookies( - struct _cef_request_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefRequestCppToC::Get(self)->GetFirstPartyForCookies(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -void CEF_CALLBACK request_set_first_party_for_cookies( - struct _cef_request_t* self, const cef_string_t* url) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return; - - // Execute - CefRequestCppToC::Get(self)->SetFirstPartyForCookies( - CefString(url)); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefRequestCppToC::CefRequestCppToC(CefRequest* cls) - : CefCppToC(cls) { - struct_.struct_.get_url = request_get_url; - struct_.struct_.set_url = request_set_url; - struct_.struct_.get_method = request_get_method; - struct_.struct_.set_method = request_set_method; - struct_.struct_.get_post_data = request_get_post_data; - struct_.struct_.set_post_data = request_set_post_data; - struct_.struct_.get_header_map = request_get_header_map; - struct_.struct_.set_header_map = request_set_header_map; - struct_.struct_.set = request_set; - struct_.struct_.get_flags = request_get_flags; - struct_.struct_.set_flags = request_set_flags; - struct_.struct_.get_first_party_for_cookies = - request_get_first_party_for_cookies; - struct_.struct_.set_first_party_for_cookies = - request_set_first_party_for_cookies; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/request_cpptoc.h b/cef1/libcef_dll/cpptoc/request_cpptoc.h deleted file mode 100644 index bf6655ad4..000000000 --- a/cef1/libcef_dll/cpptoc/request_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_REQUEST_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_REQUEST_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_request.h" -#include "include/capi/cef_request_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefRequestCppToC - : public CefCppToC { - public: - explicit CefRequestCppToC(CefRequest* cls); - virtual ~CefRequestCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_REQUEST_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/request_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/request_handler_cpptoc.cc deleted file mode 100644 index b499c1b46..000000000 --- a/cef1/libcef_dll/cpptoc/request_handler_cpptoc.cc +++ /dev/null @@ -1,396 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/content_filter_cpptoc.h" -#include "libcef_dll/cpptoc/download_handler_cpptoc.h" -#include "libcef_dll/cpptoc/request_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/cookie_manager_ctocpp.h" -#include "libcef_dll/ctocpp/frame_ctocpp.h" -#include "libcef_dll/ctocpp/request_ctocpp.h" -#include "libcef_dll/ctocpp/response_ctocpp.h" -#include "libcef_dll/ctocpp/stream_reader_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK request_handler_on_before_browse( - struct _cef_request_handler_t* self, cef_browser_t* browser, - cef_frame_t* frame, cef_request_t* request, - enum cef_handler_navtype_t navType, int isRedirect) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return 0; - // Verify param: request; type: refptr_diff - DCHECK(request); - if (!request) - return 0; - - // Execute - bool _retval = CefRequestHandlerCppToC::Get(self)->OnBeforeBrowse( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - CefRequestCToCpp::Wrap(request), - navType, - isRedirect?true:false); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK request_handler_on_before_resource_load( - struct _cef_request_handler_t* self, cef_browser_t* browser, - cef_request_t* request, cef_string_t* redirectUrl, - struct _cef_stream_reader_t** resourceStream, - struct _cef_response_t* response, int loadFlags) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: request; type: refptr_diff - DCHECK(request); - if (!request) - return 0; - // Verify param: redirectUrl; type: string_byref - DCHECK(redirectUrl); - if (!redirectUrl) - return 0; - // Verify param: resourceStream; type: refptr_diff_byref - DCHECK(resourceStream); - if (!resourceStream) - return 0; - // Verify param: response; type: refptr_diff - DCHECK(response); - if (!response) - return 0; - - // Translate param: redirectUrl; type: string_byref - CefString redirectUrlStr(redirectUrl); - // Translate param: resourceStream; type: refptr_diff_byref - CefRefPtr resourceStreamPtr; - if (resourceStream && *resourceStream) - resourceStreamPtr = CefStreamReaderCToCpp::Wrap(*resourceStream); - CefStreamReader* resourceStreamOrig = resourceStreamPtr.get(); - - // Execute - bool _retval = CefRequestHandlerCppToC::Get(self)->OnBeforeResourceLoad( - CefBrowserCToCpp::Wrap(browser), - CefRequestCToCpp::Wrap(request), - redirectUrlStr, - resourceStreamPtr, - CefResponseCToCpp::Wrap(response), - loadFlags); - - // Restore param: resourceStream; type: refptr_diff_byref - if (resourceStream) { - if (resourceStreamPtr.get()) { - if (resourceStreamPtr.get() != resourceStreamOrig) { - *resourceStream = CefStreamReaderCToCpp::Unwrap(resourceStreamPtr); - } - } else { - *resourceStream = NULL; - } - } - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK request_handler_on_resource_redirect( - struct _cef_request_handler_t* self, cef_browser_t* browser, - const cef_string_t* old_url, cef_string_t* new_url) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: old_url; type: string_byref_const - DCHECK(old_url); - if (!old_url) - return; - // Verify param: new_url; type: string_byref - DCHECK(new_url); - if (!new_url) - return; - - // Translate param: new_url; type: string_byref - CefString new_urlStr(new_url); - - // Execute - CefRequestHandlerCppToC::Get(self)->OnResourceRedirect( - CefBrowserCToCpp::Wrap(browser), - CefString(old_url), - new_urlStr); -} - -void CEF_CALLBACK request_handler_on_resource_response( - struct _cef_request_handler_t* self, cef_browser_t* browser, - const cef_string_t* url, struct _cef_response_t* response, - cef_content_filter_t** filter) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return; - // Verify param: response; type: refptr_diff - DCHECK(response); - if (!response) - return; - // Verify param: filter; type: refptr_same_byref - DCHECK(filter); - if (!filter) - return; - - // Translate param: filter; type: refptr_same_byref - CefRefPtr filterPtr; - if (filter && *filter) - filterPtr = CefContentFilterCppToC::Unwrap(*filter); - CefContentFilter* filterOrig = filterPtr.get(); - - // Execute - CefRequestHandlerCppToC::Get(self)->OnResourceResponse( - CefBrowserCToCpp::Wrap(browser), - CefString(url), - CefResponseCToCpp::Wrap(response), - filterPtr); - - // Restore param: filter; type: refptr_same_byref - if (filter) { - if (filterPtr.get()) { - if (filterPtr.get() != filterOrig) { - *filter = CefContentFilterCppToC::Wrap(filterPtr); - } - } else { - *filter = NULL; - } - } -} - -int CEF_CALLBACK request_handler_on_protocol_execution( - struct _cef_request_handler_t* self, cef_browser_t* browser, - const cef_string_t* url, int* allowOSExecution) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return 0; - // Verify param: allowOSExecution; type: bool_byref - DCHECK(allowOSExecution); - if (!allowOSExecution) - return 0; - - // Translate param: allowOSExecution; type: bool_byref - bool allowOSExecutionBool = ( - allowOSExecution && *allowOSExecution)?true:false; - - // Execute - bool _retval = CefRequestHandlerCppToC::Get(self)->OnProtocolExecution( - CefBrowserCToCpp::Wrap(browser), - CefString(url), - allowOSExecutionBool); - - // Restore param: allowOSExecution; type: bool_byref - if (allowOSExecution) - *allowOSExecution = allowOSExecutionBool?true:false; - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK request_handler_get_download_handler( - struct _cef_request_handler_t* self, cef_browser_t* browser, - const cef_string_t* mimeType, const cef_string_t* fileName, - int64 contentLength, cef_download_handler_t** handler) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: fileName; type: string_byref_const - DCHECK(fileName); - if (!fileName) - return 0; - // Verify param: handler; type: refptr_same_byref - DCHECK(handler); - if (!handler) - return 0; - // Unverified params: mimeType - - // Translate param: handler; type: refptr_same_byref - CefRefPtr handlerPtr; - if (handler && *handler) - handlerPtr = CefDownloadHandlerCppToC::Unwrap(*handler); - CefDownloadHandler* handlerOrig = handlerPtr.get(); - - // Execute - bool _retval = CefRequestHandlerCppToC::Get(self)->GetDownloadHandler( - CefBrowserCToCpp::Wrap(browser), - CefString(mimeType), - CefString(fileName), - contentLength, - handlerPtr); - - // Restore param: handler; type: refptr_same_byref - if (handler) { - if (handlerPtr.get()) { - if (handlerPtr.get() != handlerOrig) { - *handler = CefDownloadHandlerCppToC::Wrap(handlerPtr); - } - } else { - *handler = NULL; - } - } - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK request_handler_get_auth_credentials( - struct _cef_request_handler_t* self, cef_browser_t* browser, int isProxy, - const cef_string_t* host, int port, const cef_string_t* realm, - const cef_string_t* scheme, cef_string_t* username, - cef_string_t* password) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: host; type: string_byref_const - DCHECK(host); - if (!host) - return 0; - // Verify param: scheme; type: string_byref_const - DCHECK(scheme); - if (!scheme) - return 0; - // Verify param: username; type: string_byref - DCHECK(username); - if (!username) - return 0; - // Verify param: password; type: string_byref - DCHECK(password); - if (!password) - return 0; - // Unverified params: realm - - // Translate param: username; type: string_byref - CefString usernameStr(username); - // Translate param: password; type: string_byref - CefString passwordStr(password); - - // Execute - bool _retval = CefRequestHandlerCppToC::Get(self)->GetAuthCredentials( - CefBrowserCToCpp::Wrap(browser), - isProxy?true:false, - CefString(host), - port, - CefString(realm), - CefString(scheme), - usernameStr, - passwordStr); - - // Return type: bool - return _retval; -} - -cef_cookie_manager_t* CEF_CALLBACK request_handler_get_cookie_manager( - struct _cef_request_handler_t* self, cef_browser_t* browser, - const cef_string_t* main_url) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return NULL; - // Verify param: main_url; type: string_byref_const - DCHECK(main_url); - if (!main_url) - return NULL; - - // Execute - CefRefPtr _retval = CefRequestHandlerCppToC::Get( - self)->GetCookieManager( - CefBrowserCToCpp::Wrap(browser), - CefString(main_url)); - - // Return type: refptr_diff - return CefCookieManagerCToCpp::Unwrap(_retval); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefRequestHandlerCppToC::CefRequestHandlerCppToC(CefRequestHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_before_browse = request_handler_on_before_browse; - struct_.struct_.on_before_resource_load = - request_handler_on_before_resource_load; - struct_.struct_.on_resource_redirect = request_handler_on_resource_redirect; - struct_.struct_.on_resource_response = request_handler_on_resource_response; - struct_.struct_.on_protocol_execution = request_handler_on_protocol_execution; - struct_.struct_.get_download_handler = request_handler_get_download_handler; - struct_.struct_.get_auth_credentials = request_handler_get_auth_credentials; - struct_.struct_.get_cookie_manager = request_handler_get_cookie_manager; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/request_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/request_handler_cpptoc.h deleted file mode 100644 index 866ef1152..000000000 --- a/cef1/libcef_dll/cpptoc/request_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_REQUEST_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_REQUEST_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_request_handler.h" -#include "include/capi/cef_request_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefRequestHandlerCppToC - : public CefCppToC { - public: - explicit CefRequestHandlerCppToC(CefRequestHandler* cls); - virtual ~CefRequestHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_REQUEST_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/resource_bundle_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/resource_bundle_handler_cpptoc.cc deleted file mode 100644 index 9a6bcd8e8..000000000 --- a/cef1/libcef_dll/cpptoc/resource_bundle_handler_cpptoc.cc +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/resource_bundle_handler_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK resource_bundle_handler_get_localized_string( - struct _cef_resource_bundle_handler_t* self, int message_id, - cef_string_t* string) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: string; type: string_byref - DCHECK(string); - if (!string) - return 0; - - // Translate param: string; type: string_byref - CefString stringStr(string); - - // Execute - bool _retval = CefResourceBundleHandlerCppToC::Get(self)->GetLocalizedString( - message_id, - stringStr); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK resource_bundle_handler_get_data_resource( - struct _cef_resource_bundle_handler_t* self, int resource_id, void** data, - size_t* data_size) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: data; type: simple_byref - DCHECK(data); - if (!data) - return 0; - // Verify param: data_size; type: simple_byref - DCHECK(data_size); - if (!data_size) - return 0; - - // Translate param: data; type: simple_byref - void* dataVal = data?*data:NULL; - // Translate param: data_size; type: simple_byref - size_t data_sizeVal = data_size?*data_size:0; - - // Execute - bool _retval = CefResourceBundleHandlerCppToC::Get(self)->GetDataResource( - resource_id, - dataVal, - data_sizeVal); - - // Restore param: data; type: simple_byref - if (data) - *data = dataVal; - // Restore param: data_size; type: simple_byref - if (data_size) - *data_size = data_sizeVal; - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefResourceBundleHandlerCppToC::CefResourceBundleHandlerCppToC( - CefResourceBundleHandler* cls) - : CefCppToC(cls) { - struct_.struct_.get_localized_string = - resource_bundle_handler_get_localized_string; - struct_.struct_.get_data_resource = resource_bundle_handler_get_data_resource; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/resource_bundle_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/resource_bundle_handler_cpptoc.h deleted file mode 100644 index 8aefc1374..000000000 --- a/cef1/libcef_dll/cpptoc/resource_bundle_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_RESOURCE_BUNDLE_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_RESOURCE_BUNDLE_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_resource_bundle_handler.h" -#include "include/capi/cef_resource_bundle_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefResourceBundleHandlerCppToC - : public CefCppToC { - public: - explicit CefResourceBundleHandlerCppToC(CefResourceBundleHandler* cls); - virtual ~CefResourceBundleHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_RESOURCE_BUNDLE_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/response_cpptoc.cc b/cef1/libcef_dll/cpptoc/response_cpptoc.cc deleted file mode 100644 index b53a10345..000000000 --- a/cef1/libcef_dll/cpptoc/response_cpptoc.cc +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/response_cpptoc.h" -#include "libcef_dll/transfer_util.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK response_get_status(struct _cef_response_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefResponseCppToC::Get(self)->GetStatus(); - - // Return type: simple - return _retval; -} - -void CEF_CALLBACK response_set_status(struct _cef_response_t* self, - int status) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefResponseCppToC::Get(self)->SetStatus( - status); -} - -cef_string_userfree_t CEF_CALLBACK response_get_status_text( - struct _cef_response_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefResponseCppToC::Get(self)->GetStatusText(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -void CEF_CALLBACK response_set_status_text(struct _cef_response_t* self, - const cef_string_t* statusText) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: statusText; type: string_byref_const - DCHECK(statusText); - if (!statusText) - return; - - // Execute - CefResponseCppToC::Get(self)->SetStatusText( - CefString(statusText)); -} - -cef_string_userfree_t CEF_CALLBACK response_get_mime_type( - struct _cef_response_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefResponseCppToC::Get(self)->GetMimeType(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -void CEF_CALLBACK response_set_mime_type(struct _cef_response_t* self, - const cef_string_t* mimeType) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: mimeType; type: string_byref_const - DCHECK(mimeType); - if (!mimeType) - return; - - // Execute - CefResponseCppToC::Get(self)->SetMimeType( - CefString(mimeType)); -} - -cef_string_userfree_t CEF_CALLBACK response_get_header( - struct _cef_response_t* self, const cef_string_t* name) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: name; type: string_byref_const - DCHECK(name); - if (!name) - return NULL; - - // Execute - CefString _retval = CefResponseCppToC::Get(self)->GetHeader( - CefString(name)); - - // Return type: string - return _retval.DetachToUserFree(); -} - -void CEF_CALLBACK response_get_header_map(struct _cef_response_t* self, - cef_string_multimap_t headerMap) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: headerMap; type: string_map_multi_byref - DCHECK(headerMap); - if (!headerMap) - return; - - // Translate param: headerMap; type: string_map_multi_byref - std::multimap headerMapMultimap; - transfer_string_multimap_contents(headerMap, headerMapMultimap); - - // Execute - CefResponseCppToC::Get(self)->GetHeaderMap( - headerMapMultimap); - - // Restore param: headerMap; type: string_map_multi_byref - cef_string_multimap_clear(headerMap); - transfer_string_multimap_contents(headerMapMultimap, headerMap); -} - -void CEF_CALLBACK response_set_header_map(struct _cef_response_t* self, - cef_string_multimap_t headerMap) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: headerMap; type: string_map_multi_byref_const - DCHECK(headerMap); - if (!headerMap) - return; - - // Translate param: headerMap; type: string_map_multi_byref_const - std::multimap headerMapMultimap; - transfer_string_multimap_contents(headerMap, headerMapMultimap); - - // Execute - CefResponseCppToC::Get(self)->SetHeaderMap( - headerMapMultimap); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefResponseCppToC::CefResponseCppToC(CefResponse* cls) - : CefCppToC(cls) { - struct_.struct_.get_status = response_get_status; - struct_.struct_.set_status = response_set_status; - struct_.struct_.get_status_text = response_get_status_text; - struct_.struct_.set_status_text = response_set_status_text; - struct_.struct_.get_mime_type = response_get_mime_type; - struct_.struct_.set_mime_type = response_set_mime_type; - struct_.struct_.get_header = response_get_header; - struct_.struct_.get_header_map = response_get_header_map; - struct_.struct_.set_header_map = response_set_header_map; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/response_cpptoc.h b/cef1/libcef_dll/cpptoc/response_cpptoc.h deleted file mode 100644 index 7c1c4169a..000000000 --- a/cef1/libcef_dll/cpptoc/response_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_RESPONSE_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_RESPONSE_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_response.h" -#include "include/capi/cef_response_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefResponseCppToC - : public CefCppToC { - public: - explicit CefResponseCppToC(CefResponse* cls); - virtual ~CefResponseCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_RESPONSE_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/scheme_handler_callback_cpptoc.cc b/cef1/libcef_dll/cpptoc/scheme_handler_callback_cpptoc.cc deleted file mode 100644 index b42f34680..000000000 --- a/cef1/libcef_dll/cpptoc/scheme_handler_callback_cpptoc.cc +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/scheme_handler_callback_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK scheme_handler_callback_headers_available( - struct _cef_scheme_handler_callback_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefSchemeHandlerCallbackCppToC::Get(self)->HeadersAvailable(); -} - -void CEF_CALLBACK scheme_handler_callback_bytes_available( - struct _cef_scheme_handler_callback_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefSchemeHandlerCallbackCppToC::Get(self)->BytesAvailable(); -} - -void CEF_CALLBACK scheme_handler_callback_cancel( - struct _cef_scheme_handler_callback_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefSchemeHandlerCallbackCppToC::Get(self)->Cancel(); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefSchemeHandlerCallbackCppToC::CefSchemeHandlerCallbackCppToC( - CefSchemeHandlerCallback* cls) - : CefCppToC(cls) { - struct_.struct_.headers_available = scheme_handler_callback_headers_available; - struct_.struct_.bytes_available = scheme_handler_callback_bytes_available; - struct_.struct_.cancel = scheme_handler_callback_cancel; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/scheme_handler_callback_cpptoc.h b/cef1/libcef_dll/cpptoc/scheme_handler_callback_cpptoc.h deleted file mode 100644 index c98b1d363..000000000 --- a/cef1/libcef_dll/cpptoc/scheme_handler_callback_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_SCHEME_HANDLER_CALLBACK_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_SCHEME_HANDLER_CALLBACK_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_scheme.h" -#include "include/capi/cef_scheme_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefSchemeHandlerCallbackCppToC - : public CefCppToC { - public: - explicit CefSchemeHandlerCallbackCppToC(CefSchemeHandlerCallback* cls); - virtual ~CefSchemeHandlerCallbackCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_SCHEME_HANDLER_CALLBACK_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/scheme_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/scheme_handler_cpptoc.cc deleted file mode 100644 index ca7ea7888..000000000 --- a/cef1/libcef_dll/cpptoc/scheme_handler_cpptoc.cc +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/scheme_handler_cpptoc.h" -#include "libcef_dll/ctocpp/request_ctocpp.h" -#include "libcef_dll/ctocpp/response_ctocpp.h" -#include "libcef_dll/ctocpp/scheme_handler_callback_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK scheme_handler_process_request( - struct _cef_scheme_handler_t* self, cef_request_t* request, - cef_scheme_handler_callback_t* callback) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: request; type: refptr_diff - DCHECK(request); - if (!request) - return 0; - // Verify param: callback; type: refptr_diff - DCHECK(callback); - if (!callback) - return 0; - - // Execute - bool _retval = CefSchemeHandlerCppToC::Get(self)->ProcessRequest( - CefRequestCToCpp::Wrap(request), - CefSchemeHandlerCallbackCToCpp::Wrap(callback)); - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK scheme_handler_get_response_headers( - struct _cef_scheme_handler_t* self, cef_response_t* response, - int64* response_length, cef_string_t* redirectUrl) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: response; type: refptr_diff - DCHECK(response); - if (!response) - return; - // Verify param: response_length; type: simple_byref - DCHECK(response_length); - if (!response_length) - return; - // Verify param: redirectUrl; type: string_byref - DCHECK(redirectUrl); - if (!redirectUrl) - return; - - // Translate param: response_length; type: simple_byref - int64 response_lengthVal = response_length?*response_length:0; - // Translate param: redirectUrl; type: string_byref - CefString redirectUrlStr(redirectUrl); - - // Execute - CefSchemeHandlerCppToC::Get(self)->GetResponseHeaders( - CefResponseCToCpp::Wrap(response), - response_lengthVal, - redirectUrlStr); - - // Restore param: response_length; type: simple_byref - if (response_length) - *response_length = response_lengthVal; -} - -int CEF_CALLBACK scheme_handler_read_response( - struct _cef_scheme_handler_t* self, void* data_out, int bytes_to_read, - int* bytes_read, cef_scheme_handler_callback_t* callback) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: data_out; type: simple_byaddr - DCHECK(data_out); - if (!data_out) - return 0; - // Verify param: bytes_read; type: simple_byref - DCHECK(bytes_read); - if (!bytes_read) - return 0; - // Verify param: callback; type: refptr_diff - DCHECK(callback); - if (!callback) - return 0; - - // Translate param: bytes_read; type: simple_byref - int bytes_readVal = bytes_read?*bytes_read:0; - - // Execute - bool _retval = CefSchemeHandlerCppToC::Get(self)->ReadResponse( - data_out, - bytes_to_read, - bytes_readVal, - CefSchemeHandlerCallbackCToCpp::Wrap(callback)); - - // Restore param: bytes_read; type: simple_byref - if (bytes_read) - *bytes_read = bytes_readVal; - - // Return type: bool - return _retval; -} - -void CEF_CALLBACK scheme_handler_cancel(struct _cef_scheme_handler_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefSchemeHandlerCppToC::Get(self)->Cancel(); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefSchemeHandlerCppToC::CefSchemeHandlerCppToC(CefSchemeHandler* cls) - : CefCppToC( - cls) { - struct_.struct_.process_request = scheme_handler_process_request; - struct_.struct_.get_response_headers = scheme_handler_get_response_headers; - struct_.struct_.read_response = scheme_handler_read_response; - struct_.struct_.cancel = scheme_handler_cancel; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/scheme_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/scheme_handler_cpptoc.h deleted file mode 100644 index 15aee23c1..000000000 --- a/cef1/libcef_dll/cpptoc/scheme_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_SCHEME_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_SCHEME_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_scheme.h" -#include "include/capi/cef_scheme_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefSchemeHandlerCppToC - : public CefCppToC { - public: - explicit CefSchemeHandlerCppToC(CefSchemeHandler* cls); - virtual ~CefSchemeHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_SCHEME_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/scheme_handler_factory_cpptoc.cc b/cef1/libcef_dll/cpptoc/scheme_handler_factory_cpptoc.cc deleted file mode 100644 index e810ab613..000000000 --- a/cef1/libcef_dll/cpptoc/scheme_handler_factory_cpptoc.cc +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/scheme_handler_cpptoc.h" -#include "libcef_dll/cpptoc/scheme_handler_factory_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/request_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -struct _cef_scheme_handler_t* CEF_CALLBACK scheme_handler_factory_create( - struct _cef_scheme_handler_factory_t* self, cef_browser_t* browser, - const cef_string_t* scheme_name, cef_request_t* request) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: scheme_name; type: string_byref_const - DCHECK(scheme_name); - if (!scheme_name) - return NULL; - // Verify param: request; type: refptr_diff - DCHECK(request); - if (!request) - return NULL; - // Unverified params: browser - - // Execute - CefRefPtr _retval = CefSchemeHandlerFactoryCppToC::Get( - self)->Create( - CefBrowserCToCpp::Wrap(browser), - CefString(scheme_name), - CefRequestCToCpp::Wrap(request)); - - // Return type: refptr_same - return CefSchemeHandlerCppToC::Wrap(_retval); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefSchemeHandlerFactoryCppToC::CefSchemeHandlerFactoryCppToC( - CefSchemeHandlerFactory* cls) - : CefCppToC(cls) { - struct_.struct_.create = scheme_handler_factory_create; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/scheme_handler_factory_cpptoc.h b/cef1/libcef_dll/cpptoc/scheme_handler_factory_cpptoc.h deleted file mode 100644 index cb2f1472d..000000000 --- a/cef1/libcef_dll/cpptoc/scheme_handler_factory_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_SCHEME_HANDLER_FACTORY_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_SCHEME_HANDLER_FACTORY_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_scheme.h" -#include "include/capi/cef_scheme_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefSchemeHandlerFactoryCppToC - : public CefCppToC { - public: - explicit CefSchemeHandlerFactoryCppToC(CefSchemeHandlerFactory* cls); - virtual ~CefSchemeHandlerFactoryCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_SCHEME_HANDLER_FACTORY_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.cc b/cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.cc deleted file mode 100644 index 24702af33..000000000 --- a/cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.cc +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/scheme_registrar_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK scheme_registrar_add_custom_scheme( - struct _cef_scheme_registrar_t* self, const cef_string_t* scheme_name, - int is_standard, int is_local, int is_display_isolated) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: scheme_name; type: string_byref_const - DCHECK(scheme_name); - if (!scheme_name) - return 0; - - // Execute - bool _retval = CefSchemeRegistrarCppToC::Get(self)->AddCustomScheme( - CefString(scheme_name), - is_standard?true:false, - is_local?true:false, - is_display_isolated?true:false); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefSchemeRegistrarCppToC::CefSchemeRegistrarCppToC(CefSchemeRegistrar* cls) - : CefCppToC(cls) { - struct_.struct_.add_custom_scheme = scheme_registrar_add_custom_scheme; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.h b/cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.h deleted file mode 100644 index e5bca2e9a..000000000 --- a/cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_SCHEME_REGISTRAR_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_SCHEME_REGISTRAR_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_scheme.h" -#include "include/capi/cef_scheme_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefSchemeRegistrarCppToC - : public CefCppToC { - public: - explicit CefSchemeRegistrarCppToC(CefSchemeRegistrar* cls); - virtual ~CefSchemeRegistrarCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_SCHEME_REGISTRAR_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/stream_reader_cpptoc.cc b/cef1/libcef_dll/cpptoc/stream_reader_cpptoc.cc deleted file mode 100644 index 7d44987d8..000000000 --- a/cef1/libcef_dll/cpptoc/stream_reader_cpptoc.cc +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/stream_reader_cpptoc.h" -#include "libcef_dll/ctocpp/read_handler_ctocpp.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_stream_reader_t* cef_stream_reader_create_for_file( - const cef_string_t* fileName) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: fileName; type: string_byref_const - DCHECK(fileName); - if (!fileName) - return NULL; - - // Execute - CefRefPtr _retval = CefStreamReader::CreateForFile( - CefString(fileName)); - - // Return type: refptr_same - return CefStreamReaderCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_stream_reader_t* cef_stream_reader_create_for_data(void* data, - size_t size) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: data; type: simple_byaddr - DCHECK(data); - if (!data) - return NULL; - - // Execute - CefRefPtr _retval = CefStreamReader::CreateForData( - data, - size); - - // Return type: refptr_same - return CefStreamReaderCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_stream_reader_t* cef_stream_reader_create_for_handler( - cef_read_handler_t* handler) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: handler; type: refptr_diff - DCHECK(handler); - if (!handler) - return NULL; - - // Execute - CefRefPtr _retval = CefStreamReader::CreateForHandler( - CefReadHandlerCToCpp::Wrap(handler)); - - // Return type: refptr_same - return CefStreamReaderCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -size_t CEF_CALLBACK stream_reader_read(struct _cef_stream_reader_t* self, - void* ptr, size_t size, size_t n) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: ptr; type: simple_byaddr - DCHECK(ptr); - if (!ptr) - return 0; - - // Execute - size_t _retval = CefStreamReaderCppToC::Get(self)->Read( - ptr, - size, - n); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK stream_reader_seek(struct _cef_stream_reader_t* self, - int64 offset, int whence) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefStreamReaderCppToC::Get(self)->Seek( - offset, - whence); - - // Return type: simple - return _retval; -} - -int64 CEF_CALLBACK stream_reader_tell(struct _cef_stream_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int64 _retval = CefStreamReaderCppToC::Get(self)->Tell(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK stream_reader_eof(struct _cef_stream_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefStreamReaderCppToC::Get(self)->Eof(); - - // Return type: simple - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefStreamReaderCppToC::CefStreamReaderCppToC(CefStreamReader* cls) - : CefCppToC( - cls) { - struct_.struct_.read = stream_reader_read; - struct_.struct_.seek = stream_reader_seek; - struct_.struct_.tell = stream_reader_tell; - struct_.struct_.eof = stream_reader_eof; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/stream_reader_cpptoc.h b/cef1/libcef_dll/cpptoc/stream_reader_cpptoc.h deleted file mode 100644 index fc42ef6b8..000000000 --- a/cef1/libcef_dll/cpptoc/stream_reader_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_STREAM_READER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_STREAM_READER_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_stream.h" -#include "include/capi/cef_stream_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefStreamReaderCppToC - : public CefCppToC { - public: - explicit CefStreamReaderCppToC(CefStreamReader* cls); - virtual ~CefStreamReaderCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_STREAM_READER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/stream_writer_cpptoc.cc b/cef1/libcef_dll/cpptoc/stream_writer_cpptoc.cc deleted file mode 100644 index cc3af480f..000000000 --- a/cef1/libcef_dll/cpptoc/stream_writer_cpptoc.cc +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/stream_writer_cpptoc.h" -#include "libcef_dll/ctocpp/write_handler_ctocpp.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_stream_writer_t* cef_stream_writer_create_for_file( - const cef_string_t* fileName) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: fileName; type: string_byref_const - DCHECK(fileName); - if (!fileName) - return NULL; - - // Execute - CefRefPtr _retval = CefStreamWriter::CreateForFile( - CefString(fileName)); - - // Return type: refptr_same - return CefStreamWriterCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_stream_writer_t* cef_stream_writer_create_for_handler( - cef_write_handler_t* handler) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: handler; type: refptr_diff - DCHECK(handler); - if (!handler) - return NULL; - - // Execute - CefRefPtr _retval = CefStreamWriter::CreateForHandler( - CefWriteHandlerCToCpp::Wrap(handler)); - - // Return type: refptr_same - return CefStreamWriterCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -size_t CEF_CALLBACK stream_writer_write(struct _cef_stream_writer_t* self, - const void* ptr, size_t size, size_t n) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: ptr; type: simple_byaddr - DCHECK(ptr); - if (!ptr) - return 0; - - // Execute - size_t _retval = CefStreamWriterCppToC::Get(self)->Write( - ptr, - size, - n); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK stream_writer_seek(struct _cef_stream_writer_t* self, - int64 offset, int whence) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefStreamWriterCppToC::Get(self)->Seek( - offset, - whence); - - // Return type: simple - return _retval; -} - -int64 CEF_CALLBACK stream_writer_tell(struct _cef_stream_writer_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int64 _retval = CefStreamWriterCppToC::Get(self)->Tell(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK stream_writer_flush(struct _cef_stream_writer_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefStreamWriterCppToC::Get(self)->Flush(); - - // Return type: simple - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefStreamWriterCppToC::CefStreamWriterCppToC(CefStreamWriter* cls) - : CefCppToC( - cls) { - struct_.struct_.write = stream_writer_write; - struct_.struct_.seek = stream_writer_seek; - struct_.struct_.tell = stream_writer_tell; - struct_.struct_.flush = stream_writer_flush; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/stream_writer_cpptoc.h b/cef1/libcef_dll/cpptoc/stream_writer_cpptoc.h deleted file mode 100644 index 173748b3e..000000000 --- a/cef1/libcef_dll/cpptoc/stream_writer_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_STREAM_WRITER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_STREAM_WRITER_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_stream.h" -#include "include/capi/cef_stream_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefStreamWriterCppToC - : public CefCppToC { - public: - explicit CefStreamWriterCppToC(CefStreamWriter* cls); - virtual ~CefStreamWriterCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_STREAM_WRITER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/task_cpptoc.cc b/cef1/libcef_dll/cpptoc/task_cpptoc.cc deleted file mode 100644 index dfc8aecb2..000000000 --- a/cef1/libcef_dll/cpptoc/task_cpptoc.cc +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/task_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK task_execute(struct _cef_task_t* self, - cef_thread_id_t threadId) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefTaskCppToC::Get(self)->Execute( - threadId); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefTaskCppToC::CefTaskCppToC(CefTask* cls) - : CefCppToC(cls) { - struct_.struct_.execute = task_execute; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/task_cpptoc.h b/cef1/libcef_dll/cpptoc/task_cpptoc.h deleted file mode 100644 index 495de4c60..000000000 --- a/cef1/libcef_dll/cpptoc/task_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_TASK_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_TASK_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_task.h" -#include "include/capi/cef_task_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefTaskCppToC - : public CefCppToC { - public: - explicit CefTaskCppToC(CefTask* cls); - virtual ~CefTaskCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_TASK_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/v8accessor_cpptoc.cc b/cef1/libcef_dll/cpptoc/v8accessor_cpptoc.cc deleted file mode 100644 index cd92d6c9f..000000000 --- a/cef1/libcef_dll/cpptoc/v8accessor_cpptoc.cc +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/v8accessor_cpptoc.h" -#include "libcef_dll/ctocpp/v8value_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK v8accessor_get(struct _cef_v8accessor_t* self, - const cef_string_t* name, struct _cef_v8value_t* object, - struct _cef_v8value_t** retval, cef_string_t* exception) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: name; type: string_byref_const - DCHECK(name); - if (!name) - return 0; - // Verify param: object; type: refptr_diff - DCHECK(object); - if (!object) - return 0; - // Verify param: retval; type: refptr_diff_byref - DCHECK(retval); - if (!retval) - return 0; - // Verify param: exception; type: string_byref - DCHECK(exception); - if (!exception) - return 0; - - // Translate param: retval; type: refptr_diff_byref - CefRefPtr retvalPtr; - if (retval && *retval) - retvalPtr = CefV8ValueCToCpp::Wrap(*retval); - CefV8Value* retvalOrig = retvalPtr.get(); - // Translate param: exception; type: string_byref - CefString exceptionStr(exception); - - // Execute - bool _retval = CefV8AccessorCppToC::Get(self)->Get( - CefString(name), - CefV8ValueCToCpp::Wrap(object), - retvalPtr, - exceptionStr); - - // Restore param: retval; type: refptr_diff_byref - if (retval) { - if (retvalPtr.get()) { - if (retvalPtr.get() != retvalOrig) { - *retval = CefV8ValueCToCpp::Unwrap(retvalPtr); - } - } else { - *retval = NULL; - } - } - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8accessor_set(struct _cef_v8accessor_t* self, - const cef_string_t* name, struct _cef_v8value_t* object, - struct _cef_v8value_t* value, cef_string_t* exception) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: name; type: string_byref_const - DCHECK(name); - if (!name) - return 0; - // Verify param: object; type: refptr_diff - DCHECK(object); - if (!object) - return 0; - // Verify param: value; type: refptr_diff - DCHECK(value); - if (!value) - return 0; - // Verify param: exception; type: string_byref - DCHECK(exception); - if (!exception) - return 0; - - // Translate param: exception; type: string_byref - CefString exceptionStr(exception); - - // Execute - bool _retval = CefV8AccessorCppToC::Get(self)->Set( - CefString(name), - CefV8ValueCToCpp::Wrap(object), - CefV8ValueCToCpp::Wrap(value), - exceptionStr); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefV8AccessorCppToC::CefV8AccessorCppToC(CefV8Accessor* cls) - : CefCppToC(cls) { - struct_.struct_.get = v8accessor_get; - struct_.struct_.set = v8accessor_set; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/v8accessor_cpptoc.h b/cef1/libcef_dll/cpptoc/v8accessor_cpptoc.h deleted file mode 100644 index 80791a9a1..000000000 --- a/cef1/libcef_dll/cpptoc/v8accessor_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_V8ACCESSOR_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_V8ACCESSOR_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefV8AccessorCppToC - : public CefCppToC { - public: - explicit CefV8AccessorCppToC(CefV8Accessor* cls); - virtual ~CefV8AccessorCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_V8ACCESSOR_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/v8context_cpptoc.cc b/cef1/libcef_dll/cpptoc/v8context_cpptoc.cc deleted file mode 100644 index 61c7fe409..000000000 --- a/cef1/libcef_dll/cpptoc/v8context_cpptoc.cc +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/frame_cpptoc.h" -#include "libcef_dll/cpptoc/v8context_cpptoc.h" -#include "libcef_dll/cpptoc/v8exception_cpptoc.h" -#include "libcef_dll/cpptoc/v8value_cpptoc.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_v8context_t* cef_v8context_get_current_context() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefV8Context::GetCurrentContext(); - - // Return type: refptr_same - return CefV8ContextCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_v8context_t* cef_v8context_get_entered_context() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefV8Context::GetEnteredContext(); - - // Return type: refptr_same - return CefV8ContextCppToC::Wrap(_retval); -} - -CEF_EXPORT int cef_v8context_in_context() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - bool _retval = CefV8Context::InContext(); - - // Return type: bool - return _retval; -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK v8context_is_valid(struct _cef_v8context_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ContextCppToC::Get(self)->IsValid(); - - // Return type: bool - return _retval; -} - -cef_browser_t* CEF_CALLBACK v8context_get_browser( - struct _cef_v8context_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefV8ContextCppToC::Get(self)->GetBrowser(); - - // Return type: refptr_same - return CefBrowserCppToC::Wrap(_retval); -} - -cef_frame_t* CEF_CALLBACK v8context_get_frame(struct _cef_v8context_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefV8ContextCppToC::Get(self)->GetFrame(); - - // Return type: refptr_same - return CefFrameCppToC::Wrap(_retval); -} - -struct _cef_v8value_t* CEF_CALLBACK v8context_get_global( - struct _cef_v8context_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefV8ContextCppToC::Get(self)->GetGlobal(); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -int CEF_CALLBACK v8context_enter(struct _cef_v8context_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ContextCppToC::Get(self)->Enter(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8context_exit(struct _cef_v8context_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ContextCppToC::Get(self)->Exit(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8context_is_same(struct _cef_v8context_t* self, - struct _cef_v8context_t* that) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: that; type: refptr_same - DCHECK(that); - if (!that) - return 0; - - // Execute - bool _retval = CefV8ContextCppToC::Get(self)->IsSame( - CefV8ContextCppToC::Unwrap(that)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8context_eval(struct _cef_v8context_t* self, - const cef_string_t* code, struct _cef_v8value_t** retval, - struct _cef_v8exception_t** exception) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: code; type: string_byref_const - DCHECK(code); - if (!code) - return 0; - // Verify param: retval; type: refptr_same_byref - DCHECK(retval); - if (!retval) - return 0; - // Verify param: exception; type: refptr_same_byref - DCHECK(exception); - if (!exception) - return 0; - - // Translate param: retval; type: refptr_same_byref - CefRefPtr retvalPtr; - if (retval && *retval) - retvalPtr = CefV8ValueCppToC::Unwrap(*retval); - CefV8Value* retvalOrig = retvalPtr.get(); - // Translate param: exception; type: refptr_same_byref - CefRefPtr exceptionPtr; - if (exception && *exception) - exceptionPtr = CefV8ExceptionCppToC::Unwrap(*exception); - CefV8Exception* exceptionOrig = exceptionPtr.get(); - - // Execute - bool _retval = CefV8ContextCppToC::Get(self)->Eval( - CefString(code), - retvalPtr, - exceptionPtr); - - // Restore param: retval; type: refptr_same_byref - if (retval) { - if (retvalPtr.get()) { - if (retvalPtr.get() != retvalOrig) { - *retval = CefV8ValueCppToC::Wrap(retvalPtr); - } - } else { - *retval = NULL; - } - } - // Restore param: exception; type: refptr_same_byref - if (exception) { - if (exceptionPtr.get()) { - if (exceptionPtr.get() != exceptionOrig) { - *exception = CefV8ExceptionCppToC::Wrap(exceptionPtr); - } - } else { - *exception = NULL; - } - } - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefV8ContextCppToC::CefV8ContextCppToC(CefV8Context* cls) - : CefCppToC(cls) { - struct_.struct_.is_valid = v8context_is_valid; - struct_.struct_.get_browser = v8context_get_browser; - struct_.struct_.get_frame = v8context_get_frame; - struct_.struct_.get_global = v8context_get_global; - struct_.struct_.enter = v8context_enter; - struct_.struct_.exit = v8context_exit; - struct_.struct_.is_same = v8context_is_same; - struct_.struct_.eval = v8context_eval; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/v8context_cpptoc.h b/cef1/libcef_dll/cpptoc/v8context_cpptoc.h deleted file mode 100644 index 8f830a7d3..000000000 --- a/cef1/libcef_dll/cpptoc/v8context_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_V8CONTEXT_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_V8CONTEXT_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefV8ContextCppToC - : public CefCppToC { - public: - explicit CefV8ContextCppToC(CefV8Context* cls); - virtual ~CefV8ContextCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_V8CONTEXT_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/v8context_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/v8context_handler_cpptoc.cc deleted file mode 100644 index 85d9dcdc1..000000000 --- a/cef1/libcef_dll/cpptoc/v8context_handler_cpptoc.cc +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/v8context_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/frame_ctocpp.h" -#include "libcef_dll/ctocpp/v8context_ctocpp.h" -#include "libcef_dll/ctocpp/v8exception_ctocpp.h" -#include "libcef_dll/ctocpp/v8stack_trace_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK v8context_handler_on_context_created( - struct _cef_v8context_handler_t* self, cef_browser_t* browser, - cef_frame_t* frame, cef_v8context_t* context) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return; - // Verify param: context; type: refptr_diff - DCHECK(context); - if (!context) - return; - - // Execute - CefV8ContextHandlerCppToC::Get(self)->OnContextCreated( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - CefV8ContextCToCpp::Wrap(context)); -} - -void CEF_CALLBACK v8context_handler_on_context_released( - struct _cef_v8context_handler_t* self, cef_browser_t* browser, - cef_frame_t* frame, cef_v8context_t* context) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return; - // Verify param: context; type: refptr_diff - DCHECK(context); - if (!context) - return; - - // Execute - CefV8ContextHandlerCppToC::Get(self)->OnContextReleased( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - CefV8ContextCToCpp::Wrap(context)); -} - -void CEF_CALLBACK v8context_handler_on_uncaught_exception( - struct _cef_v8context_handler_t* self, cef_browser_t* browser, - cef_frame_t* frame, cef_v8context_t* context, cef_v8exception_t* exception, - cef_v8stack_trace_t* stackTrace) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame); - if (!frame) - return; - // Verify param: context; type: refptr_diff - DCHECK(context); - if (!context) - return; - // Verify param: exception; type: refptr_diff - DCHECK(exception); - if (!exception) - return; - // Verify param: stackTrace; type: refptr_diff - DCHECK(stackTrace); - if (!stackTrace) - return; - - // Execute - CefV8ContextHandlerCppToC::Get(self)->OnUncaughtException( - CefBrowserCToCpp::Wrap(browser), - CefFrameCToCpp::Wrap(frame), - CefV8ContextCToCpp::Wrap(context), - CefV8ExceptionCToCpp::Wrap(exception), - CefV8StackTraceCToCpp::Wrap(stackTrace)); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefV8ContextHandlerCppToC::CefV8ContextHandlerCppToC(CefV8ContextHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_context_created = v8context_handler_on_context_created; - struct_.struct_.on_context_released = v8context_handler_on_context_released; - struct_.struct_.on_uncaught_exception = - v8context_handler_on_uncaught_exception; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/v8context_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/v8context_handler_cpptoc.h deleted file mode 100644 index 4b2b17770..000000000 --- a/cef1/libcef_dll/cpptoc/v8context_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_V8CONTEXT_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_V8CONTEXT_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_v8context_handler.h" -#include "include/capi/cef_v8context_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefV8ContextHandlerCppToC - : public CefCppToC { - public: - explicit CefV8ContextHandlerCppToC(CefV8ContextHandler* cls); - virtual ~CefV8ContextHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_V8CONTEXT_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/v8exception_cpptoc.cc b/cef1/libcef_dll/cpptoc/v8exception_cpptoc.cc deleted file mode 100644 index 291273444..000000000 --- a/cef1/libcef_dll/cpptoc/v8exception_cpptoc.cc +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/v8exception_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -cef_string_userfree_t CEF_CALLBACK v8exception_get_message( - struct _cef_v8exception_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefV8ExceptionCppToC::Get(self)->GetMessage(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK v8exception_get_source_line( - struct _cef_v8exception_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefV8ExceptionCppToC::Get(self)->GetSourceLine(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK v8exception_get_script_resource_name( - struct _cef_v8exception_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefV8ExceptionCppToC::Get(self)->GetScriptResourceName(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -int CEF_CALLBACK v8exception_get_line_number(struct _cef_v8exception_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefV8ExceptionCppToC::Get(self)->GetLineNumber(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK v8exception_get_start_position( - struct _cef_v8exception_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefV8ExceptionCppToC::Get(self)->GetStartPosition(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK v8exception_get_end_position(struct _cef_v8exception_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefV8ExceptionCppToC::Get(self)->GetEndPosition(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK v8exception_get_start_column(struct _cef_v8exception_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefV8ExceptionCppToC::Get(self)->GetStartColumn(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK v8exception_get_end_column(struct _cef_v8exception_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefV8ExceptionCppToC::Get(self)->GetEndColumn(); - - // Return type: simple - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefV8ExceptionCppToC::CefV8ExceptionCppToC(CefV8Exception* cls) - : CefCppToC(cls) { - struct_.struct_.get_message = v8exception_get_message; - struct_.struct_.get_source_line = v8exception_get_source_line; - struct_.struct_.get_script_resource_name = - v8exception_get_script_resource_name; - struct_.struct_.get_line_number = v8exception_get_line_number; - struct_.struct_.get_start_position = v8exception_get_start_position; - struct_.struct_.get_end_position = v8exception_get_end_position; - struct_.struct_.get_start_column = v8exception_get_start_column; - struct_.struct_.get_end_column = v8exception_get_end_column; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/v8exception_cpptoc.h b/cef1/libcef_dll/cpptoc/v8exception_cpptoc.h deleted file mode 100644 index d5661e6ac..000000000 --- a/cef1/libcef_dll/cpptoc/v8exception_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_V8EXCEPTION_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_V8EXCEPTION_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefV8ExceptionCppToC - : public CefCppToC { - public: - explicit CefV8ExceptionCppToC(CefV8Exception* cls); - virtual ~CefV8ExceptionCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_V8EXCEPTION_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/v8handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/v8handler_cpptoc.cc deleted file mode 100644 index 49c7c28cc..000000000 --- a/cef1/libcef_dll/cpptoc/v8handler_cpptoc.cc +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/v8handler_cpptoc.h" -#include "libcef_dll/ctocpp/v8value_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK v8handler_execute(struct _cef_v8handler_t* self, - const cef_string_t* name, struct _cef_v8value_t* object, - size_t argumentsCount, struct _cef_v8value_t* const* arguments, - struct _cef_v8value_t** retval, cef_string_t* exception) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: name; type: string_byref_const - DCHECK(name); - if (!name) - return 0; - // Verify param: object; type: refptr_diff - DCHECK(object); - if (!object) - return 0; - // Verify param: arguments; type: refptr_vec_diff_byref_const - DCHECK(argumentsCount == 0 || arguments); - if (argumentsCount > 0 && !arguments) - return 0; - // Verify param: retval; type: refptr_diff_byref - DCHECK(retval); - if (!retval) - return 0; - // Verify param: exception; type: string_byref - DCHECK(exception); - if (!exception) - return 0; - - // Translate param: arguments; type: refptr_vec_diff_byref_const - std::vector > argumentsList; - if (argumentsCount > 0) { - for (size_t i = 0; i < argumentsCount; ++i) { - argumentsList.push_back(CefV8ValueCToCpp::Wrap(arguments[i])); - } - } - // Translate param: retval; type: refptr_diff_byref - CefRefPtr retvalPtr; - if (retval && *retval) - retvalPtr = CefV8ValueCToCpp::Wrap(*retval); - CefV8Value* retvalOrig = retvalPtr.get(); - // Translate param: exception; type: string_byref - CefString exceptionStr(exception); - - // Execute - bool _retval = CefV8HandlerCppToC::Get(self)->Execute( - CefString(name), - CefV8ValueCToCpp::Wrap(object), - argumentsList, - retvalPtr, - exceptionStr); - - // Restore param: retval; type: refptr_diff_byref - if (retval) { - if (retvalPtr.get()) { - if (retvalPtr.get() != retvalOrig) { - *retval = CefV8ValueCToCpp::Unwrap(retvalPtr); - } - } else { - *retval = NULL; - } - } - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefV8HandlerCppToC::CefV8HandlerCppToC(CefV8Handler* cls) - : CefCppToC(cls) { - struct_.struct_.execute = v8handler_execute; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/v8handler_cpptoc.h b/cef1/libcef_dll/cpptoc/v8handler_cpptoc.h deleted file mode 100644 index aab996c24..000000000 --- a/cef1/libcef_dll/cpptoc/v8handler_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_V8HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_V8HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefV8HandlerCppToC - : public CefCppToC { - public: - explicit CefV8HandlerCppToC(CefV8Handler* cls); - virtual ~CefV8HandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_V8HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/v8stack_frame_cpptoc.cc b/cef1/libcef_dll/cpptoc/v8stack_frame_cpptoc.cc deleted file mode 100644 index d855b8381..000000000 --- a/cef1/libcef_dll/cpptoc/v8stack_frame_cpptoc.cc +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/v8stack_frame_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK v8stack_frame_is_valid(struct _cef_v8stack_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8StackFrameCppToC::Get(self)->IsValid(); - - // Return type: bool - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK v8stack_frame_get_script_name( - struct _cef_v8stack_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefV8StackFrameCppToC::Get(self)->GetScriptName(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK v8stack_frame_get_script_name_or_source_url( - struct _cef_v8stack_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefV8StackFrameCppToC::Get( - self)->GetScriptNameOrSourceURL(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK v8stack_frame_get_function_name( - struct _cef_v8stack_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefV8StackFrameCppToC::Get(self)->GetFunctionName(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -int CEF_CALLBACK v8stack_frame_get_line_number( - struct _cef_v8stack_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefV8StackFrameCppToC::Get(self)->GetLineNumber(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK v8stack_frame_get_column(struct _cef_v8stack_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefV8StackFrameCppToC::Get(self)->GetColumn(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK v8stack_frame_is_eval(struct _cef_v8stack_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8StackFrameCppToC::Get(self)->IsEval(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8stack_frame_is_constructor( - struct _cef_v8stack_frame_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8StackFrameCppToC::Get(self)->IsConstructor(); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefV8StackFrameCppToC::CefV8StackFrameCppToC(CefV8StackFrame* cls) - : CefCppToC( - cls) { - struct_.struct_.is_valid = v8stack_frame_is_valid; - struct_.struct_.get_script_name = v8stack_frame_get_script_name; - struct_.struct_.get_script_name_or_source_url = - v8stack_frame_get_script_name_or_source_url; - struct_.struct_.get_function_name = v8stack_frame_get_function_name; - struct_.struct_.get_line_number = v8stack_frame_get_line_number; - struct_.struct_.get_column = v8stack_frame_get_column; - struct_.struct_.is_eval = v8stack_frame_is_eval; - struct_.struct_.is_constructor = v8stack_frame_is_constructor; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/v8stack_frame_cpptoc.h b/cef1/libcef_dll/cpptoc/v8stack_frame_cpptoc.h deleted file mode 100644 index 73158052b..000000000 --- a/cef1/libcef_dll/cpptoc/v8stack_frame_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_V8STACK_FRAME_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_V8STACK_FRAME_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefV8StackFrameCppToC - : public CefCppToC { - public: - explicit CefV8StackFrameCppToC(CefV8StackFrame* cls); - virtual ~CefV8StackFrameCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_V8STACK_FRAME_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/v8stack_trace_cpptoc.cc b/cef1/libcef_dll/cpptoc/v8stack_trace_cpptoc.cc deleted file mode 100644 index 4bc7815bf..000000000 --- a/cef1/libcef_dll/cpptoc/v8stack_trace_cpptoc.cc +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/v8stack_frame_cpptoc.h" -#include "libcef_dll/cpptoc/v8stack_trace_cpptoc.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_v8stack_trace_t* cef_v8stack_trace_get_current(int frame_limit) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefV8StackTrace::GetCurrent( - frame_limit); - - // Return type: refptr_same - return CefV8StackTraceCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK v8stack_trace_is_valid(struct _cef_v8stack_trace_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8StackTraceCppToC::Get(self)->IsValid(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8stack_trace_get_frame_count( - struct _cef_v8stack_trace_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefV8StackTraceCppToC::Get(self)->GetFrameCount(); - - // Return type: simple - return _retval; -} - -struct _cef_v8stack_frame_t* CEF_CALLBACK v8stack_trace_get_frame( - struct _cef_v8stack_trace_t* self, int index) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefV8StackTraceCppToC::Get( - self)->GetFrame( - index); - - // Return type: refptr_same - return CefV8StackFrameCppToC::Wrap(_retval); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefV8StackTraceCppToC::CefV8StackTraceCppToC(CefV8StackTrace* cls) - : CefCppToC( - cls) { - struct_.struct_.is_valid = v8stack_trace_is_valid; - struct_.struct_.get_frame_count = v8stack_trace_get_frame_count; - struct_.struct_.get_frame = v8stack_trace_get_frame; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/v8stack_trace_cpptoc.h b/cef1/libcef_dll/cpptoc/v8stack_trace_cpptoc.h deleted file mode 100644 index 4986e5e2e..000000000 --- a/cef1/libcef_dll/cpptoc/v8stack_trace_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_V8STACK_TRACE_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_V8STACK_TRACE_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefV8StackTraceCppToC - : public CefCppToC { - public: - explicit CefV8StackTraceCppToC(CefV8StackTrace* cls); - virtual ~CefV8StackTraceCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_V8STACK_TRACE_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/v8value_cpptoc.cc b/cef1/libcef_dll/cpptoc/v8value_cpptoc.cc deleted file mode 100644 index 71a7446d7..000000000 --- a/cef1/libcef_dll/cpptoc/v8value_cpptoc.cc +++ /dev/null @@ -1,973 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/v8context_cpptoc.h" -#include "libcef_dll/cpptoc/v8exception_cpptoc.h" -#include "libcef_dll/cpptoc/v8value_cpptoc.h" -#include "libcef_dll/ctocpp/base_ctocpp.h" -#include "libcef_dll/ctocpp/v8accessor_ctocpp.h" -#include "libcef_dll/ctocpp/v8handler_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_v8value_t* cef_v8value_create_undefined() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefV8Value::CreateUndefined(); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_v8value_t* cef_v8value_create_null() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefV8Value::CreateNull(); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_v8value_t* cef_v8value_create_bool(int value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefV8Value::CreateBool( - value?true:false); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_v8value_t* cef_v8value_create_int(int32 value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefV8Value::CreateInt( - value); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_v8value_t* cef_v8value_create_uint(uint32 value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefV8Value::CreateUInt( - value); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_v8value_t* cef_v8value_create_double(double value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefV8Value::CreateDouble( - value); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_v8value_t* cef_v8value_create_date(const cef_time_t* date) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: date; type: simple_byref_const - DCHECK(date); - if (!date) - return NULL; - - // Translate param: date; type: simple_byref_const - CefTime dateVal = date?*date:CefTime(); - - // Execute - CefRefPtr _retval = CefV8Value::CreateDate( - dateVal); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_v8value_t* cef_v8value_create_string(const cef_string_t* value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: value - - // Execute - CefRefPtr _retval = CefV8Value::CreateString( - CefString(value)); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_v8value_t* cef_v8value_create_object( - cef_v8accessor_t* accessor) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: accessor - - // Execute - CefRefPtr _retval = CefV8Value::CreateObject( - CefV8AccessorCToCpp::Wrap(accessor)); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_v8value_t* cef_v8value_create_array(int length) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefV8Value::CreateArray( - length); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -CEF_EXPORT cef_v8value_t* cef_v8value_create_function(const cef_string_t* name, - cef_v8handler_t* handler) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(name); - if (!name) - return NULL; - // Verify param: handler; type: refptr_diff - DCHECK(handler); - if (!handler) - return NULL; - - // Execute - CefRefPtr _retval = CefV8Value::CreateFunction( - CefString(name), - CefV8HandlerCToCpp::Wrap(handler)); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK v8value_is_valid(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsValid(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_is_undefined(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsUndefined(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_is_null(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsNull(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_is_bool(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsBool(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_is_int(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsInt(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_is_uint(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsUInt(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_is_double(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsDouble(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_is_date(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsDate(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_is_string(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsString(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_is_object(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsObject(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_is_array(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsArray(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_is_function(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsFunction(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_is_same(struct _cef_v8value_t* self, - struct _cef_v8value_t* that) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: that; type: refptr_same - DCHECK(that); - if (!that) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsSame( - CefV8ValueCppToC::Unwrap(that)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_get_bool_value(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->GetBoolValue(); - - // Return type: bool - return _retval; -} - -int32 CEF_CALLBACK v8value_get_int_value(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int32 _retval = CefV8ValueCppToC::Get(self)->GetIntValue(); - - // Return type: simple - return _retval; -} - -uint32 CEF_CALLBACK v8value_get_uint_value(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - uint32 _retval = CefV8ValueCppToC::Get(self)->GetUIntValue(); - - // Return type: simple - return _retval; -} - -double CEF_CALLBACK v8value_get_double_value(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - double _retval = CefV8ValueCppToC::Get(self)->GetDoubleValue(); - - // Return type: simple - return _retval; -} - -cef_time_t CEF_CALLBACK v8value_get_date_value(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return CefTime(); - - // Execute - cef_time_t _retval = CefV8ValueCppToC::Get(self)->GetDateValue(); - - // Return type: simple - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK v8value_get_string_value( - struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefV8ValueCppToC::Get(self)->GetStringValue(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -int CEF_CALLBACK v8value_is_user_created(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->IsUserCreated(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_has_exception(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->HasException(); - - // Return type: bool - return _retval; -} - -cef_v8exception_t* CEF_CALLBACK v8value_get_exception( - struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefV8ValueCppToC::Get(self)->GetException( - ); - - // Return type: refptr_same - return CefV8ExceptionCppToC::Wrap(_retval); -} - -int CEF_CALLBACK v8value_clear_exception(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->ClearException(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_will_rethrow_exceptions(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->WillRethrowExceptions(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_set_rethrow_exceptions(struct _cef_v8value_t* self, - int rethrow) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->SetRethrowExceptions( - rethrow?true:false); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_has_value_bykey(struct _cef_v8value_t* self, - const cef_string_t* key) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Unverified params: key - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->HasValue( - CefString(key)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_has_value_byindex(struct _cef_v8value_t* self, - int index) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: index; type: simple_byval - DCHECK_GE(index, 0); - if (index < 0) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->HasValue( - index); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_delete_value_bykey(struct _cef_v8value_t* self, - const cef_string_t* key) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Unverified params: key - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->DeleteValue( - CefString(key)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_delete_value_byindex(struct _cef_v8value_t* self, - int index) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: index; type: simple_byval - DCHECK_GE(index, 0); - if (index < 0) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->DeleteValue( - index); - - // Return type: bool - return _retval; -} - -struct _cef_v8value_t* CEF_CALLBACK v8value_get_value_bykey( - struct _cef_v8value_t* self, const cef_string_t* key) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Unverified params: key - - // Execute - CefRefPtr _retval = CefV8ValueCppToC::Get(self)->GetValue( - CefString(key)); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -struct _cef_v8value_t* CEF_CALLBACK v8value_get_value_byindex( - struct _cef_v8value_t* self, int index) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: index; type: simple_byval - DCHECK_GE(index, 0); - if (index < 0) - return NULL; - - // Execute - CefRefPtr _retval = CefV8ValueCppToC::Get(self)->GetValue( - index); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -int CEF_CALLBACK v8value_set_value_bykey(struct _cef_v8value_t* self, - const cef_string_t* key, struct _cef_v8value_t* value, - enum cef_v8_propertyattribute_t attribute) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: value; type: refptr_same - DCHECK(value); - if (!value) - return 0; - // Unverified params: key - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->SetValue( - CefString(key), - CefV8ValueCppToC::Unwrap(value), - attribute); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_set_value_byindex(struct _cef_v8value_t* self, - int index, struct _cef_v8value_t* value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: index; type: simple_byval - DCHECK_GE(index, 0); - if (index < 0) - return 0; - // Verify param: value; type: refptr_same - DCHECK(value); - if (!value) - return 0; - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->SetValue( - index, - CefV8ValueCppToC::Unwrap(value)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_set_value_byaccessor(struct _cef_v8value_t* self, - const cef_string_t* key, enum cef_v8_accesscontrol_t settings, - enum cef_v8_propertyattribute_t attribute) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Unverified params: key - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->SetValue( - CefString(key), - settings, - attribute); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_get_keys(struct _cef_v8value_t* self, - cef_string_list_t keys) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: keys; type: string_vec_byref - DCHECK(keys); - if (!keys) - return 0; - - // Translate param: keys; type: string_vec_byref - std::vector keysList; - transfer_string_list_contents(keys, keysList); - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->GetKeys( - keysList); - - // Restore param: keys; type: string_vec_byref - cef_string_list_clear(keys); - transfer_string_list_contents(keysList, keys); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK v8value_set_user_data(struct _cef_v8value_t* self, - cef_base_t* user_data) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Unverified params: user_data - - // Execute - bool _retval = CefV8ValueCppToC::Get(self)->SetUserData( - CefBaseCToCpp::Wrap(user_data)); - - // Return type: bool - return _retval; -} - -cef_base_t* CEF_CALLBACK v8value_get_user_data(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefV8ValueCppToC::Get(self)->GetUserData(); - - // Return type: refptr_diff - return CefBaseCToCpp::Unwrap(_retval); -} - -int CEF_CALLBACK v8value_get_externally_allocated_memory( - struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefV8ValueCppToC::Get(self)->GetExternallyAllocatedMemory(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK v8value_adjust_externally_allocated_memory( - struct _cef_v8value_t* self, int change_in_bytes) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefV8ValueCppToC::Get(self)->AdjustExternallyAllocatedMemory( - change_in_bytes); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK v8value_get_array_length(struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefV8ValueCppToC::Get(self)->GetArrayLength(); - - // Return type: simple - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK v8value_get_function_name( - struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefV8ValueCppToC::Get(self)->GetFunctionName(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_v8handler_t* CEF_CALLBACK v8value_get_function_handler( - struct _cef_v8value_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefRefPtr _retval = CefV8ValueCppToC::Get( - self)->GetFunctionHandler(); - - // Return type: refptr_diff - return CefV8HandlerCToCpp::Unwrap(_retval); -} - -struct _cef_v8value_t* CEF_CALLBACK v8value_execute_function( - struct _cef_v8value_t* self, struct _cef_v8value_t* object, - size_t argumentsCount, struct _cef_v8value_t* const* arguments) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: arguments; type: refptr_vec_same_byref_const - DCHECK(argumentsCount == 0 || arguments); - if (argumentsCount > 0 && !arguments) - return NULL; - // Unverified params: object - - // Translate param: arguments; type: refptr_vec_same_byref_const - std::vector > argumentsList; - if (argumentsCount > 0) { - for (size_t i = 0; i < argumentsCount; ++i) { - argumentsList.push_back(CefV8ValueCppToC::Unwrap(arguments[i])); - } - } - - // Execute - CefRefPtr _retval = CefV8ValueCppToC::Get(self)->ExecuteFunction( - CefV8ValueCppToC::Unwrap(object), - argumentsList); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - -struct _cef_v8value_t* CEF_CALLBACK v8value_execute_function_with_context( - struct _cef_v8value_t* self, cef_v8context_t* context, - struct _cef_v8value_t* object, size_t argumentsCount, - struct _cef_v8value_t* const* arguments) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: context; type: refptr_same - DCHECK(context); - if (!context) - return NULL; - // Verify param: arguments; type: refptr_vec_same_byref_const - DCHECK(argumentsCount == 0 || arguments); - if (argumentsCount > 0 && !arguments) - return NULL; - // Unverified params: object - - // Translate param: arguments; type: refptr_vec_same_byref_const - std::vector > argumentsList; - if (argumentsCount > 0) { - for (size_t i = 0; i < argumentsCount; ++i) { - argumentsList.push_back(CefV8ValueCppToC::Unwrap(arguments[i])); - } - } - - // Execute - CefRefPtr _retval = CefV8ValueCppToC::Get( - self)->ExecuteFunctionWithContext( - CefV8ContextCppToC::Unwrap(context), - CefV8ValueCppToC::Unwrap(object), - argumentsList); - - // Return type: refptr_same - return CefV8ValueCppToC::Wrap(_retval); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefV8ValueCppToC::CefV8ValueCppToC(CefV8Value* cls) - : CefCppToC(cls) { - struct_.struct_.is_valid = v8value_is_valid; - struct_.struct_.is_undefined = v8value_is_undefined; - struct_.struct_.is_null = v8value_is_null; - struct_.struct_.is_bool = v8value_is_bool; - struct_.struct_.is_int = v8value_is_int; - struct_.struct_.is_uint = v8value_is_uint; - struct_.struct_.is_double = v8value_is_double; - struct_.struct_.is_date = v8value_is_date; - struct_.struct_.is_string = v8value_is_string; - struct_.struct_.is_object = v8value_is_object; - struct_.struct_.is_array = v8value_is_array; - struct_.struct_.is_function = v8value_is_function; - struct_.struct_.is_same = v8value_is_same; - struct_.struct_.get_bool_value = v8value_get_bool_value; - struct_.struct_.get_int_value = v8value_get_int_value; - struct_.struct_.get_uint_value = v8value_get_uint_value; - struct_.struct_.get_double_value = v8value_get_double_value; - struct_.struct_.get_date_value = v8value_get_date_value; - struct_.struct_.get_string_value = v8value_get_string_value; - struct_.struct_.is_user_created = v8value_is_user_created; - struct_.struct_.has_exception = v8value_has_exception; - struct_.struct_.get_exception = v8value_get_exception; - struct_.struct_.clear_exception = v8value_clear_exception; - struct_.struct_.will_rethrow_exceptions = v8value_will_rethrow_exceptions; - struct_.struct_.set_rethrow_exceptions = v8value_set_rethrow_exceptions; - struct_.struct_.has_value_bykey = v8value_has_value_bykey; - struct_.struct_.has_value_byindex = v8value_has_value_byindex; - struct_.struct_.delete_value_bykey = v8value_delete_value_bykey; - struct_.struct_.delete_value_byindex = v8value_delete_value_byindex; - struct_.struct_.get_value_bykey = v8value_get_value_bykey; - struct_.struct_.get_value_byindex = v8value_get_value_byindex; - struct_.struct_.set_value_bykey = v8value_set_value_bykey; - struct_.struct_.set_value_byindex = v8value_set_value_byindex; - struct_.struct_.set_value_byaccessor = v8value_set_value_byaccessor; - struct_.struct_.get_keys = v8value_get_keys; - struct_.struct_.set_user_data = v8value_set_user_data; - struct_.struct_.get_user_data = v8value_get_user_data; - struct_.struct_.get_externally_allocated_memory = - v8value_get_externally_allocated_memory; - struct_.struct_.adjust_externally_allocated_memory = - v8value_adjust_externally_allocated_memory; - struct_.struct_.get_array_length = v8value_get_array_length; - struct_.struct_.get_function_name = v8value_get_function_name; - struct_.struct_.get_function_handler = v8value_get_function_handler; - struct_.struct_.execute_function = v8value_execute_function; - struct_.struct_.execute_function_with_context = - v8value_execute_function_with_context; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/v8value_cpptoc.h b/cef1/libcef_dll/cpptoc/v8value_cpptoc.h deleted file mode 100644 index 28eae4af6..000000000 --- a/cef1/libcef_dll/cpptoc/v8value_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_V8VALUE_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_V8VALUE_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefV8ValueCppToC - : public CefCppToC { - public: - explicit CefV8ValueCppToC(CefV8Value* cls); - virtual ~CefV8ValueCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_V8VALUE_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/web_plugin_info_cpptoc.cc b/cef1/libcef_dll/cpptoc/web_plugin_info_cpptoc.cc deleted file mode 100644 index f3c92dddc..000000000 --- a/cef1/libcef_dll/cpptoc/web_plugin_info_cpptoc.cc +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/web_plugin_info_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -cef_string_userfree_t CEF_CALLBACK web_plugin_info_get_name( - struct _cef_web_plugin_info_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefWebPluginInfoCppToC::Get(self)->GetName(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK web_plugin_info_get_path( - struct _cef_web_plugin_info_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefWebPluginInfoCppToC::Get(self)->GetPath(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK web_plugin_info_get_version( - struct _cef_web_plugin_info_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefWebPluginInfoCppToC::Get(self)->GetVersion(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK web_plugin_info_get_description( - struct _cef_web_plugin_info_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefWebPluginInfoCppToC::Get(self)->GetDescription(); - - // Return type: string - return _retval.DetachToUserFree(); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefWebPluginInfoCppToC::CefWebPluginInfoCppToC(CefWebPluginInfo* cls) - : CefCppToC(cls) { - struct_.struct_.get_name = web_plugin_info_get_name; - struct_.struct_.get_path = web_plugin_info_get_path; - struct_.struct_.get_version = web_plugin_info_get_version; - struct_.struct_.get_description = web_plugin_info_get_description; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/web_plugin_info_cpptoc.h b/cef1/libcef_dll/cpptoc/web_plugin_info_cpptoc.h deleted file mode 100644 index 34aa700df..000000000 --- a/cef1/libcef_dll/cpptoc/web_plugin_info_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_WEB_PLUGIN_INFO_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_WEB_PLUGIN_INFO_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_web_plugin.h" -#include "include/capi/cef_web_plugin_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefWebPluginInfoCppToC - : public CefCppToC { - public: - explicit CefWebPluginInfoCppToC(CefWebPluginInfo* cls); - virtual ~CefWebPluginInfoCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_WEB_PLUGIN_INFO_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/web_urlrequest_client_cpptoc.cc b/cef1/libcef_dll/cpptoc/web_urlrequest_client_cpptoc.cc deleted file mode 100644 index 805241c11..000000000 --- a/cef1/libcef_dll/cpptoc/web_urlrequest_client_cpptoc.cc +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/web_urlrequest_client_cpptoc.h" -#include "libcef_dll/ctocpp/request_ctocpp.h" -#include "libcef_dll/ctocpp/response_ctocpp.h" -#include "libcef_dll/ctocpp/web_urlrequest_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK web_urlrequest_client_on_state_change( - struct _cef_web_urlrequest_client_t* self, cef_web_urlrequest_t* requester, - enum cef_weburlrequest_state_t state) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: requester; type: refptr_diff - DCHECK(requester); - if (!requester) - return; - - // Execute - CefWebURLRequestClientCppToC::Get(self)->OnStateChange( - CefWebURLRequestCToCpp::Wrap(requester), - state); -} - -void CEF_CALLBACK web_urlrequest_client_on_redirect( - struct _cef_web_urlrequest_client_t* self, cef_web_urlrequest_t* requester, - cef_request_t* request, cef_response_t* response) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: requester; type: refptr_diff - DCHECK(requester); - if (!requester) - return; - // Verify param: request; type: refptr_diff - DCHECK(request); - if (!request) - return; - // Verify param: response; type: refptr_diff - DCHECK(response); - if (!response) - return; - - // Execute - CefWebURLRequestClientCppToC::Get(self)->OnRedirect( - CefWebURLRequestCToCpp::Wrap(requester), - CefRequestCToCpp::Wrap(request), - CefResponseCToCpp::Wrap(response)); -} - -void CEF_CALLBACK web_urlrequest_client_on_headers_received( - struct _cef_web_urlrequest_client_t* self, cef_web_urlrequest_t* requester, - cef_response_t* response) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: requester; type: refptr_diff - DCHECK(requester); - if (!requester) - return; - // Verify param: response; type: refptr_diff - DCHECK(response); - if (!response) - return; - - // Execute - CefWebURLRequestClientCppToC::Get(self)->OnHeadersReceived( - CefWebURLRequestCToCpp::Wrap(requester), - CefResponseCToCpp::Wrap(response)); -} - -void CEF_CALLBACK web_urlrequest_client_on_progress( - struct _cef_web_urlrequest_client_t* self, cef_web_urlrequest_t* requester, - uint64 bytesSent, uint64 totalBytesToBeSent) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: requester; type: refptr_diff - DCHECK(requester); - if (!requester) - return; - - // Execute - CefWebURLRequestClientCppToC::Get(self)->OnProgress( - CefWebURLRequestCToCpp::Wrap(requester), - bytesSent, - totalBytesToBeSent); -} - -void CEF_CALLBACK web_urlrequest_client_on_data( - struct _cef_web_urlrequest_client_t* self, cef_web_urlrequest_t* requester, - const void* data, int dataLength) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: requester; type: refptr_diff - DCHECK(requester); - if (!requester) - return; - // Verify param: data; type: simple_byaddr - DCHECK(data); - if (!data) - return; - - // Execute - CefWebURLRequestClientCppToC::Get(self)->OnData( - CefWebURLRequestCToCpp::Wrap(requester), - data, - dataLength); -} - -void CEF_CALLBACK web_urlrequest_client_on_error( - struct _cef_web_urlrequest_client_t* self, cef_web_urlrequest_t* requester, - enum cef_handler_errorcode_t errorCode) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - // Verify param: requester; type: refptr_diff - DCHECK(requester); - if (!requester) - return; - - // Execute - CefWebURLRequestClientCppToC::Get(self)->OnError( - CefWebURLRequestCToCpp::Wrap(requester), - errorCode); -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefWebURLRequestClientCppToC::CefWebURLRequestClientCppToC( - CefWebURLRequestClient* cls) - : CefCppToC(cls) { - struct_.struct_.on_state_change = web_urlrequest_client_on_state_change; - struct_.struct_.on_redirect = web_urlrequest_client_on_redirect; - struct_.struct_.on_headers_received = - web_urlrequest_client_on_headers_received; - struct_.struct_.on_progress = web_urlrequest_client_on_progress; - struct_.struct_.on_data = web_urlrequest_client_on_data; - struct_.struct_.on_error = web_urlrequest_client_on_error; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/web_urlrequest_client_cpptoc.h b/cef1/libcef_dll/cpptoc/web_urlrequest_client_cpptoc.h deleted file mode 100644 index 678760974..000000000 --- a/cef1/libcef_dll/cpptoc/web_urlrequest_client_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_WEB_URLREQUEST_CLIENT_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_WEB_URLREQUEST_CLIENT_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_web_urlrequest.h" -#include "include/capi/cef_web_urlrequest_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefWebURLRequestClientCppToC - : public CefCppToC { - public: - explicit CefWebURLRequestClientCppToC(CefWebURLRequestClient* cls); - virtual ~CefWebURLRequestClientCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_WEB_URLREQUEST_CLIENT_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/web_urlrequest_cpptoc.cc b/cef1/libcef_dll/cpptoc/web_urlrequest_cpptoc.cc deleted file mode 100644 index 47dfe3612..000000000 --- a/cef1/libcef_dll/cpptoc/web_urlrequest_cpptoc.cc +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/request_cpptoc.h" -#include "libcef_dll/cpptoc/web_urlrequest_cpptoc.h" -#include "libcef_dll/ctocpp/web_urlrequest_client_ctocpp.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_web_urlrequest_t* cef_web_urlrequest_create( - cef_request_t* request, struct _cef_web_urlrequest_client_t* client) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: request; type: refptr_same - DCHECK(request); - if (!request) - return NULL; - // Verify param: client; type: refptr_diff - DCHECK(client); - if (!client) - return NULL; - - // Execute - CefRefPtr _retval = CefWebURLRequest::CreateWebURLRequest( - CefRequestCppToC::Unwrap(request), - CefWebURLRequestClientCToCpp::Wrap(client)); - - // Return type: refptr_same - return CefWebURLRequestCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -void CEF_CALLBACK web_urlrequest_cancel(struct _cef_web_urlrequest_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return; - - // Execute - CefWebURLRequestCppToC::Get(self)->Cancel(); -} - -enum cef_weburlrequest_state_t CEF_CALLBACK web_urlrequest_get_state( - struct _cef_web_urlrequest_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return WUR_STATE_UNSENT; - - // Execute - cef_weburlrequest_state_t _retval = CefWebURLRequestCppToC::Get( - self)->GetState(); - - // Return type: simple - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefWebURLRequestCppToC::CefWebURLRequestCppToC(CefWebURLRequest* cls) - : CefCppToC( - cls) { - struct_.struct_.cancel = web_urlrequest_cancel; - struct_.struct_.get_state = web_urlrequest_get_state; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/web_urlrequest_cpptoc.h b/cef1/libcef_dll/cpptoc/web_urlrequest_cpptoc.h deleted file mode 100644 index e1fdb9054..000000000 --- a/cef1/libcef_dll/cpptoc/web_urlrequest_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_WEB_URLREQUEST_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_WEB_URLREQUEST_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_web_urlrequest.h" -#include "include/capi/cef_web_urlrequest_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefWebURLRequestCppToC - : public CefCppToC { - public: - explicit CefWebURLRequestCppToC(CefWebURLRequest* cls); - virtual ~CefWebURLRequestCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_WEB_URLREQUEST_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/write_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/write_handler_cpptoc.cc deleted file mode 100644 index 001928442..000000000 --- a/cef1/libcef_dll/cpptoc/write_handler_cpptoc.cc +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/write_handler_cpptoc.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -size_t CEF_CALLBACK write_handler_write(struct _cef_write_handler_t* self, - const void* ptr, size_t size, size_t n) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: ptr; type: simple_byaddr - DCHECK(ptr); - if (!ptr) - return 0; - - // Execute - size_t _retval = CefWriteHandlerCppToC::Get(self)->Write( - ptr, - size, - n); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK write_handler_seek(struct _cef_write_handler_t* self, - int64 offset, int whence) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefWriteHandlerCppToC::Get(self)->Seek( - offset, - whence); - - // Return type: simple - return _retval; -} - -int64 CEF_CALLBACK write_handler_tell(struct _cef_write_handler_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int64 _retval = CefWriteHandlerCppToC::Get(self)->Tell(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK write_handler_flush(struct _cef_write_handler_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefWriteHandlerCppToC::Get(self)->Flush(); - - // Return type: simple - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefWriteHandlerCppToC::CefWriteHandlerCppToC(CefWriteHandler* cls) - : CefCppToC( - cls) { - struct_.struct_.write = write_handler_write; - struct_.struct_.seek = write_handler_seek; - struct_.struct_.tell = write_handler_tell; - struct_.struct_.flush = write_handler_flush; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/write_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/write_handler_cpptoc.h deleted file mode 100644 index eda6ea830..000000000 --- a/cef1/libcef_dll/cpptoc/write_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_WRITE_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_WRITE_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_stream.h" -#include "include/capi/cef_stream_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefWriteHandlerCppToC - : public CefCppToC { - public: - explicit CefWriteHandlerCppToC(CefWriteHandler* cls); - virtual ~CefWriteHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_WRITE_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/xml_reader_cpptoc.cc b/cef1/libcef_dll/cpptoc/xml_reader_cpptoc.cc deleted file mode 100644 index ec16f26c0..000000000 --- a/cef1/libcef_dll/cpptoc/xml_reader_cpptoc.cc +++ /dev/null @@ -1,558 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/stream_reader_cpptoc.h" -#include "libcef_dll/cpptoc/xml_reader_cpptoc.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_xml_reader_t* cef_xml_reader_create(cef_stream_reader_t* stream, - enum cef_xml_encoding_type_t encodingType, const cef_string_t* URI) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: stream; type: refptr_same - DCHECK(stream); - if (!stream) - return NULL; - // Verify param: URI; type: string_byref_const - DCHECK(URI); - if (!URI) - return NULL; - - // Execute - CefRefPtr _retval = CefXmlReader::Create( - CefStreamReaderCppToC::Unwrap(stream), - encodingType, - CefString(URI)); - - // Return type: refptr_same - return CefXmlReaderCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK xml_reader_move_to_next_node(struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefXmlReaderCppToC::Get(self)->MoveToNextNode(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK xml_reader_close(struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefXmlReaderCppToC::Get(self)->Close(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK xml_reader_has_error(struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefXmlReaderCppToC::Get(self)->HasError(); - - // Return type: bool - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_error( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetError(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -enum cef_xml_node_type_t CEF_CALLBACK xml_reader_get_type( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return XML_NODE_UNSUPPORTED; - - // Execute - cef_xml_node_type_t _retval = CefXmlReaderCppToC::Get(self)->GetType(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK xml_reader_get_depth(struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefXmlReaderCppToC::Get(self)->GetDepth(); - - // Return type: simple - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_local_name( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetLocalName(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_prefix( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetPrefix(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_qualified_name( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetQualifiedName(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_namespace_uri( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetNamespaceURI(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_base_uri( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetBaseURI(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_xml_lang( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetXmlLang(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -int CEF_CALLBACK xml_reader_is_empty_element(struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefXmlReaderCppToC::Get(self)->IsEmptyElement(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK xml_reader_has_value(struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefXmlReaderCppToC::Get(self)->HasValue(); - - // Return type: bool - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_value( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetValue(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -int CEF_CALLBACK xml_reader_has_attributes(struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefXmlReaderCppToC::Get(self)->HasAttributes(); - - // Return type: bool - return _retval; -} - -size_t CEF_CALLBACK xml_reader_get_attribute_count( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - size_t _retval = CefXmlReaderCppToC::Get(self)->GetAttributeCount(); - - // Return type: simple - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_attribute_byindex( - struct _cef_xml_reader_t* self, int index) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: index; type: simple_byval - DCHECK_GE(index, 0); - if (index < 0) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetAttribute( - index); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_attribute_byqname( - struct _cef_xml_reader_t* self, const cef_string_t* qualifiedName) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: qualifiedName; type: string_byref_const - DCHECK(qualifiedName); - if (!qualifiedName) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetAttribute( - CefString(qualifiedName)); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_attribute_bylname( - struct _cef_xml_reader_t* self, const cef_string_t* localName, - const cef_string_t* namespaceURI) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - // Verify param: localName; type: string_byref_const - DCHECK(localName); - if (!localName) - return NULL; - // Verify param: namespaceURI; type: string_byref_const - DCHECK(namespaceURI); - if (!namespaceURI) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetAttribute( - CefString(localName), - CefString(namespaceURI)); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_inner_xml( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetInnerXml(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -cef_string_userfree_t CEF_CALLBACK xml_reader_get_outer_xml( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefXmlReaderCppToC::Get(self)->GetOuterXml(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -int CEF_CALLBACK xml_reader_get_line_number(struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int _retval = CefXmlReaderCppToC::Get(self)->GetLineNumber(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK xml_reader_move_to_attribute_byindex( - struct _cef_xml_reader_t* self, int index) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: index; type: simple_byval - DCHECK_GE(index, 0); - if (index < 0) - return 0; - - // Execute - bool _retval = CefXmlReaderCppToC::Get(self)->MoveToAttribute( - index); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK xml_reader_move_to_attribute_byqname( - struct _cef_xml_reader_t* self, const cef_string_t* qualifiedName) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: qualifiedName; type: string_byref_const - DCHECK(qualifiedName); - if (!qualifiedName) - return 0; - - // Execute - bool _retval = CefXmlReaderCppToC::Get(self)->MoveToAttribute( - CefString(qualifiedName)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK xml_reader_move_to_attribute_bylname( - struct _cef_xml_reader_t* self, const cef_string_t* localName, - const cef_string_t* namespaceURI) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: localName; type: string_byref_const - DCHECK(localName); - if (!localName) - return 0; - // Verify param: namespaceURI; type: string_byref_const - DCHECK(namespaceURI); - if (!namespaceURI) - return 0; - - // Execute - bool _retval = CefXmlReaderCppToC::Get(self)->MoveToAttribute( - CefString(localName), - CefString(namespaceURI)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK xml_reader_move_to_first_attribute( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefXmlReaderCppToC::Get(self)->MoveToFirstAttribute(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK xml_reader_move_to_next_attribute( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefXmlReaderCppToC::Get(self)->MoveToNextAttribute(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK xml_reader_move_to_carrying_element( - struct _cef_xml_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefXmlReaderCppToC::Get(self)->MoveToCarryingElement(); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefXmlReaderCppToC::CefXmlReaderCppToC(CefXmlReader* cls) - : CefCppToC(cls) { - struct_.struct_.move_to_next_node = xml_reader_move_to_next_node; - struct_.struct_.close = xml_reader_close; - struct_.struct_.has_error = xml_reader_has_error; - struct_.struct_.get_error = xml_reader_get_error; - struct_.struct_.get_type = xml_reader_get_type; - struct_.struct_.get_depth = xml_reader_get_depth; - struct_.struct_.get_local_name = xml_reader_get_local_name; - struct_.struct_.get_prefix = xml_reader_get_prefix; - struct_.struct_.get_qualified_name = xml_reader_get_qualified_name; - struct_.struct_.get_namespace_uri = xml_reader_get_namespace_uri; - struct_.struct_.get_base_uri = xml_reader_get_base_uri; - struct_.struct_.get_xml_lang = xml_reader_get_xml_lang; - struct_.struct_.is_empty_element = xml_reader_is_empty_element; - struct_.struct_.has_value = xml_reader_has_value; - struct_.struct_.get_value = xml_reader_get_value; - struct_.struct_.has_attributes = xml_reader_has_attributes; - struct_.struct_.get_attribute_count = xml_reader_get_attribute_count; - struct_.struct_.get_attribute_byindex = xml_reader_get_attribute_byindex; - struct_.struct_.get_attribute_byqname = xml_reader_get_attribute_byqname; - struct_.struct_.get_attribute_bylname = xml_reader_get_attribute_bylname; - struct_.struct_.get_inner_xml = xml_reader_get_inner_xml; - struct_.struct_.get_outer_xml = xml_reader_get_outer_xml; - struct_.struct_.get_line_number = xml_reader_get_line_number; - struct_.struct_.move_to_attribute_byindex = - xml_reader_move_to_attribute_byindex; - struct_.struct_.move_to_attribute_byqname = - xml_reader_move_to_attribute_byqname; - struct_.struct_.move_to_attribute_bylname = - xml_reader_move_to_attribute_bylname; - struct_.struct_.move_to_first_attribute = xml_reader_move_to_first_attribute; - struct_.struct_.move_to_next_attribute = xml_reader_move_to_next_attribute; - struct_.struct_.move_to_carrying_element = - xml_reader_move_to_carrying_element; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/xml_reader_cpptoc.h b/cef1/libcef_dll/cpptoc/xml_reader_cpptoc.h deleted file mode 100644 index ed0b188c0..000000000 --- a/cef1/libcef_dll/cpptoc/xml_reader_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_XML_READER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_XML_READER_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_xml_reader.h" -#include "include/capi/cef_xml_reader_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefXmlReaderCppToC - : public CefCppToC { - public: - explicit CefXmlReaderCppToC(CefXmlReader* cls); - virtual ~CefXmlReaderCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_XML_READER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/zip_reader_cpptoc.cc b/cef1/libcef_dll/cpptoc/zip_reader_cpptoc.cc deleted file mode 100644 index d6e372acc..000000000 --- a/cef1/libcef_dll/cpptoc/zip_reader_cpptoc.cc +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/stream_reader_cpptoc.h" -#include "libcef_dll/cpptoc/zip_reader_cpptoc.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT cef_zip_reader_t* cef_zip_reader_create( - cef_stream_reader_t* stream) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: stream; type: refptr_same - DCHECK(stream); - if (!stream) - return NULL; - - // Execute - CefRefPtr _retval = CefZipReader::Create( - CefStreamReaderCppToC::Unwrap(stream)); - - // Return type: refptr_same - return CefZipReaderCppToC::Wrap(_retval); -} - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK zip_reader_move_to_first_file(struct _cef_zip_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefZipReaderCppToC::Get(self)->MoveToFirstFile(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK zip_reader_move_to_next_file(struct _cef_zip_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefZipReaderCppToC::Get(self)->MoveToNextFile(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK zip_reader_move_to_file(struct _cef_zip_reader_t* self, - const cef_string_t* fileName, int caseSensitive) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: fileName; type: string_byref_const - DCHECK(fileName); - if (!fileName) - return 0; - - // Execute - bool _retval = CefZipReaderCppToC::Get(self)->MoveToFile( - CefString(fileName), - caseSensitive?true:false); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK zip_reader_close(struct _cef_zip_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefZipReaderCppToC::Get(self)->Close(); - - // Return type: bool - return _retval; -} - -cef_string_userfree_t CEF_CALLBACK zip_reader_get_file_name( - struct _cef_zip_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return NULL; - - // Execute - CefString _retval = CefZipReaderCppToC::Get(self)->GetFileName(); - - // Return type: string - return _retval.DetachToUserFree(); -} - -int64 CEF_CALLBACK zip_reader_get_file_size(struct _cef_zip_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int64 _retval = CefZipReaderCppToC::Get(self)->GetFileSize(); - - // Return type: simple - return _retval; -} - -time_t CEF_CALLBACK zip_reader_get_file_last_modified( - struct _cef_zip_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - time_t _retval = CefZipReaderCppToC::Get(self)->GetFileLastModified(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK zip_reader_open_file(struct _cef_zip_reader_t* self, - const cef_string_t* password) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Unverified params: password - - // Execute - bool _retval = CefZipReaderCppToC::Get(self)->OpenFile( - CefString(password)); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK zip_reader_close_file(struct _cef_zip_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefZipReaderCppToC::Get(self)->CloseFile(); - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK zip_reader_read_file(struct _cef_zip_reader_t* self, - void* buffer, size_t bufferSize) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: buffer; type: simple_byaddr - DCHECK(buffer); - if (!buffer) - return 0; - - // Execute - int _retval = CefZipReaderCppToC::Get(self)->ReadFile( - buffer, - bufferSize); - - // Return type: simple - return _retval; -} - -int64 CEF_CALLBACK zip_reader_tell(struct _cef_zip_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - int64 _retval = CefZipReaderCppToC::Get(self)->Tell(); - - // Return type: simple - return _retval; -} - -int CEF_CALLBACK zip_reader_eof(struct _cef_zip_reader_t* self) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - - // Execute - bool _retval = CefZipReaderCppToC::Get(self)->Eof(); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefZipReaderCppToC::CefZipReaderCppToC(CefZipReader* cls) - : CefCppToC(cls) { - struct_.struct_.move_to_first_file = zip_reader_move_to_first_file; - struct_.struct_.move_to_next_file = zip_reader_move_to_next_file; - struct_.struct_.move_to_file = zip_reader_move_to_file; - struct_.struct_.close = zip_reader_close; - struct_.struct_.get_file_name = zip_reader_get_file_name; - struct_.struct_.get_file_size = zip_reader_get_file_size; - struct_.struct_.get_file_last_modified = zip_reader_get_file_last_modified; - struct_.struct_.open_file = zip_reader_open_file; - struct_.struct_.close_file = zip_reader_close_file; - struct_.struct_.read_file = zip_reader_read_file; - struct_.struct_.tell = zip_reader_tell; - struct_.struct_.eof = zip_reader_eof; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/zip_reader_cpptoc.h b/cef1/libcef_dll/cpptoc/zip_reader_cpptoc.h deleted file mode 100644 index 58bdd7c71..000000000 --- a/cef1/libcef_dll/cpptoc/zip_reader_cpptoc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_ZIP_READER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_ZIP_READER_CPPTOC_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_zip_reader.h" -#include "include/capi/cef_zip_reader_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed DLL-side only. -class CefZipReaderCppToC - : public CefCppToC { - public: - explicit CefZipReaderCppToC(CefZipReader* cls); - virtual ~CefZipReaderCppToC() {} -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_ZIP_READER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/cpptoc/zoom_handler_cpptoc.cc b/cef1/libcef_dll/cpptoc/zoom_handler_cpptoc.cc deleted file mode 100644 index c0cfe6f22..000000000 --- a/cef1/libcef_dll/cpptoc/zoom_handler_cpptoc.cc +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/zoom_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" - - -// MEMBER FUNCTIONS - Body may be edited by hand. - -int CEF_CALLBACK zoom_handler_on_get_zoom_level( - struct _cef_zoom_handler_t* self, cef_browser_t* browser, - const cef_string_t* url, double* zoomLevel) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return 0; - // Verify param: zoomLevel; type: simple_byref - DCHECK(zoomLevel); - if (!zoomLevel) - return 0; - - // Translate param: zoomLevel; type: simple_byref - double zoomLevelVal = zoomLevel?*zoomLevel:0; - - // Execute - bool _retval = CefZoomHandlerCppToC::Get(self)->OnGetZoomLevel( - CefBrowserCToCpp::Wrap(browser), - CefString(url), - zoomLevelVal); - - // Restore param: zoomLevel; type: simple_byref - if (zoomLevel) - *zoomLevel = zoomLevelVal; - - // Return type: bool - return _retval; -} - -int CEF_CALLBACK zoom_handler_on_set_zoom_level( - struct _cef_zoom_handler_t* self, cef_browser_t* browser, - const cef_string_t* url, double zoomLevel) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - DCHECK(self); - if (!self) - return 0; - // Verify param: browser; type: refptr_diff - DCHECK(browser); - if (!browser) - return 0; - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return 0; - - // Execute - bool _retval = CefZoomHandlerCppToC::Get(self)->OnSetZoomLevel( - CefBrowserCToCpp::Wrap(browser), - CefString(url), - zoomLevel); - - // Return type: bool - return _retval; -} - - -// CONSTRUCTOR - Do not edit by hand. - -CefZoomHandlerCppToC::CefZoomHandlerCppToC(CefZoomHandler* cls) - : CefCppToC(cls) { - struct_.struct_.on_get_zoom_level = zoom_handler_on_get_zoom_level; - struct_.struct_.on_set_zoom_level = zoom_handler_on_set_zoom_level; -} - -#ifndef NDEBUG -template<> long CefCppToC::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/cpptoc/zoom_handler_cpptoc.h b/cef1/libcef_dll/cpptoc/zoom_handler_cpptoc.h deleted file mode 100644 index 85fe2ea30..000000000 --- a/cef1/libcef_dll/cpptoc/zoom_handler_cpptoc.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CPPTOC_ZOOM_HANDLER_CPPTOC_H_ -#define CEF_LIBCEF_DLL_CPPTOC_ZOOM_HANDLER_CPPTOC_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_zoom_handler.h" -#include "include/capi/cef_zoom_handler_capi.h" -#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -// This class may be instantiated and accessed wrapper-side only. -class CefZoomHandlerCppToC - : public CefCppToC { - public: - explicit CefZoomHandlerCppToC(CefZoomHandler* cls); - virtual ~CefZoomHandlerCppToC() {} -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CPPTOC_ZOOM_HANDLER_CPPTOC_H_ - diff --git a/cef1/libcef_dll/ctocpp/app_ctocpp.cc b/cef1/libcef_dll/ctocpp/app_ctocpp.cc deleted file mode 100644 index 730bcd1e6..000000000 --- a/cef1/libcef_dll/ctocpp/app_ctocpp.cc +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/scheme_registrar_cpptoc.h" -#include "libcef_dll/ctocpp/app_ctocpp.h" -#include "libcef_dll/ctocpp/proxy_handler_ctocpp.h" -#include "libcef_dll/ctocpp/resource_bundle_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefAppCToCpp::OnRegisterCustomSchemes( - CefRefPtr registrar) { - if (CEF_MEMBER_MISSING(struct_, on_register_custom_schemes)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: registrar; type: refptr_diff - DCHECK(registrar.get()); - if (!registrar.get()) - return; - - // Execute - struct_->on_register_custom_schemes(struct_, - CefSchemeRegistrarCppToC::Wrap(registrar)); -} - -CefRefPtr CefAppCToCpp::GetResourceBundleHandler() { - if (CEF_MEMBER_MISSING(struct_, get_resource_bundle_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_resource_bundle_handler_t* _retval = struct_->get_resource_bundle_handler( - struct_); - - // Return type: refptr_same - return CefResourceBundleHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefAppCToCpp::GetProxyHandler() { - if (CEF_MEMBER_MISSING(struct_, get_proxy_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_proxy_handler_t* _retval = struct_->get_proxy_handler(struct_); - - // Return type: refptr_same - return CefProxyHandlerCToCpp::Wrap(_retval); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/app_ctocpp.h b/cef1/libcef_dll/ctocpp/app_ctocpp.h deleted file mode 100644 index baf525320..000000000 --- a/cef1/libcef_dll/ctocpp/app_ctocpp.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_APP_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_APP_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_app.h" -#include "include/capi/cef_app_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefAppCToCpp - : public CefCToCpp { - public: - explicit CefAppCToCpp(cef_app_t* str) - : CefCToCpp(str) {} - virtual ~CefAppCToCpp() {} - - // CefApp methods - virtual void OnRegisterCustomSchemes( - CefRefPtr registrar) OVERRIDE; - virtual CefRefPtr GetResourceBundleHandler( - ) OVERRIDE; - virtual CefRefPtr GetProxyHandler() OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_APP_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/base_ctocpp.h b/cef1/libcef_dll/ctocpp/base_ctocpp.h deleted file mode 100644 index 650c08e33..000000000 --- a/cef1/libcef_dll/ctocpp/base_ctocpp.h +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_DLL_CTOCPP_BASE_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_BASE_CTOCPP_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/capi/cef_base_capi.h" -#include "libcef_dll/cef_logging.h" - - -// CefCToCpp implementation for CefBase. -class CefBaseCToCpp : public CefBase { - public: - // Use this method to create a wrapper class instance for a structure - // received from the other side. - static CefRefPtr Wrap(cef_base_t* s) { - if (!s) - return NULL; - - // Wrap their structure with the CefCToCpp object. - CefBaseCToCpp* wrapper = new CefBaseCToCpp(s); - // Put the wrapper object in a smart pointer. - CefRefPtr wrapperPtr(wrapper); - // Release the reference that was added to the CefCppToC wrapper object on - // the other side before their structure was passed to us. - wrapper->UnderlyingRelease(); - // Return the smart pointer. - return wrapperPtr; - } - - // Use this method to retrieve the underlying structure from a wrapper class - // instance for return back to the other side. - static cef_base_t* Unwrap(CefRefPtr c) { - if (!c.get()) - return NULL; - - // Cast the object to our wrapper class type. - CefBaseCToCpp* wrapper = static_cast(c.get()); - // Add a reference to the CefCppToC wrapper object on the other side that - // will be released once the structure is received. - wrapper->UnderlyingAddRef(); - // Return their original structure. - return wrapper->GetStruct(); - } - - explicit CefBaseCToCpp(cef_base_t* str) - : struct_(str) { - DCHECK(str); - } - virtual ~CefBaseCToCpp() {} - - // If returning the structure across the DLL boundary you should call - // UnderlyingAddRef() on this wrapping CefCToCpp object. On the other side of - // the DLL boundary, call Release() on the CefCppToC object. - cef_base_t* GetStruct() { return struct_; } - - // CefBase methods increment/decrement reference counts on both this object - // and the underlying wrapped structure. - int AddRef() { - UnderlyingAddRef(); - return refct_.AddRef(); - } - int Release() { - UnderlyingRelease(); - int retval = refct_.Release(); - if (retval == 0) - delete this; - return retval; - } - int GetRefCt() { return refct_.GetRefCt(); } - - // Increment/decrement reference counts on only the underlying class. - int UnderlyingAddRef() { - if (!struct_->add_ref) - return 0; - return struct_->add_ref(struct_); - } - int UnderlyingRelease() { - if (!struct_->release) - return 0; - return struct_->release(struct_); - } - int UnderlyingGetRefCt() { - if (!struct_->get_refct) - return 0; - return struct_->get_refct(struct_); - } - - protected: - CefRefCount refct_; - cef_base_t* struct_; -}; - - -#endif // CEF_LIBCEF_DLL_CTOCPP_BASE_CTOCPP_H_ diff --git a/cef1/libcef_dll/ctocpp/browser_ctocpp.cc b/cef1/libcef_dll/ctocpp/browser_ctocpp.cc deleted file mode 100644 index aefcac35c..000000000 --- a/cef1/libcef_dll/ctocpp/browser_ctocpp.cc +++ /dev/null @@ -1,591 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/client_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/frame_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// STATIC METHODS - Body may be edited by hand. - -bool CefBrowser::CreateBrowser(CefWindowInfo& windowInfo, - CefRefPtr client, const CefString& url, - const CefBrowserSettings& settings) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: client; type: refptr_diff - DCHECK(client.get()); - if (!client.get()) - return false; - // Unverified params: url - - // Execute - int _retval = cef_browser_create( - &windowInfo, - CefClientCppToC::Wrap(client), - url.GetStruct(), - &settings); - - // Return type: bool - return _retval?true:false; -} - -CefRefPtr CefBrowser::CreateBrowserSync(CefWindowInfo& windowInfo, - CefRefPtr client, const CefString& url, - const CefBrowserSettings& settings) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: client; type: refptr_diff - DCHECK(client.get()); - if (!client.get()) - return NULL; - // Unverified params: url - - // Execute - cef_browser_t* _retval = cef_browser_create_sync( - &windowInfo, - CefClientCppToC::Wrap(client), - url.GetStruct(), - &settings); - - // Return type: refptr_same - return CefBrowserCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefBrowserCToCpp::ParentWindowWillClose() { - if (CEF_MEMBER_MISSING(struct_, parent_window_will_close)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->parent_window_will_close(struct_); -} - -void CefBrowserCToCpp::CloseBrowser() { - if (CEF_MEMBER_MISSING(struct_, close_browser)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->close_browser(struct_); -} - -bool CefBrowserCToCpp::CanGoBack() { - if (CEF_MEMBER_MISSING(struct_, can_go_back)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->can_go_back(struct_); - - // Return type: bool - return _retval?true:false; -} - -void CefBrowserCToCpp::GoBack() { - if (CEF_MEMBER_MISSING(struct_, go_back)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->go_back(struct_); -} - -bool CefBrowserCToCpp::CanGoForward() { - if (CEF_MEMBER_MISSING(struct_, can_go_forward)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->can_go_forward(struct_); - - // Return type: bool - return _retval?true:false; -} - -void CefBrowserCToCpp::GoForward() { - if (CEF_MEMBER_MISSING(struct_, go_forward)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->go_forward(struct_); -} - -void CefBrowserCToCpp::Reload() { - if (CEF_MEMBER_MISSING(struct_, reload)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->reload(struct_); -} - -void CefBrowserCToCpp::ReloadIgnoreCache() { - if (CEF_MEMBER_MISSING(struct_, reload_ignore_cache)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->reload_ignore_cache(struct_); -} - -void CefBrowserCToCpp::StopLoad() { - if (CEF_MEMBER_MISSING(struct_, stop_load)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->stop_load(struct_); -} - -void CefBrowserCToCpp::SetFocus(bool enable) { - if (CEF_MEMBER_MISSING(struct_, set_focus)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->set_focus(struct_, - enable); -} - -CefWindowHandle CefBrowserCToCpp::GetWindowHandle() { - if (CEF_MEMBER_MISSING(struct_, get_window_handle)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_window_handle_t _retval = struct_->get_window_handle(struct_); - - // Return type: simple - return _retval; -} - -CefWindowHandle CefBrowserCToCpp::GetOpenerWindowHandle() { - if (CEF_MEMBER_MISSING(struct_, get_opener_window_handle)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_window_handle_t _retval = struct_->get_opener_window_handle(struct_); - - // Return type: simple - return _retval; -} - -int CefBrowserCToCpp::GetIdentifier() { - if (CEF_MEMBER_MISSING(struct_, get_identifier)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_identifier(struct_); - - // Return type: simple - return _retval; -} - -bool CefBrowserCToCpp::IsPopup() { - if (CEF_MEMBER_MISSING(struct_, is_popup)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_popup(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefBrowserCToCpp::HasDocument() { - if (CEF_MEMBER_MISSING(struct_, has_document)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->has_document(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefRefPtr CefBrowserCToCpp::GetClient() { - if (CEF_MEMBER_MISSING(struct_, get_client)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_client_t* _retval = struct_->get_client(struct_); - - // Return type: refptr_diff - return CefClientCppToC::Unwrap(_retval); -} - -CefRefPtr CefBrowserCToCpp::GetMainFrame() { - if (CEF_MEMBER_MISSING(struct_, get_main_frame)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_frame_t* _retval = struct_->get_main_frame(struct_); - - // Return type: refptr_same - return CefFrameCToCpp::Wrap(_retval); -} - -CefRefPtr CefBrowserCToCpp::GetFocusedFrame() { - if (CEF_MEMBER_MISSING(struct_, get_focused_frame)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_frame_t* _retval = struct_->get_focused_frame(struct_); - - // Return type: refptr_same - return CefFrameCToCpp::Wrap(_retval); -} - -CefRefPtr CefBrowserCToCpp::GetFrame(const CefString& name) { - if (CEF_MEMBER_MISSING(struct_, get_frame)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(!name.empty()); - if (name.empty()) - return NULL; - - // Execute - cef_frame_t* _retval = struct_->get_frame(struct_, - name.GetStruct()); - - // Return type: refptr_same - return CefFrameCToCpp::Wrap(_retval); -} - -void CefBrowserCToCpp::GetFrameNames(std::vector& names) { - if (CEF_MEMBER_MISSING(struct_, get_frame_names)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: names; type: string_vec_byref - cef_string_list_t namesList = cef_string_list_alloc(); - DCHECK(namesList); - if (namesList) - transfer_string_list_contents(names, namesList); - - // Execute - struct_->get_frame_names(struct_, - namesList); - - // Restore param:names; type: string_vec_byref - if (namesList) { - names.clear(); - transfer_string_list_contents(namesList, names); - cef_string_list_free(namesList); - } -} - -void CefBrowserCToCpp::Find(int identifier, const CefString& searchText, - bool forward, bool matchCase, bool findNext) { - if (CEF_MEMBER_MISSING(struct_, find)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: searchText; type: string_byref_const - DCHECK(!searchText.empty()); - if (searchText.empty()) - return; - - // Execute - struct_->find(struct_, - identifier, - searchText.GetStruct(), - forward, - matchCase, - findNext); -} - -void CefBrowserCToCpp::StopFinding(bool clearSelection) { - if (CEF_MEMBER_MISSING(struct_, stop_finding)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->stop_finding(struct_, - clearSelection); -} - -double CefBrowserCToCpp::GetZoomLevel() { - if (CEF_MEMBER_MISSING(struct_, get_zoom_level)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - double _retval = struct_->get_zoom_level(struct_); - - // Return type: simple - return _retval; -} - -void CefBrowserCToCpp::SetZoomLevel(double zoomLevel) { - if (CEF_MEMBER_MISSING(struct_, set_zoom_level)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->set_zoom_level(struct_, - zoomLevel); -} - -void CefBrowserCToCpp::ClearHistory() { - if (CEF_MEMBER_MISSING(struct_, clear_history)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->clear_history(struct_); -} - -void CefBrowserCToCpp::ShowDevTools() { - if (CEF_MEMBER_MISSING(struct_, show_dev_tools)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->show_dev_tools(struct_); -} - -void CefBrowserCToCpp::CloseDevTools() { - if (CEF_MEMBER_MISSING(struct_, close_dev_tools)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->close_dev_tools(struct_); -} - -bool CefBrowserCToCpp::IsWindowRenderingDisabled() { - if (CEF_MEMBER_MISSING(struct_, is_window_rendering_disabled)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_window_rendering_disabled(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefBrowserCToCpp::GetSize(PaintElementType type, int& width, int& height) { - if (CEF_MEMBER_MISSING(struct_, get_size)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_size(struct_, - type, - &width, - &height); - - // Return type: bool - return _retval?true:false; -} - -void CefBrowserCToCpp::SetSize(PaintElementType type, int width, int height) { - if (CEF_MEMBER_MISSING(struct_, set_size)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->set_size(struct_, - type, - width, - height); -} - -bool CefBrowserCToCpp::IsPopupVisible() { - if (CEF_MEMBER_MISSING(struct_, is_popup_visible)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_popup_visible(struct_); - - // Return type: bool - return _retval?true:false; -} - -void CefBrowserCToCpp::HidePopup() { - if (CEF_MEMBER_MISSING(struct_, hide_popup)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->hide_popup(struct_); -} - -void CefBrowserCToCpp::Invalidate(const CefRect& dirtyRect) { - if (CEF_MEMBER_MISSING(struct_, invalidate)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->invalidate(struct_, - &dirtyRect); -} - -bool CefBrowserCToCpp::GetImage(PaintElementType type, int width, int height, - void* buffer) { - if (CEF_MEMBER_MISSING(struct_, get_image)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: buffer; type: simple_byaddr - DCHECK(buffer); - if (!buffer) - return false; - - // Execute - int _retval = struct_->get_image(struct_, - type, - width, - height, - buffer); - - // Return type: bool - return _retval?true:false; -} - -void CefBrowserCToCpp::SendKeyEvent(KeyType type, const CefKeyInfo& keyInfo, - int modifiers) { - if (CEF_MEMBER_MISSING(struct_, send_key_event)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->send_key_event(struct_, - type, - &keyInfo, - modifiers); -} - -void CefBrowserCToCpp::SendMouseClickEvent(int x, int y, MouseButtonType type, - bool mouseUp, int clickCount) { - if (CEF_MEMBER_MISSING(struct_, send_mouse_click_event)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->send_mouse_click_event(struct_, - x, - y, - type, - mouseUp, - clickCount); -} - -void CefBrowserCToCpp::SendMouseMoveEvent(int x, int y, bool mouseLeave) { - if (CEF_MEMBER_MISSING(struct_, send_mouse_move_event)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->send_mouse_move_event(struct_, - x, - y, - mouseLeave); -} - -void CefBrowserCToCpp::SendMouseWheelEvent(int x, int y, int deltaX, - int deltaY) { - if (CEF_MEMBER_MISSING(struct_, send_mouse_wheel_event)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->send_mouse_wheel_event(struct_, - x, - y, - deltaX, - deltaY); -} - -void CefBrowserCToCpp::SendFocusEvent(bool setFocus) { - if (CEF_MEMBER_MISSING(struct_, send_focus_event)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->send_focus_event(struct_, - setFocus); -} - -void CefBrowserCToCpp::SendCaptureLostEvent() { - if (CEF_MEMBER_MISSING(struct_, send_capture_lost_event)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->send_capture_lost_event(struct_); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/browser_ctocpp.h b/cef1/libcef_dll/ctocpp/browser_ctocpp.h deleted file mode 100644 index 6bcc344dc..000000000 --- a/cef1/libcef_dll/ctocpp/browser_ctocpp.h +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_BROWSER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_BROWSER_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include -#include "include/cef_browser.h" -#include "include/capi/cef_browser_capi.h" -#include "include/cef_client.h" -#include "include/capi/cef_client_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefBrowserCToCpp - : public CefCToCpp { - public: - explicit CefBrowserCToCpp(cef_browser_t* str) - : CefCToCpp(str) {} - virtual ~CefBrowserCToCpp() {} - - // CefBrowser methods - virtual void ParentWindowWillClose() OVERRIDE; - virtual void CloseBrowser() OVERRIDE; - virtual bool CanGoBack() OVERRIDE; - virtual void GoBack() OVERRIDE; - virtual bool CanGoForward() OVERRIDE; - virtual void GoForward() OVERRIDE; - virtual void Reload() OVERRIDE; - virtual void ReloadIgnoreCache() OVERRIDE; - virtual void StopLoad() OVERRIDE; - virtual void SetFocus(bool enable) OVERRIDE; - virtual CefWindowHandle GetWindowHandle() OVERRIDE; - virtual CefWindowHandle GetOpenerWindowHandle() OVERRIDE; - virtual int GetIdentifier() OVERRIDE; - virtual bool IsPopup() OVERRIDE; - virtual bool HasDocument() OVERRIDE; - virtual CefRefPtr GetClient() OVERRIDE; - virtual CefRefPtr GetMainFrame() OVERRIDE; - virtual CefRefPtr GetFocusedFrame() OVERRIDE; - virtual CefRefPtr GetFrame(const CefString& name) OVERRIDE; - virtual void GetFrameNames(std::vector& names) OVERRIDE; - virtual void Find(int identifier, const CefString& searchText, bool forward, - bool matchCase, bool findNext) OVERRIDE; - virtual void StopFinding(bool clearSelection) OVERRIDE; - virtual double GetZoomLevel() OVERRIDE; - virtual void SetZoomLevel(double zoomLevel) OVERRIDE; - virtual void ClearHistory() OVERRIDE; - virtual void ShowDevTools() OVERRIDE; - virtual void CloseDevTools() OVERRIDE; - virtual bool IsWindowRenderingDisabled() OVERRIDE; - virtual bool GetSize(PaintElementType type, int& width, int& height) OVERRIDE; - virtual void SetSize(PaintElementType type, int width, int height) OVERRIDE; - virtual bool IsPopupVisible() OVERRIDE; - virtual void HidePopup() OVERRIDE; - virtual void Invalidate(const CefRect& dirtyRect) OVERRIDE; - virtual bool GetImage(PaintElementType type, int width, int height, - void* buffer) OVERRIDE; - virtual void SendKeyEvent(KeyType type, const CefKeyInfo& keyInfo, - int modifiers) OVERRIDE; - virtual void SendMouseClickEvent(int x, int y, MouseButtonType type, - bool mouseUp, int clickCount) OVERRIDE; - virtual void SendMouseMoveEvent(int x, int y, bool mouseLeave) OVERRIDE; - virtual void SendMouseWheelEvent(int x, int y, int deltaX, - int deltaY) OVERRIDE; - virtual void SendFocusEvent(bool setFocus) OVERRIDE; - virtual void SendCaptureLostEvent() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_BROWSER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/client_ctocpp.cc b/cef1/libcef_dll/ctocpp/client_ctocpp.cc deleted file mode 100644 index 73196fdd4..000000000 --- a/cef1/libcef_dll/ctocpp/client_ctocpp.cc +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/client_ctocpp.h" -#include "libcef_dll/ctocpp/display_handler_ctocpp.h" -#include "libcef_dll/ctocpp/drag_handler_ctocpp.h" -#include "libcef_dll/ctocpp/find_handler_ctocpp.h" -#include "libcef_dll/ctocpp/focus_handler_ctocpp.h" -#include "libcef_dll/ctocpp/geolocation_handler_ctocpp.h" -#include "libcef_dll/ctocpp/jsdialog_handler_ctocpp.h" -#include "libcef_dll/ctocpp/keyboard_handler_ctocpp.h" -#include "libcef_dll/ctocpp/life_span_handler_ctocpp.h" -#include "libcef_dll/ctocpp/load_handler_ctocpp.h" -#include "libcef_dll/ctocpp/menu_handler_ctocpp.h" -#include "libcef_dll/ctocpp/permission_handler_ctocpp.h" -#include "libcef_dll/ctocpp/print_handler_ctocpp.h" -#include "libcef_dll/ctocpp/render_handler_ctocpp.h" -#include "libcef_dll/ctocpp/request_handler_ctocpp.h" -#include "libcef_dll/ctocpp/v8context_handler_ctocpp.h" -#include "libcef_dll/ctocpp/zoom_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -CefRefPtr CefClientCToCpp::GetLifeSpanHandler() { - if (CEF_MEMBER_MISSING(struct_, get_life_span_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_life_span_handler_t* _retval = struct_->get_life_span_handler(struct_); - - // Return type: refptr_same - return CefLifeSpanHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetLoadHandler() { - if (CEF_MEMBER_MISSING(struct_, get_load_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_load_handler_t* _retval = struct_->get_load_handler(struct_); - - // Return type: refptr_same - return CefLoadHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetRequestHandler() { - if (CEF_MEMBER_MISSING(struct_, get_request_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_request_handler_t* _retval = struct_->get_request_handler(struct_); - - // Return type: refptr_same - return CefRequestHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetDisplayHandler() { - if (CEF_MEMBER_MISSING(struct_, get_display_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_display_handler_t* _retval = struct_->get_display_handler(struct_); - - // Return type: refptr_same - return CefDisplayHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetFocusHandler() { - if (CEF_MEMBER_MISSING(struct_, get_focus_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_focus_handler_t* _retval = struct_->get_focus_handler(struct_); - - // Return type: refptr_same - return CefFocusHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetKeyboardHandler() { - if (CEF_MEMBER_MISSING(struct_, get_keyboard_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_keyboard_handler_t* _retval = struct_->get_keyboard_handler(struct_); - - // Return type: refptr_same - return CefKeyboardHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetMenuHandler() { - if (CEF_MEMBER_MISSING(struct_, get_menu_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_menu_handler_t* _retval = struct_->get_menu_handler(struct_); - - // Return type: refptr_same - return CefMenuHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetPermissionHandler() { - if (CEF_MEMBER_MISSING(struct_, get_permission_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_permission_handler_t* _retval = struct_->get_permission_handler(struct_); - - // Return type: refptr_same - return CefPermissionHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetPrintHandler() { - if (CEF_MEMBER_MISSING(struct_, get_print_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_print_handler_t* _retval = struct_->get_print_handler(struct_); - - // Return type: refptr_same - return CefPrintHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetFindHandler() { - if (CEF_MEMBER_MISSING(struct_, get_find_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_find_handler_t* _retval = struct_->get_find_handler(struct_); - - // Return type: refptr_same - return CefFindHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetJSDialogHandler() { - if (CEF_MEMBER_MISSING(struct_, get_jsdialog_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_jsdialog_handler_t* _retval = struct_->get_jsdialog_handler(struct_); - - // Return type: refptr_same - return CefJSDialogHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetV8ContextHandler() { - if (CEF_MEMBER_MISSING(struct_, get_v8context_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8context_handler_t* _retval = struct_->get_v8context_handler(struct_); - - // Return type: refptr_same - return CefV8ContextHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetRenderHandler() { - if (CEF_MEMBER_MISSING(struct_, get_render_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_render_handler_t* _retval = struct_->get_render_handler(struct_); - - // Return type: refptr_same - return CefRenderHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetDragHandler() { - if (CEF_MEMBER_MISSING(struct_, get_drag_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_drag_handler_t* _retval = struct_->get_drag_handler(struct_); - - // Return type: refptr_same - return CefDragHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetGeolocationHandler() { - if (CEF_MEMBER_MISSING(struct_, get_geolocation_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_geolocation_handler_t* _retval = struct_->get_geolocation_handler( - struct_); - - // Return type: refptr_same - return CefGeolocationHandlerCToCpp::Wrap(_retval); -} - -CefRefPtr CefClientCToCpp::GetZoomHandler() { - if (CEF_MEMBER_MISSING(struct_, get_zoom_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_zoom_handler_t* _retval = struct_->get_zoom_handler(struct_); - - // Return type: refptr_same - return CefZoomHandlerCToCpp::Wrap(_retval); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/client_ctocpp.h b/cef1/libcef_dll/ctocpp/client_ctocpp.h deleted file mode 100644 index 10551e5ac..000000000 --- a/cef1/libcef_dll/ctocpp/client_ctocpp.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_CLIENT_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_CLIENT_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_client.h" -#include "include/capi/cef_client_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefClientCToCpp - : public CefCToCpp { - public: - explicit CefClientCToCpp(cef_client_t* str) - : CefCToCpp(str) {} - virtual ~CefClientCToCpp() {} - - // CefClient methods - virtual CefRefPtr GetLifeSpanHandler() OVERRIDE; - virtual CefRefPtr GetLoadHandler() OVERRIDE; - virtual CefRefPtr GetRequestHandler() OVERRIDE; - virtual CefRefPtr GetDisplayHandler() OVERRIDE; - virtual CefRefPtr GetFocusHandler() OVERRIDE; - virtual CefRefPtr GetKeyboardHandler() OVERRIDE; - virtual CefRefPtr GetMenuHandler() OVERRIDE; - virtual CefRefPtr GetPermissionHandler() OVERRIDE; - virtual CefRefPtr GetPrintHandler() OVERRIDE; - virtual CefRefPtr GetFindHandler() OVERRIDE; - virtual CefRefPtr GetJSDialogHandler() OVERRIDE; - virtual CefRefPtr GetV8ContextHandler() OVERRIDE; - virtual CefRefPtr GetRenderHandler() OVERRIDE; - virtual CefRefPtr GetDragHandler() OVERRIDE; - virtual CefRefPtr GetGeolocationHandler() OVERRIDE; - virtual CefRefPtr GetZoomHandler() OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_CLIENT_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/command_line_ctocpp.cc b/cef1/libcef_dll/ctocpp/command_line_ctocpp.cc deleted file mode 100644 index ac31a2a07..000000000 --- a/cef1/libcef_dll/ctocpp/command_line_ctocpp.cc +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "include/cef_version.h" -#include "libcef_dll/ctocpp/command_line_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefCommandLine::CreateCommandLine() { - int build_revision = cef_build_revision(); - if (build_revision != CEF_REVISION) { - // The libcef build revision does not match the CEF API revision. - DCHECK(false); - return NULL; - } - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_command_line_t* _retval = cef_command_line_create(); - - // Return type: refptr_same - return CefCommandLineCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefCommandLineCToCpp::InitFromArgv(int argc, const char* const* argv) { - if (CEF_MEMBER_MISSING(struct_, init_from_argv)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: argv; type: simple_byaddr - DCHECK(argv); - if (!argv) - return; - - // Execute - struct_->init_from_argv(struct_, - argc, - argv); -} - -void CefCommandLineCToCpp::InitFromString(const CefString& command_line) { - if (CEF_MEMBER_MISSING(struct_, init_from_string)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: command_line; type: string_byref_const - DCHECK(!command_line.empty()); - if (command_line.empty()) - return; - - // Execute - struct_->init_from_string(struct_, - command_line.GetStruct()); -} - -CefString CefCommandLineCToCpp::GetCommandLineString() { - if (CEF_MEMBER_MISSING(struct_, get_command_line_string)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_command_line_string(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefCommandLineCToCpp::GetProgram() { - if (CEF_MEMBER_MISSING(struct_, get_program)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_program(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -void CefCommandLineCToCpp::SetProgram(const CefString& program) { - if (CEF_MEMBER_MISSING(struct_, set_program)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: program; type: string_byref_const - DCHECK(!program.empty()); - if (program.empty()) - return; - - // Execute - struct_->set_program(struct_, - program.GetStruct()); -} - -bool CefCommandLineCToCpp::HasSwitches() { - if (CEF_MEMBER_MISSING(struct_, has_switches)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->has_switches(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefCommandLineCToCpp::HasSwitch(const CefString& name) { - if (CEF_MEMBER_MISSING(struct_, has_switch)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(!name.empty()); - if (name.empty()) - return false; - - // Execute - int _retval = struct_->has_switch(struct_, - name.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - -CefString CefCommandLineCToCpp::GetSwitchValue(const CefString& name) { - if (CEF_MEMBER_MISSING(struct_, get_switch_value)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(!name.empty()); - if (name.empty()) - return CefString(); - - // Execute - cef_string_userfree_t _retval = struct_->get_switch_value(struct_, - name.GetStruct()); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -void CefCommandLineCToCpp::GetSwitches(SwitchMap& switches) { - if (CEF_MEMBER_MISSING(struct_, get_switches)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: switches; type: string_map_single_byref - cef_string_map_t switchesMap = cef_string_map_alloc(); - DCHECK(switchesMap); - if (switchesMap) - transfer_string_map_contents(switches, switchesMap); - - // Execute - struct_->get_switches(struct_, - switchesMap); - - // Restore param:switches; type: string_map_single_byref - if (switchesMap) { - switches.clear(); - transfer_string_map_contents(switchesMap, switches); - cef_string_map_free(switchesMap); - } -} - -void CefCommandLineCToCpp::AppendSwitch(const CefString& name) { - if (CEF_MEMBER_MISSING(struct_, append_switch)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(!name.empty()); - if (name.empty()) - return; - - // Execute - struct_->append_switch(struct_, - name.GetStruct()); -} - -void CefCommandLineCToCpp::AppendSwitchWithValue(const CefString& name, - const CefString& value) { - if (CEF_MEMBER_MISSING(struct_, append_switch_with_value)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(!name.empty()); - if (name.empty()) - return; - // Verify param: value; type: string_byref_const - DCHECK(!value.empty()); - if (value.empty()) - return; - - // Execute - struct_->append_switch_with_value(struct_, - name.GetStruct(), - value.GetStruct()); -} - -bool CefCommandLineCToCpp::HasArguments() { - if (CEF_MEMBER_MISSING(struct_, has_arguments)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->has_arguments(struct_); - - // Return type: bool - return _retval?true:false; -} - -void CefCommandLineCToCpp::GetArguments(ArgumentList& arguments) { - if (CEF_MEMBER_MISSING(struct_, get_arguments)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: arguments; type: string_vec_byref - cef_string_list_t argumentsList = cef_string_list_alloc(); - DCHECK(argumentsList); - if (argumentsList) - transfer_string_list_contents(arguments, argumentsList); - - // Execute - struct_->get_arguments(struct_, - argumentsList); - - // Restore param:arguments; type: string_vec_byref - if (argumentsList) { - arguments.clear(); - transfer_string_list_contents(argumentsList, arguments); - cef_string_list_free(argumentsList); - } -} - -void CefCommandLineCToCpp::AppendArgument(const CefString& argument) { - if (CEF_MEMBER_MISSING(struct_, append_argument)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: argument; type: string_byref_const - DCHECK(!argument.empty()); - if (argument.empty()) - return; - - // Execute - struct_->append_argument(struct_, - argument.GetStruct()); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/command_line_ctocpp.h b/cef1/libcef_dll/ctocpp/command_line_ctocpp.h deleted file mode 100644 index a1741a0aa..000000000 --- a/cef1/libcef_dll/ctocpp/command_line_ctocpp.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_COMMAND_LINE_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_COMMAND_LINE_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_command_line.h" -#include "include/capi/cef_command_line_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefCommandLineCToCpp - : public CefCToCpp { - public: - explicit CefCommandLineCToCpp(cef_command_line_t* str) - : CefCToCpp( - str) {} - virtual ~CefCommandLineCToCpp() {} - - // CefCommandLine methods - virtual void InitFromArgv(int argc, const char* const* argv) OVERRIDE; - virtual void InitFromString(const CefString& command_line) OVERRIDE; - virtual CefString GetCommandLineString() OVERRIDE; - virtual CefString GetProgram() OVERRIDE; - virtual void SetProgram(const CefString& program) OVERRIDE; - virtual bool HasSwitches() OVERRIDE; - virtual bool HasSwitch(const CefString& name) OVERRIDE; - virtual CefString GetSwitchValue(const CefString& name) OVERRIDE; - virtual void GetSwitches(SwitchMap& switches) OVERRIDE; - virtual void AppendSwitch(const CefString& name) OVERRIDE; - virtual void AppendSwitchWithValue(const CefString& name, - const CefString& value) OVERRIDE; - virtual bool HasArguments() OVERRIDE; - virtual void GetArguments(ArgumentList& arguments) OVERRIDE; - virtual void AppendArgument(const CefString& argument) OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_COMMAND_LINE_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/content_filter_ctocpp.cc b/cef1/libcef_dll/ctocpp/content_filter_ctocpp.cc deleted file mode 100644 index 97dcc958f..000000000 --- a/cef1/libcef_dll/ctocpp/content_filter_ctocpp.cc +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/stream_reader_cpptoc.h" -#include "libcef_dll/ctocpp/content_filter_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefContentFilterCToCpp::ProcessData(const void* data, int data_size, - CefRefPtr& substitute_data) { - if (CEF_MEMBER_MISSING(struct_, process_data)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: data; type: simple_byaddr - DCHECK(data); - if (!data) - return; - - // Translate param: substitute_data; type: refptr_diff_byref - cef_stream_reader_t* substitute_dataStruct = NULL; - if (substitute_data.get()) - substitute_dataStruct = CefStreamReaderCppToC::Wrap(substitute_data); - cef_stream_reader_t* substitute_dataOrig = substitute_dataStruct; - - // Execute - struct_->process_data(struct_, - data, - data_size, - &substitute_dataStruct); - - // Restore param:substitute_data; type: refptr_diff_byref - if (substitute_dataStruct) { - if (substitute_dataStruct != substitute_dataOrig) { - substitute_data = CefStreamReaderCppToC::Unwrap(substitute_dataStruct); - } - } else { - substitute_data = NULL; - } -} - -void CefContentFilterCToCpp::Drain(CefRefPtr& remainder) { - if (CEF_MEMBER_MISSING(struct_, drain)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: remainder; type: refptr_diff_byref - cef_stream_reader_t* remainderStruct = NULL; - if (remainder.get()) - remainderStruct = CefStreamReaderCppToC::Wrap(remainder); - cef_stream_reader_t* remainderOrig = remainderStruct; - - // Execute - struct_->drain(struct_, - &remainderStruct); - - // Restore param:remainder; type: refptr_diff_byref - if (remainderStruct) { - if (remainderStruct != remainderOrig) { - remainder = CefStreamReaderCppToC::Unwrap(remainderStruct); - } - } else { - remainder = NULL; - } -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/content_filter_ctocpp.h b/cef1/libcef_dll/ctocpp/content_filter_ctocpp.h deleted file mode 100644 index d76c5b6ff..000000000 --- a/cef1/libcef_dll/ctocpp/content_filter_ctocpp.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_CONTENT_FILTER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_CONTENT_FILTER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_content_filter.h" -#include "include/capi/cef_content_filter_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefContentFilterCToCpp - : public CefCToCpp { - public: - explicit CefContentFilterCToCpp(cef_content_filter_t* str) - : CefCToCpp(str) {} - virtual ~CefContentFilterCToCpp() {} - - // CefContentFilter methods - virtual void ProcessData(const void* data, int data_size, - CefRefPtr& substitute_data) OVERRIDE; - virtual void Drain(CefRefPtr& remainder) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_CONTENT_FILTER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/cookie_manager_ctocpp.cc b/cef1/libcef_dll/ctocpp/cookie_manager_ctocpp.cc deleted file mode 100644 index 4db768d76..000000000 --- a/cef1/libcef_dll/ctocpp/cookie_manager_ctocpp.cc +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/cookie_visitor_cpptoc.h" -#include "libcef_dll/ctocpp/cookie_manager_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefCookieManager::GetGlobalManager() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_cookie_manager_t* _retval = cef_cookie_manager_get_global_manager(); - - // Return type: refptr_same - return CefCookieManagerCToCpp::Wrap(_retval); -} - -CefRefPtr CefCookieManager::CreateManager( - const CefString& path) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: path - - // Execute - cef_cookie_manager_t* _retval = cef_cookie_manager_create_manager( - path.GetStruct()); - - // Return type: refptr_same - return CefCookieManagerCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefCookieManagerCToCpp::SetSupportedSchemes( - const std::vector& schemes) { - if (CEF_MEMBER_MISSING(struct_, set_supported_schemes)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: schemes; type: string_vec_byref_const - cef_string_list_t schemesList = cef_string_list_alloc(); - DCHECK(schemesList); - if (schemesList) - transfer_string_list_contents(schemes, schemesList); - - // Execute - struct_->set_supported_schemes(struct_, - schemesList); - - // Restore param:schemes; type: string_vec_byref_const - if (schemesList) - cef_string_list_free(schemesList); -} - -bool CefCookieManagerCToCpp::VisitAllCookies( - CefRefPtr visitor) { - if (CEF_MEMBER_MISSING(struct_, visit_all_cookies)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: visitor; type: refptr_diff - DCHECK(visitor.get()); - if (!visitor.get()) - return false; - - // Execute - int _retval = struct_->visit_all_cookies(struct_, - CefCookieVisitorCppToC::Wrap(visitor)); - - // Return type: bool - return _retval?true:false; -} - -bool CefCookieManagerCToCpp::VisitUrlCookies(const CefString& url, - bool includeHttpOnly, CefRefPtr visitor) { - if (CEF_MEMBER_MISSING(struct_, visit_url_cookies)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return false; - // Verify param: visitor; type: refptr_diff - DCHECK(visitor.get()); - if (!visitor.get()) - return false; - - // Execute - int _retval = struct_->visit_url_cookies(struct_, - url.GetStruct(), - includeHttpOnly, - CefCookieVisitorCppToC::Wrap(visitor)); - - // Return type: bool - return _retval?true:false; -} - -bool CefCookieManagerCToCpp::SetCookie(const CefString& url, - const CefCookie& cookie) { - if (CEF_MEMBER_MISSING(struct_, set_cookie)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return false; - - // Execute - int _retval = struct_->set_cookie(struct_, - url.GetStruct(), - &cookie); - - // Return type: bool - return _retval?true:false; -} - -bool CefCookieManagerCToCpp::DeleteCookies(const CefString& url, - const CefString& cookie_name) { - if (CEF_MEMBER_MISSING(struct_, delete_cookies)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: url, cookie_name - - // Execute - int _retval = struct_->delete_cookies(struct_, - url.GetStruct(), - cookie_name.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - -bool CefCookieManagerCToCpp::SetStoragePath(const CefString& path) { - if (CEF_MEMBER_MISSING(struct_, set_storage_path)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: path - - // Execute - int _retval = struct_->set_storage_path(struct_, - path.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/cookie_manager_ctocpp.h b/cef1/libcef_dll/ctocpp/cookie_manager_ctocpp.h deleted file mode 100644 index 760021ba0..000000000 --- a/cef1/libcef_dll/ctocpp/cookie_manager_ctocpp.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_COOKIE_MANAGER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_COOKIE_MANAGER_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include -#include "include/cef_cookie.h" -#include "include/capi/cef_cookie_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefCookieManagerCToCpp - : public CefCToCpp { - public: - explicit CefCookieManagerCToCpp(cef_cookie_manager_t* str) - : CefCToCpp(str) {} - virtual ~CefCookieManagerCToCpp() {} - - // CefCookieManager methods - virtual void SetSupportedSchemes( - const std::vector& schemes) OVERRIDE; - virtual bool VisitAllCookies(CefRefPtr visitor) OVERRIDE; - virtual bool VisitUrlCookies(const CefString& url, bool includeHttpOnly, - CefRefPtr visitor) OVERRIDE; - virtual bool SetCookie(const CefString& url, - const CefCookie& cookie) OVERRIDE; - virtual bool DeleteCookies(const CefString& url, - const CefString& cookie_name) OVERRIDE; - virtual bool SetStoragePath(const CefString& path) OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_COOKIE_MANAGER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/cookie_visitor_ctocpp.cc b/cef1/libcef_dll/ctocpp/cookie_visitor_ctocpp.cc deleted file mode 100644 index 0992e107b..000000000 --- a/cef1/libcef_dll/ctocpp/cookie_visitor_ctocpp.cc +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/cookie_visitor_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefCookieVisitorCToCpp::Visit(const CefCookie& cookie, int count, - int total, bool& deleteCookie) { - if (CEF_MEMBER_MISSING(struct_, visit)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: deleteCookie; type: bool_byref - int deleteCookieInt = deleteCookie; - - // Execute - int _retval = struct_->visit(struct_, - &cookie, - count, - total, - &deleteCookieInt); - - // Restore param:deleteCookie; type: bool_byref - deleteCookie = deleteCookieInt?true:false; - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/cookie_visitor_ctocpp.h b/cef1/libcef_dll/ctocpp/cookie_visitor_ctocpp.h deleted file mode 100644 index 379de8e20..000000000 --- a/cef1/libcef_dll/ctocpp/cookie_visitor_ctocpp.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_COOKIE_VISITOR_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_COOKIE_VISITOR_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_cookie.h" -#include "include/capi/cef_cookie_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefCookieVisitorCToCpp - : public CefCToCpp { - public: - explicit CefCookieVisitorCToCpp(cef_cookie_visitor_t* str) - : CefCToCpp(str) {} - virtual ~CefCookieVisitorCToCpp() {} - - // CefCookieVisitor methods - virtual bool Visit(const CefCookie& cookie, int count, int total, - bool& deleteCookie) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_COOKIE_VISITOR_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/ctocpp.h b/cef1/libcef_dll/ctocpp/ctocpp.h deleted file mode 100644 index 3697647c4..000000000 --- a/cef1/libcef_dll/ctocpp/ctocpp.h +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_DLL_CTOCPP_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_CTOCPP_H_ -#pragma once - -#include "include/cef_base.h" -#include "include/capi/cef_base_capi.h" -#include "libcef_dll/cef_logging.h" - - -// Wrap a C structure with a C++ class. This is used when the implementation -// exists on the other side of the DLL boundary but will have methods called on -// this side of the DLL boundary. -template -class CefCToCpp : public BaseName { - public: - // Use this method to create a wrapper class instance for a structure - // received from the other side. - static CefRefPtr Wrap(StructName* s) { - if (!s) - return NULL; - - // Wrap their structure with the CefCToCpp object. - ClassName* wrapper = new ClassName(s); - // Put the wrapper object in a smart pointer. - CefRefPtr wrapperPtr(wrapper); - // Release the reference that was added to the CefCppToC wrapper object on - // the other side before their structure was passed to us. - wrapper->UnderlyingRelease(); - // Return the smart pointer. - return wrapperPtr; - } - - // Use this method to retrieve the underlying structure from a wrapper class - // instance for return back to the other side. - static StructName* Unwrap(CefRefPtr c) { - if (!c.get()) - return NULL; - - // Cast the object to our wrapper class type. - ClassName* wrapper = static_cast(c.get()); - // Add a reference to the CefCppToC wrapper object on the other side that - // will be released once the structure is received. - wrapper->UnderlyingAddRef(); - // Return their original structure. - return wrapper->GetStruct(); - } - - explicit CefCToCpp(StructName* str) - : struct_(str) { - DCHECK(str); - -#ifndef NDEBUG - CefAtomicIncrement(&DebugObjCt); -#endif - } - virtual ~CefCToCpp() { -#ifndef NDEBUG - CefAtomicDecrement(&DebugObjCt); -#endif - } - - // If returning the structure across the DLL boundary you should call - // UnderlyingAddRef() on this wrapping CefCToCpp object. On the other side of - // the DLL boundary, call Release() on the CefCppToC object. - StructName* GetStruct() { return struct_; } - - // CefBase methods increment/decrement reference counts on both this object - // and the underlying wrapped structure. - int AddRef() { - UnderlyingAddRef(); - return refct_.AddRef(); - } - int Release() { - UnderlyingRelease(); - int retval = refct_.Release(); - if (retval == 0) - delete this; - return retval; - } - int GetRefCt() { return refct_.GetRefCt(); } - - // Increment/decrement reference counts on only the underlying class. - int UnderlyingAddRef() { - if (!struct_->base.add_ref) - return 0; - return struct_->base.add_ref(&struct_->base); - } - int UnderlyingRelease() { - if (!struct_->base.release) - return 0; - return struct_->base.release(&struct_->base); - } - int UnderlyingGetRefCt() { - if (!struct_->base.get_refct) - return 0; - return struct_->base.get_refct(&struct_->base); - } - -#ifndef NDEBUG - // Simple tracking of allocated objects. - static long DebugObjCt; // NOLINT(runtime/int) -#endif - - protected: - CefRefCount refct_; - StructName* struct_; -}; - -#endif // CEF_LIBCEF_DLL_CTOCPP_CTOCPP_H_ diff --git a/cef1/libcef_dll/ctocpp/display_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/display_handler_ctocpp.cc deleted file mode 100644 index 386c9036b..000000000 --- a/cef1/libcef_dll/ctocpp/display_handler_ctocpp.cc +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/frame_cpptoc.h" -#include "libcef_dll/ctocpp/display_handler_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefDisplayHandlerCToCpp::OnNavStateChange(CefRefPtr browser, - bool canGoBack, bool canGoForward) { - if (CEF_MEMBER_MISSING(struct_, on_nav_state_change)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - - // Execute - struct_->on_nav_state_change(struct_, - CefBrowserCppToC::Wrap(browser), - canGoBack, - canGoForward); -} - -void CefDisplayHandlerCToCpp::OnAddressChange(CefRefPtr browser, - CefRefPtr frame, const CefString& url) { - if (CEF_MEMBER_MISSING(struct_, on_address_change)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return; - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return; - - // Execute - struct_->on_address_change(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - url.GetStruct()); -} - -void CefDisplayHandlerCToCpp::OnContentsSizeChange( - CefRefPtr browser, CefRefPtr frame, int width, - int height) { - if (CEF_MEMBER_MISSING(struct_, on_contents_size_change)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return; - - // Execute - struct_->on_contents_size_change(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - width, - height); -} - -void CefDisplayHandlerCToCpp::OnTitleChange(CefRefPtr browser, - const CefString& title) { - if (CEF_MEMBER_MISSING(struct_, on_title_change)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Unverified params: title - - // Execute - struct_->on_title_change(struct_, - CefBrowserCppToC::Wrap(browser), - title.GetStruct()); -} - -void CefDisplayHandlerCToCpp::OnFaviconURLChange(CefRefPtr browser, - const std::vector& icon_urls) { - if (CEF_MEMBER_MISSING(struct_, on_favicon_urlchange)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - - // Translate param: icon_urls; type: string_vec_byref_const - cef_string_list_t icon_urlsList = cef_string_list_alloc(); - DCHECK(icon_urlsList); - if (icon_urlsList) - transfer_string_list_contents(icon_urls, icon_urlsList); - - // Execute - struct_->on_favicon_urlchange(struct_, - CefBrowserCppToC::Wrap(browser), - icon_urlsList); - - // Restore param:icon_urls; type: string_vec_byref_const - if (icon_urlsList) - cef_string_list_free(icon_urlsList); -} - -bool CefDisplayHandlerCToCpp::OnTooltip(CefRefPtr browser, - CefString& text) { - if (CEF_MEMBER_MISSING(struct_, on_tooltip)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Unverified params: text - - // Execute - int _retval = struct_->on_tooltip(struct_, - CefBrowserCppToC::Wrap(browser), - text.GetWritableStruct()); - - // Return type: bool - return _retval?true:false; -} - -void CefDisplayHandlerCToCpp::OnStatusMessage(CefRefPtr browser, - const CefString& value, StatusType type) { - if (CEF_MEMBER_MISSING(struct_, on_status_message)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Unverified params: value - - // Execute - struct_->on_status_message(struct_, - CefBrowserCppToC::Wrap(browser), - value.GetStruct(), - type); -} - -bool CefDisplayHandlerCToCpp::OnConsoleMessage(CefRefPtr browser, - const CefString& message, const CefString& source, int line) { - if (CEF_MEMBER_MISSING(struct_, on_console_message)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Unverified params: message, source - - // Execute - int _retval = struct_->on_console_message(struct_, - CefBrowserCppToC::Wrap(browser), - message.GetStruct(), - source.GetStruct(), - line); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/display_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/display_handler_ctocpp.h deleted file mode 100644 index 69ca4e55c..000000000 --- a/cef1/libcef_dll/ctocpp/display_handler_ctocpp.h +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_DISPLAY_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_DISPLAY_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include -#include "include/cef_display_handler.h" -#include "include/capi/cef_display_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefDisplayHandlerCToCpp - : public CefCToCpp { - public: - explicit CefDisplayHandlerCToCpp(cef_display_handler_t* str) - : CefCToCpp(str) {} - virtual ~CefDisplayHandlerCToCpp() {} - - // CefDisplayHandler methods - virtual void OnNavStateChange(CefRefPtr browser, bool canGoBack, - bool canGoForward) OVERRIDE; - virtual void OnAddressChange(CefRefPtr browser, - CefRefPtr frame, const CefString& url) OVERRIDE; - virtual void OnContentsSizeChange(CefRefPtr browser, - CefRefPtr frame, int width, int height) OVERRIDE; - virtual void OnTitleChange(CefRefPtr browser, - const CefString& title) OVERRIDE; - virtual void OnFaviconURLChange(CefRefPtr browser, - const std::vector& icon_urls) OVERRIDE; - virtual bool OnTooltip(CefRefPtr browser, - CefString& text) OVERRIDE; - virtual void OnStatusMessage(CefRefPtr browser, - const CefString& value, StatusType type) OVERRIDE; - virtual bool OnConsoleMessage(CefRefPtr browser, - const CefString& message, const CefString& source, int line) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_DISPLAY_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/domdocument_ctocpp.cc b/cef1/libcef_dll/ctocpp/domdocument_ctocpp.cc deleted file mode 100644 index 3afa95215..000000000 --- a/cef1/libcef_dll/ctocpp/domdocument_ctocpp.cc +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/domdocument_ctocpp.h" -#include "libcef_dll/ctocpp/domnode_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -CefDOMDocument::Type CefDOMDocumentCToCpp::GetType() { - if (CEF_MEMBER_MISSING(struct_, get_type)) - return DOM_DOCUMENT_TYPE_UNKNOWN; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_dom_document_type_t _retval = struct_->get_type(struct_); - - // Return type: simple - return _retval; -} - -CefRefPtr CefDOMDocumentCToCpp::GetDocument() { - if (CEF_MEMBER_MISSING(struct_, get_document)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_document(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -CefRefPtr CefDOMDocumentCToCpp::GetBody() { - if (CEF_MEMBER_MISSING(struct_, get_body)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_body(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -CefRefPtr CefDOMDocumentCToCpp::GetHead() { - if (CEF_MEMBER_MISSING(struct_, get_head)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_head(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -CefString CefDOMDocumentCToCpp::GetTitle() { - if (CEF_MEMBER_MISSING(struct_, get_title)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_title(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefRefPtr CefDOMDocumentCToCpp::GetElementById( - const CefString& id) { - if (CEF_MEMBER_MISSING(struct_, get_element_by_id)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: id; type: string_byref_const - DCHECK(!id.empty()); - if (id.empty()) - return NULL; - - // Execute - cef_domnode_t* _retval = struct_->get_element_by_id(struct_, - id.GetStruct()); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -CefRefPtr CefDOMDocumentCToCpp::GetFocusedNode() { - if (CEF_MEMBER_MISSING(struct_, get_focused_node)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_focused_node(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -bool CefDOMDocumentCToCpp::HasSelection() { - if (CEF_MEMBER_MISSING(struct_, has_selection)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->has_selection(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefRefPtr CefDOMDocumentCToCpp::GetSelectionStartNode() { - if (CEF_MEMBER_MISSING(struct_, get_selection_start_node)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_selection_start_node(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -int CefDOMDocumentCToCpp::GetSelectionStartOffset() { - if (CEF_MEMBER_MISSING(struct_, get_selection_start_offset)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_selection_start_offset(struct_); - - // Return type: simple - return _retval; -} - -CefRefPtr CefDOMDocumentCToCpp::GetSelectionEndNode() { - if (CEF_MEMBER_MISSING(struct_, get_selection_end_node)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_selection_end_node(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -int CefDOMDocumentCToCpp::GetSelectionEndOffset() { - if (CEF_MEMBER_MISSING(struct_, get_selection_end_offset)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_selection_end_offset(struct_); - - // Return type: simple - return _retval; -} - -CefString CefDOMDocumentCToCpp::GetSelectionAsMarkup() { - if (CEF_MEMBER_MISSING(struct_, get_selection_as_markup)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_selection_as_markup(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefDOMDocumentCToCpp::GetSelectionAsText() { - if (CEF_MEMBER_MISSING(struct_, get_selection_as_text)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_selection_as_text(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefDOMDocumentCToCpp::GetBaseURL() { - if (CEF_MEMBER_MISSING(struct_, get_base_url)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_base_url(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefDOMDocumentCToCpp::GetCompleteURL(const CefString& partialURL) { - if (CEF_MEMBER_MISSING(struct_, get_complete_url)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: partialURL; type: string_byref_const - DCHECK(!partialURL.empty()); - if (partialURL.empty()) - return CefString(); - - // Execute - cef_string_userfree_t _retval = struct_->get_complete_url(struct_, - partialURL.GetStruct()); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/domdocument_ctocpp.h b/cef1/libcef_dll/ctocpp/domdocument_ctocpp.h deleted file mode 100644 index 23fee5b21..000000000 --- a/cef1/libcef_dll/ctocpp/domdocument_ctocpp.h +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_DOMDOCUMENT_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_DOMDOCUMENT_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_dom.h" -#include "include/capi/cef_dom_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefDOMDocumentCToCpp - : public CefCToCpp { - public: - explicit CefDOMDocumentCToCpp(cef_domdocument_t* str) - : CefCToCpp( - str) {} - virtual ~CefDOMDocumentCToCpp() {} - - // CefDOMDocument methods - virtual Type GetType() OVERRIDE; - virtual CefRefPtr GetDocument() OVERRIDE; - virtual CefRefPtr GetBody() OVERRIDE; - virtual CefRefPtr GetHead() OVERRIDE; - virtual CefString GetTitle() OVERRIDE; - virtual CefRefPtr GetElementById(const CefString& id) OVERRIDE; - virtual CefRefPtr GetFocusedNode() OVERRIDE; - virtual bool HasSelection() OVERRIDE; - virtual CefRefPtr GetSelectionStartNode() OVERRIDE; - virtual int GetSelectionStartOffset() OVERRIDE; - virtual CefRefPtr GetSelectionEndNode() OVERRIDE; - virtual int GetSelectionEndOffset() OVERRIDE; - virtual CefString GetSelectionAsMarkup() OVERRIDE; - virtual CefString GetSelectionAsText() OVERRIDE; - virtual CefString GetBaseURL() OVERRIDE; - virtual CefString GetCompleteURL(const CefString& partialURL) OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_DOMDOCUMENT_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/domevent_ctocpp.cc b/cef1/libcef_dll/ctocpp/domevent_ctocpp.cc deleted file mode 100644 index 3bec4e5bf..000000000 --- a/cef1/libcef_dll/ctocpp/domevent_ctocpp.cc +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/domdocument_ctocpp.h" -#include "libcef_dll/ctocpp/domevent_ctocpp.h" -#include "libcef_dll/ctocpp/domnode_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -CefString CefDOMEventCToCpp::GetType() { - if (CEF_MEMBER_MISSING(struct_, get_type)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_type(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefDOMEvent::Category CefDOMEventCToCpp::GetCategory() { - if (CEF_MEMBER_MISSING(struct_, get_category)) - return DOM_EVENT_CATEGORY_UNKNOWN; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_dom_event_category_t _retval = struct_->get_category(struct_); - - // Return type: simple - return _retval; -} - -CefDOMEvent::Phase CefDOMEventCToCpp::GetPhase() { - if (CEF_MEMBER_MISSING(struct_, get_phase)) - return DOM_EVENT_PHASE_UNKNOWN; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_dom_event_phase_t _retval = struct_->get_phase(struct_); - - // Return type: simple - return _retval; -} - -bool CefDOMEventCToCpp::CanBubble() { - if (CEF_MEMBER_MISSING(struct_, can_bubble)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->can_bubble(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefDOMEventCToCpp::CanCancel() { - if (CEF_MEMBER_MISSING(struct_, can_cancel)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->can_cancel(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefRefPtr CefDOMEventCToCpp::GetDocument() { - if (CEF_MEMBER_MISSING(struct_, get_document)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domdocument_t* _retval = struct_->get_document(struct_); - - // Return type: refptr_same - return CefDOMDocumentCToCpp::Wrap(_retval); -} - -CefRefPtr CefDOMEventCToCpp::GetTarget() { - if (CEF_MEMBER_MISSING(struct_, get_target)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_target(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -CefRefPtr CefDOMEventCToCpp::GetCurrentTarget() { - if (CEF_MEMBER_MISSING(struct_, get_current_target)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_current_target(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/domevent_ctocpp.h b/cef1/libcef_dll/ctocpp/domevent_ctocpp.h deleted file mode 100644 index 22fbed79f..000000000 --- a/cef1/libcef_dll/ctocpp/domevent_ctocpp.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_DOMEVENT_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_DOMEVENT_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_dom.h" -#include "include/capi/cef_dom_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefDOMEventCToCpp - : public CefCToCpp { - public: - explicit CefDOMEventCToCpp(cef_domevent_t* str) - : CefCToCpp(str) {} - virtual ~CefDOMEventCToCpp() {} - - // CefDOMEvent methods - virtual CefString GetType() OVERRIDE; - virtual Category GetCategory() OVERRIDE; - virtual Phase GetPhase() OVERRIDE; - virtual bool CanBubble() OVERRIDE; - virtual bool CanCancel() OVERRIDE; - virtual CefRefPtr GetDocument() OVERRIDE; - virtual CefRefPtr GetTarget() OVERRIDE; - virtual CefRefPtr GetCurrentTarget() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_DOMEVENT_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/domevent_listener_ctocpp.cc b/cef1/libcef_dll/ctocpp/domevent_listener_ctocpp.cc deleted file mode 100644 index ead1952ba..000000000 --- a/cef1/libcef_dll/ctocpp/domevent_listener_ctocpp.cc +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/domevent_cpptoc.h" -#include "libcef_dll/ctocpp/domevent_listener_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefDOMEventListenerCToCpp::HandleEvent(CefRefPtr event) { - if (CEF_MEMBER_MISSING(struct_, handle_event)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: event; type: refptr_diff - DCHECK(event.get()); - if (!event.get()) - return; - - // Execute - struct_->handle_event(struct_, - CefDOMEventCppToC::Wrap(event)); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/domevent_listener_ctocpp.h b/cef1/libcef_dll/ctocpp/domevent_listener_ctocpp.h deleted file mode 100644 index 21ebfce08..000000000 --- a/cef1/libcef_dll/ctocpp/domevent_listener_ctocpp.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_DOMEVENT_LISTENER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_DOMEVENT_LISTENER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_dom.h" -#include "include/capi/cef_dom_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefDOMEventListenerCToCpp - : public CefCToCpp { - public: - explicit CefDOMEventListenerCToCpp(cef_domevent_listener_t* str) - : CefCToCpp(str) {} - virtual ~CefDOMEventListenerCToCpp() {} - - // CefDOMEventListener methods - virtual void HandleEvent(CefRefPtr event) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_DOMEVENT_LISTENER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/domnode_ctocpp.cc b/cef1/libcef_dll/ctocpp/domnode_ctocpp.cc deleted file mode 100644 index fb3a8d009..000000000 --- a/cef1/libcef_dll/ctocpp/domnode_ctocpp.cc +++ /dev/null @@ -1,423 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/domevent_listener_cpptoc.h" -#include "libcef_dll/ctocpp/domdocument_ctocpp.h" -#include "libcef_dll/ctocpp/domnode_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -CefDOMNode::Type CefDOMNodeCToCpp::GetType() { - if (CEF_MEMBER_MISSING(struct_, get_type)) - return DOM_NODE_TYPE_UNSUPPORTED; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_dom_node_type_t _retval = struct_->get_type(struct_); - - // Return type: simple - return _retval; -} - -bool CefDOMNodeCToCpp::IsText() { - if (CEF_MEMBER_MISSING(struct_, is_text)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_text(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefDOMNodeCToCpp::IsElement() { - if (CEF_MEMBER_MISSING(struct_, is_element)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_element(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefDOMNodeCToCpp::IsFormControlElement() { - if (CEF_MEMBER_MISSING(struct_, is_form_control_element)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_form_control_element(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefString CefDOMNodeCToCpp::GetFormControlElementType() { - if (CEF_MEMBER_MISSING(struct_, get_form_control_element_type)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_form_control_element_type( - struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -bool CefDOMNodeCToCpp::IsSame(CefRefPtr that) { - if (CEF_MEMBER_MISSING(struct_, is_same)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: that; type: refptr_same - DCHECK(that.get()); - if (!that.get()) - return false; - - // Execute - int _retval = struct_->is_same(struct_, - CefDOMNodeCToCpp::Unwrap(that)); - - // Return type: bool - return _retval?true:false; -} - -CefString CefDOMNodeCToCpp::GetName() { - if (CEF_MEMBER_MISSING(struct_, get_name)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_name(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefDOMNodeCToCpp::GetValue() { - if (CEF_MEMBER_MISSING(struct_, get_value)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_value(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -bool CefDOMNodeCToCpp::SetValue(const CefString& value) { - if (CEF_MEMBER_MISSING(struct_, set_value)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: value; type: string_byref_const - DCHECK(!value.empty()); - if (value.empty()) - return false; - - // Execute - int _retval = struct_->set_value(struct_, - value.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - -CefString CefDOMNodeCToCpp::GetAsMarkup() { - if (CEF_MEMBER_MISSING(struct_, get_as_markup)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_as_markup(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefRefPtr CefDOMNodeCToCpp::GetDocument() { - if (CEF_MEMBER_MISSING(struct_, get_document)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domdocument_t* _retval = struct_->get_document(struct_); - - // Return type: refptr_same - return CefDOMDocumentCToCpp::Wrap(_retval); -} - -CefRefPtr CefDOMNodeCToCpp::GetParent() { - if (CEF_MEMBER_MISSING(struct_, get_parent)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_parent(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -CefRefPtr CefDOMNodeCToCpp::GetPreviousSibling() { - if (CEF_MEMBER_MISSING(struct_, get_previous_sibling)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_previous_sibling(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -CefRefPtr CefDOMNodeCToCpp::GetNextSibling() { - if (CEF_MEMBER_MISSING(struct_, get_next_sibling)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_next_sibling(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -bool CefDOMNodeCToCpp::HasChildren() { - if (CEF_MEMBER_MISSING(struct_, has_children)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->has_children(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefRefPtr CefDOMNodeCToCpp::GetFirstChild() { - if (CEF_MEMBER_MISSING(struct_, get_first_child)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_first_child(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -CefRefPtr CefDOMNodeCToCpp::GetLastChild() { - if (CEF_MEMBER_MISSING(struct_, get_last_child)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_domnode_t* _retval = struct_->get_last_child(struct_); - - // Return type: refptr_same - return CefDOMNodeCToCpp::Wrap(_retval); -} - -void CefDOMNodeCToCpp::AddEventListener(const CefString& eventType, - CefRefPtr listener, bool useCapture) { - if (CEF_MEMBER_MISSING(struct_, add_event_listener)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: eventType; type: string_byref_const - DCHECK(!eventType.empty()); - if (eventType.empty()) - return; - // Verify param: listener; type: refptr_diff - DCHECK(listener.get()); - if (!listener.get()) - return; - - // Execute - struct_->add_event_listener(struct_, - eventType.GetStruct(), - CefDOMEventListenerCppToC::Wrap(listener), - useCapture); -} - -CefString CefDOMNodeCToCpp::GetElementTagName() { - if (CEF_MEMBER_MISSING(struct_, get_element_tag_name)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_element_tag_name(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -bool CefDOMNodeCToCpp::HasElementAttributes() { - if (CEF_MEMBER_MISSING(struct_, has_element_attributes)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->has_element_attributes(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefDOMNodeCToCpp::HasElementAttribute(const CefString& attrName) { - if (CEF_MEMBER_MISSING(struct_, has_element_attribute)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: attrName; type: string_byref_const - DCHECK(!attrName.empty()); - if (attrName.empty()) - return false; - - // Execute - int _retval = struct_->has_element_attribute(struct_, - attrName.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - -CefString CefDOMNodeCToCpp::GetElementAttribute(const CefString& attrName) { - if (CEF_MEMBER_MISSING(struct_, get_element_attribute)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: attrName; type: string_byref_const - DCHECK(!attrName.empty()); - if (attrName.empty()) - return CefString(); - - // Execute - cef_string_userfree_t _retval = struct_->get_element_attribute(struct_, - attrName.GetStruct()); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -void CefDOMNodeCToCpp::GetElementAttributes(AttributeMap& attrMap) { - if (CEF_MEMBER_MISSING(struct_, get_element_attributes)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: attrMap; type: string_map_single_byref - cef_string_map_t attrMapMap = cef_string_map_alloc(); - DCHECK(attrMapMap); - if (attrMapMap) - transfer_string_map_contents(attrMap, attrMapMap); - - // Execute - struct_->get_element_attributes(struct_, - attrMapMap); - - // Restore param:attrMap; type: string_map_single_byref - if (attrMapMap) { - attrMap.clear(); - transfer_string_map_contents(attrMapMap, attrMap); - cef_string_map_free(attrMapMap); - } -} - -bool CefDOMNodeCToCpp::SetElementAttribute(const CefString& attrName, - const CefString& value) { - if (CEF_MEMBER_MISSING(struct_, set_element_attribute)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: attrName; type: string_byref_const - DCHECK(!attrName.empty()); - if (attrName.empty()) - return false; - // Verify param: value; type: string_byref_const - DCHECK(!value.empty()); - if (value.empty()) - return false; - - // Execute - int _retval = struct_->set_element_attribute(struct_, - attrName.GetStruct(), - value.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - -CefString CefDOMNodeCToCpp::GetElementInnerText() { - if (CEF_MEMBER_MISSING(struct_, get_element_inner_text)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_element_inner_text(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/domnode_ctocpp.h b/cef1/libcef_dll/ctocpp/domnode_ctocpp.h deleted file mode 100644 index 765e7aa75..000000000 --- a/cef1/libcef_dll/ctocpp/domnode_ctocpp.h +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_DOMNODE_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_DOMNODE_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_dom.h" -#include "include/capi/cef_dom_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefDOMNodeCToCpp - : public CefCToCpp { - public: - explicit CefDOMNodeCToCpp(cef_domnode_t* str) - : CefCToCpp(str) {} - virtual ~CefDOMNodeCToCpp() {} - - // CefDOMNode methods - virtual Type GetType() OVERRIDE; - virtual bool IsText() OVERRIDE; - virtual bool IsElement() OVERRIDE; - virtual bool IsFormControlElement() OVERRIDE; - virtual CefString GetFormControlElementType() OVERRIDE; - virtual bool IsSame(CefRefPtr that) OVERRIDE; - virtual CefString GetName() OVERRIDE; - virtual CefString GetValue() OVERRIDE; - virtual bool SetValue(const CefString& value) OVERRIDE; - virtual CefString GetAsMarkup() OVERRIDE; - virtual CefRefPtr GetDocument() OVERRIDE; - virtual CefRefPtr GetParent() OVERRIDE; - virtual CefRefPtr GetPreviousSibling() OVERRIDE; - virtual CefRefPtr GetNextSibling() OVERRIDE; - virtual bool HasChildren() OVERRIDE; - virtual CefRefPtr GetFirstChild() OVERRIDE; - virtual CefRefPtr GetLastChild() OVERRIDE; - virtual void AddEventListener(const CefString& eventType, - CefRefPtr listener, bool useCapture) OVERRIDE; - virtual CefString GetElementTagName() OVERRIDE; - virtual bool HasElementAttributes() OVERRIDE; - virtual bool HasElementAttribute(const CefString& attrName) OVERRIDE; - virtual CefString GetElementAttribute(const CefString& attrName) OVERRIDE; - virtual void GetElementAttributes(AttributeMap& attrMap) OVERRIDE; - virtual bool SetElementAttribute(const CefString& attrName, - const CefString& value) OVERRIDE; - virtual CefString GetElementInnerText() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_DOMNODE_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/domvisitor_ctocpp.cc b/cef1/libcef_dll/ctocpp/domvisitor_ctocpp.cc deleted file mode 100644 index a3701cb25..000000000 --- a/cef1/libcef_dll/ctocpp/domvisitor_ctocpp.cc +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/domdocument_cpptoc.h" -#include "libcef_dll/ctocpp/domvisitor_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefDOMVisitorCToCpp::Visit(CefRefPtr document) { - if (CEF_MEMBER_MISSING(struct_, visit)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: document; type: refptr_diff - DCHECK(document.get()); - if (!document.get()) - return; - - // Execute - struct_->visit(struct_, - CefDOMDocumentCppToC::Wrap(document)); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/domvisitor_ctocpp.h b/cef1/libcef_dll/ctocpp/domvisitor_ctocpp.h deleted file mode 100644 index 48981eb9b..000000000 --- a/cef1/libcef_dll/ctocpp/domvisitor_ctocpp.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_DOMVISITOR_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_DOMVISITOR_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_dom.h" -#include "include/capi/cef_dom_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefDOMVisitorCToCpp - : public CefCToCpp { - public: - explicit CefDOMVisitorCToCpp(cef_domvisitor_t* str) - : CefCToCpp(str) {} - virtual ~CefDOMVisitorCToCpp() {} - - // CefDOMVisitor methods - virtual void Visit(CefRefPtr document) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_DOMVISITOR_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/download_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/download_handler_ctocpp.cc deleted file mode 100644 index f53f34ac6..000000000 --- a/cef1/libcef_dll/ctocpp/download_handler_ctocpp.cc +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/download_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefDownloadHandlerCToCpp::ReceivedData(void* data, int data_size) { - if (CEF_MEMBER_MISSING(struct_, received_data)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: data; type: simple_byaddr - DCHECK(data); - if (!data) - return false; - - // Execute - int _retval = struct_->received_data(struct_, - data, - data_size); - - // Return type: bool - return _retval?true:false; -} - -void CefDownloadHandlerCToCpp::Complete() { - if (CEF_MEMBER_MISSING(struct_, complete)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->complete(struct_); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/download_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/download_handler_ctocpp.h deleted file mode 100644 index 28fbfefb1..000000000 --- a/cef1/libcef_dll/ctocpp/download_handler_ctocpp.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_DOWNLOAD_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_DOWNLOAD_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_download_handler.h" -#include "include/capi/cef_download_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefDownloadHandlerCToCpp - : public CefCToCpp { - public: - explicit CefDownloadHandlerCToCpp(cef_download_handler_t* str) - : CefCToCpp(str) {} - virtual ~CefDownloadHandlerCToCpp() {} - - // CefDownloadHandler methods - virtual bool ReceivedData(void* data, int data_size) OVERRIDE; - virtual void Complete() OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_DOWNLOAD_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/drag_data_ctocpp.cc b/cef1/libcef_dll/ctocpp/drag_data_ctocpp.cc deleted file mode 100644 index 855ff50ac..000000000 --- a/cef1/libcef_dll/ctocpp/drag_data_ctocpp.cc +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/drag_data_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefDragDataCToCpp::IsLink() { - if (CEF_MEMBER_MISSING(struct_, is_link)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_link(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefDragDataCToCpp::IsFragment() { - if (CEF_MEMBER_MISSING(struct_, is_fragment)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_fragment(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefDragDataCToCpp::IsFile() { - if (CEF_MEMBER_MISSING(struct_, is_file)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_file(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefString CefDragDataCToCpp::GetLinkURL() { - if (CEF_MEMBER_MISSING(struct_, get_link_url)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_link_url(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefDragDataCToCpp::GetLinkTitle() { - if (CEF_MEMBER_MISSING(struct_, get_link_title)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_link_title(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefDragDataCToCpp::GetLinkMetadata() { - if (CEF_MEMBER_MISSING(struct_, get_link_metadata)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_link_metadata(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefDragDataCToCpp::GetFragmentText() { - if (CEF_MEMBER_MISSING(struct_, get_fragment_text)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_fragment_text(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefDragDataCToCpp::GetFragmentHtml() { - if (CEF_MEMBER_MISSING(struct_, get_fragment_html)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_fragment_html(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefDragDataCToCpp::GetFragmentBaseURL() { - if (CEF_MEMBER_MISSING(struct_, get_fragment_base_url)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_fragment_base_url(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefDragDataCToCpp::GetFileName() { - if (CEF_MEMBER_MISSING(struct_, get_file_name)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_file_name(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -bool CefDragDataCToCpp::GetFileNames(std::vector& names) { - if (CEF_MEMBER_MISSING(struct_, get_file_names)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: names; type: string_vec_byref - cef_string_list_t namesList = cef_string_list_alloc(); - DCHECK(namesList); - if (namesList) - transfer_string_list_contents(names, namesList); - - // Execute - int _retval = struct_->get_file_names(struct_, - namesList); - - // Restore param:names; type: string_vec_byref - if (namesList) { - names.clear(); - transfer_string_list_contents(namesList, names); - cef_string_list_free(namesList); - } - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/drag_data_ctocpp.h b/cef1/libcef_dll/ctocpp/drag_data_ctocpp.h deleted file mode 100644 index 7a0db8d99..000000000 --- a/cef1/libcef_dll/ctocpp/drag_data_ctocpp.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_DRAG_DATA_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_DRAG_DATA_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include -#include "include/cef_drag_data.h" -#include "include/capi/cef_drag_data_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefDragDataCToCpp - : public CefCToCpp { - public: - explicit CefDragDataCToCpp(cef_drag_data_t* str) - : CefCToCpp(str) {} - virtual ~CefDragDataCToCpp() {} - - // CefDragData methods - virtual bool IsLink() OVERRIDE; - virtual bool IsFragment() OVERRIDE; - virtual bool IsFile() OVERRIDE; - virtual CefString GetLinkURL() OVERRIDE; - virtual CefString GetLinkTitle() OVERRIDE; - virtual CefString GetLinkMetadata() OVERRIDE; - virtual CefString GetFragmentText() OVERRIDE; - virtual CefString GetFragmentHtml() OVERRIDE; - virtual CefString GetFragmentBaseURL() OVERRIDE; - virtual CefString GetFileName() OVERRIDE; - virtual bool GetFileNames(std::vector& names) OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_DRAG_DATA_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/drag_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/drag_handler_ctocpp.cc deleted file mode 100644 index f450259da..000000000 --- a/cef1/libcef_dll/ctocpp/drag_handler_ctocpp.cc +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/drag_data_cpptoc.h" -#include "libcef_dll/ctocpp/drag_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefDragHandlerCToCpp::OnDragStart(CefRefPtr browser, - CefRefPtr dragData, DragOperationsMask mask) { - if (CEF_MEMBER_MISSING(struct_, on_drag_start)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: dragData; type: refptr_diff - DCHECK(dragData.get()); - if (!dragData.get()) - return false; - - // Execute - int _retval = struct_->on_drag_start(struct_, - CefBrowserCppToC::Wrap(browser), - CefDragDataCppToC::Wrap(dragData), - mask); - - // Return type: bool - return _retval?true:false; -} - -bool CefDragHandlerCToCpp::OnDragEnter(CefRefPtr browser, - CefRefPtr dragData, DragOperationsMask mask) { - if (CEF_MEMBER_MISSING(struct_, on_drag_enter)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: dragData; type: refptr_diff - DCHECK(dragData.get()); - if (!dragData.get()) - return false; - - // Execute - int _retval = struct_->on_drag_enter(struct_, - CefBrowserCppToC::Wrap(browser), - CefDragDataCppToC::Wrap(dragData), - mask); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/drag_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/drag_handler_ctocpp.h deleted file mode 100644 index 268049bab..000000000 --- a/cef1/libcef_dll/ctocpp/drag_handler_ctocpp.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_DRAG_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_DRAG_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_drag_handler.h" -#include "include/capi/cef_drag_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefDragHandlerCToCpp - : public CefCToCpp { - public: - explicit CefDragHandlerCToCpp(cef_drag_handler_t* str) - : CefCToCpp( - str) {} - virtual ~CefDragHandlerCToCpp() {} - - // CefDragHandler methods - virtual bool OnDragStart(CefRefPtr browser, - CefRefPtr dragData, DragOperationsMask mask) OVERRIDE; - virtual bool OnDragEnter(CefRefPtr browser, - CefRefPtr dragData, DragOperationsMask mask) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_DRAG_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/find_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/find_handler_ctocpp.cc deleted file mode 100644 index 83dfc8229..000000000 --- a/cef1/libcef_dll/ctocpp/find_handler_ctocpp.cc +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/ctocpp/find_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefFindHandlerCToCpp::OnFindResult(CefRefPtr browser, - int identifier, int count, const CefRect& selectionRect, - int activeMatchOrdinal, bool finalUpdate) { - if (CEF_MEMBER_MISSING(struct_, on_find_result)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - - // Execute - struct_->on_find_result(struct_, - CefBrowserCppToC::Wrap(browser), - identifier, - count, - &selectionRect, - activeMatchOrdinal, - finalUpdate); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/find_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/find_handler_ctocpp.h deleted file mode 100644 index 2e3e8bb56..000000000 --- a/cef1/libcef_dll/ctocpp/find_handler_ctocpp.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_FIND_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_FIND_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_find_handler.h" -#include "include/capi/cef_find_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefFindHandlerCToCpp - : public CefCToCpp { - public: - explicit CefFindHandlerCToCpp(cef_find_handler_t* str) - : CefCToCpp( - str) {} - virtual ~CefFindHandlerCToCpp() {} - - // CefFindHandler methods - virtual void OnFindResult(CefRefPtr browser, int identifier, - int count, const CefRect& selectionRect, int activeMatchOrdinal, - bool finalUpdate) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_FIND_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/focus_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/focus_handler_ctocpp.cc deleted file mode 100644 index 7104dbb1a..000000000 --- a/cef1/libcef_dll/ctocpp/focus_handler_ctocpp.cc +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/domnode_cpptoc.h" -#include "libcef_dll/cpptoc/frame_cpptoc.h" -#include "libcef_dll/ctocpp/focus_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefFocusHandlerCToCpp::OnTakeFocus(CefRefPtr browser, - bool next) { - if (CEF_MEMBER_MISSING(struct_, on_take_focus)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - - // Execute - struct_->on_take_focus(struct_, - CefBrowserCppToC::Wrap(browser), - next); -} - -bool CefFocusHandlerCToCpp::OnSetFocus(CefRefPtr browser, - FocusSource source) { - if (CEF_MEMBER_MISSING(struct_, on_set_focus)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - - // Execute - int _retval = struct_->on_set_focus(struct_, - CefBrowserCppToC::Wrap(browser), - source); - - // Return type: bool - return _retval?true:false; -} - -void CefFocusHandlerCToCpp::OnFocusedNodeChanged(CefRefPtr browser, - CefRefPtr frame, CefRefPtr node) { - if (CEF_MEMBER_MISSING(struct_, on_focused_node_changed)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Unverified params: frame, node - - // Execute - struct_->on_focused_node_changed(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - CefDOMNodeCppToC::Wrap(node)); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/focus_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/focus_handler_ctocpp.h deleted file mode 100644 index 76e20c4b2..000000000 --- a/cef1/libcef_dll/ctocpp/focus_handler_ctocpp.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_FOCUS_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_FOCUS_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_focus_handler.h" -#include "include/capi/cef_focus_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefFocusHandlerCToCpp - : public CefCToCpp { - public: - explicit CefFocusHandlerCToCpp(cef_focus_handler_t* str) - : CefCToCpp( - str) {} - virtual ~CefFocusHandlerCToCpp() {} - - // CefFocusHandler methods - virtual void OnTakeFocus(CefRefPtr browser, bool next) OVERRIDE; - virtual bool OnSetFocus(CefRefPtr browser, - FocusSource source) OVERRIDE; - virtual void OnFocusedNodeChanged(CefRefPtr browser, - CefRefPtr frame, CefRefPtr node) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_FOCUS_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/frame_ctocpp.cc b/cef1/libcef_dll/ctocpp/frame_ctocpp.cc deleted file mode 100644 index 316a24d93..000000000 --- a/cef1/libcef_dll/ctocpp/frame_ctocpp.cc +++ /dev/null @@ -1,368 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/domvisitor_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/frame_ctocpp.h" -#include "libcef_dll/ctocpp/request_ctocpp.h" -#include "libcef_dll/ctocpp/stream_reader_ctocpp.h" -#include "libcef_dll/ctocpp/v8context_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefFrameCToCpp::Undo() { - if (CEF_MEMBER_MISSING(struct_, undo)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->undo(struct_); -} - -void CefFrameCToCpp::Redo() { - if (CEF_MEMBER_MISSING(struct_, redo)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->redo(struct_); -} - -void CefFrameCToCpp::Cut() { - if (CEF_MEMBER_MISSING(struct_, cut)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->cut(struct_); -} - -void CefFrameCToCpp::Copy() { - if (CEF_MEMBER_MISSING(struct_, copy)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->copy(struct_); -} - -void CefFrameCToCpp::Paste() { - if (CEF_MEMBER_MISSING(struct_, paste)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->paste(struct_); -} - -void CefFrameCToCpp::Delete() { - if (CEF_MEMBER_MISSING(struct_, del)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->del(struct_); -} - -void CefFrameCToCpp::SelectAll() { - if (CEF_MEMBER_MISSING(struct_, select_all)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->select_all(struct_); -} - -void CefFrameCToCpp::Print() { - if (CEF_MEMBER_MISSING(struct_, print)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->print(struct_); -} - -void CefFrameCToCpp::ViewSource() { - if (CEF_MEMBER_MISSING(struct_, view_source)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->view_source(struct_); -} - -CefString CefFrameCToCpp::GetSource() { - if (CEF_MEMBER_MISSING(struct_, get_source)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_source(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefFrameCToCpp::GetText() { - if (CEF_MEMBER_MISSING(struct_, get_text)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_text(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -void CefFrameCToCpp::LoadRequest(CefRefPtr request) { - if (CEF_MEMBER_MISSING(struct_, load_request)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: request; type: refptr_same - DCHECK(request.get()); - if (!request.get()) - return; - - // Execute - struct_->load_request(struct_, - CefRequestCToCpp::Unwrap(request)); -} - -void CefFrameCToCpp::LoadURL(const CefString& url) { - if (CEF_MEMBER_MISSING(struct_, load_url)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return; - - // Execute - struct_->load_url(struct_, - url.GetStruct()); -} - -void CefFrameCToCpp::LoadString(const CefString& string_val, - const CefString& url) { - if (CEF_MEMBER_MISSING(struct_, load_string)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: string_val; type: string_byref_const - DCHECK(!string_val.empty()); - if (string_val.empty()) - return; - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return; - - // Execute - struct_->load_string(struct_, - string_val.GetStruct(), - url.GetStruct()); -} - -void CefFrameCToCpp::LoadStream(CefRefPtr stream, - const CefString& url) { - if (CEF_MEMBER_MISSING(struct_, load_stream)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: stream; type: refptr_same - DCHECK(stream.get()); - if (!stream.get()) - return; - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return; - - // Execute - struct_->load_stream(struct_, - CefStreamReaderCToCpp::Unwrap(stream), - url.GetStruct()); -} - -void CefFrameCToCpp::ExecuteJavaScript(const CefString& jsCode, - const CefString& scriptUrl, int startLine) { - if (CEF_MEMBER_MISSING(struct_, execute_java_script)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: jsCode; type: string_byref_const - DCHECK(!jsCode.empty()); - if (jsCode.empty()) - return; - // Unverified params: scriptUrl - - // Execute - struct_->execute_java_script(struct_, - jsCode.GetStruct(), - scriptUrl.GetStruct(), - startLine); -} - -bool CefFrameCToCpp::IsMain() { - if (CEF_MEMBER_MISSING(struct_, is_main)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_main(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefFrameCToCpp::IsFocused() { - if (CEF_MEMBER_MISSING(struct_, is_focused)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_focused(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefString CefFrameCToCpp::GetName() { - if (CEF_MEMBER_MISSING(struct_, get_name)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_name(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -int64 CefFrameCToCpp::GetIdentifier() { - if (CEF_MEMBER_MISSING(struct_, get_identifier)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int64 _retval = struct_->get_identifier(struct_); - - // Return type: simple - return _retval; -} - -CefRefPtr CefFrameCToCpp::GetParent() { - if (CEF_MEMBER_MISSING(struct_, get_parent)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_frame_t* _retval = struct_->get_parent(struct_); - - // Return type: refptr_same - return CefFrameCToCpp::Wrap(_retval); -} - -CefString CefFrameCToCpp::GetURL() { - if (CEF_MEMBER_MISSING(struct_, get_url)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_url(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefRefPtr CefFrameCToCpp::GetBrowser() { - if (CEF_MEMBER_MISSING(struct_, get_browser)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_browser_t* _retval = struct_->get_browser(struct_); - - // Return type: refptr_same - return CefBrowserCToCpp::Wrap(_retval); -} - -void CefFrameCToCpp::VisitDOM(CefRefPtr visitor) { - if (CEF_MEMBER_MISSING(struct_, visit_dom)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: visitor; type: refptr_diff - DCHECK(visitor.get()); - if (!visitor.get()) - return; - - // Execute - struct_->visit_dom(struct_, - CefDOMVisitorCppToC::Wrap(visitor)); -} - -CefRefPtr CefFrameCToCpp::GetV8Context() { - if (CEF_MEMBER_MISSING(struct_, get_v8context)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8context_t* _retval = struct_->get_v8context(struct_); - - // Return type: refptr_same - return CefV8ContextCToCpp::Wrap(_retval); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = - 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/frame_ctocpp.h b/cef1/libcef_dll/ctocpp/frame_ctocpp.h deleted file mode 100644 index 5a19db9f4..000000000 --- a/cef1/libcef_dll/ctocpp/frame_ctocpp.h +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_FRAME_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_FRAME_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_frame.h" -#include "include/capi/cef_frame_capi.h" -#include "include/cef_browser.h" -#include "include/capi/cef_browser_capi.h" -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefFrameCToCpp - : public CefCToCpp { - public: - explicit CefFrameCToCpp(cef_frame_t* str) - : CefCToCpp(str) {} - virtual ~CefFrameCToCpp() {} - - // CefFrame methods - virtual void Undo() OVERRIDE; - virtual void Redo() OVERRIDE; - virtual void Cut() OVERRIDE; - virtual void Copy() OVERRIDE; - virtual void Paste() OVERRIDE; - virtual void Delete() OVERRIDE; - virtual void SelectAll() OVERRIDE; - virtual void Print() OVERRIDE; - virtual void ViewSource() OVERRIDE; - virtual CefString GetSource() OVERRIDE; - virtual CefString GetText() OVERRIDE; - virtual void LoadRequest(CefRefPtr request) OVERRIDE; - virtual void LoadURL(const CefString& url) OVERRIDE; - virtual void LoadString(const CefString& string_val, - const CefString& url) OVERRIDE; - virtual void LoadStream(CefRefPtr stream, - const CefString& url) OVERRIDE; - virtual void ExecuteJavaScript(const CefString& jsCode, - const CefString& scriptUrl, int startLine) OVERRIDE; - virtual bool IsMain() OVERRIDE; - virtual bool IsFocused() OVERRIDE; - virtual CefString GetName() OVERRIDE; - virtual int64 GetIdentifier() OVERRIDE; - virtual CefRefPtr GetParent() OVERRIDE; - virtual CefString GetURL() OVERRIDE; - virtual CefRefPtr GetBrowser() OVERRIDE; - virtual void VisitDOM(CefRefPtr visitor) OVERRIDE; - virtual CefRefPtr GetV8Context() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_FRAME_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/geolocation_callback_ctocpp.cc b/cef1/libcef_dll/ctocpp/geolocation_callback_ctocpp.cc deleted file mode 100644 index b0909cb3d..000000000 --- a/cef1/libcef_dll/ctocpp/geolocation_callback_ctocpp.cc +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/geolocation_callback_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefGeolocationCallbackCToCpp::Continue(bool allow) { - if (CEF_MEMBER_MISSING(struct_, cont)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->cont(struct_, - allow); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/geolocation_callback_ctocpp.h b/cef1/libcef_dll/ctocpp/geolocation_callback_ctocpp.h deleted file mode 100644 index 52d17a9ca..000000000 --- a/cef1/libcef_dll/ctocpp/geolocation_callback_ctocpp.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_GEOLOCATION_CALLBACK_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_GEOLOCATION_CALLBACK_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_geolocation_handler.h" -#include "include/capi/cef_geolocation_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefGeolocationCallbackCToCpp - : public CefCToCpp { - public: - explicit CefGeolocationCallbackCToCpp(cef_geolocation_callback_t* str) - : CefCToCpp(str) {} - virtual ~CefGeolocationCallbackCToCpp() {} - - // CefGeolocationCallback methods - virtual void Continue(bool allow) OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_GEOLOCATION_CALLBACK_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/geolocation_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/geolocation_handler_ctocpp.cc deleted file mode 100644 index 19aa6d70f..000000000 --- a/cef1/libcef_dll/ctocpp/geolocation_handler_ctocpp.cc +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/geolocation_callback_cpptoc.h" -#include "libcef_dll/ctocpp/geolocation_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefGeolocationHandlerCToCpp::OnRequestGeolocationPermission( - CefRefPtr browser, const CefString& requesting_url, - int request_id, CefRefPtr callback) { - if (CEF_MEMBER_MISSING(struct_, on_request_geolocation_permission)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Verify param: requesting_url; type: string_byref_const - DCHECK(!requesting_url.empty()); - if (requesting_url.empty()) - return; - // Verify param: callback; type: refptr_diff - DCHECK(callback.get()); - if (!callback.get()) - return; - - // Execute - struct_->on_request_geolocation_permission(struct_, - CefBrowserCppToC::Wrap(browser), - requesting_url.GetStruct(), - request_id, - CefGeolocationCallbackCppToC::Wrap(callback)); -} - -void CefGeolocationHandlerCToCpp::OnCancelGeolocationPermission( - CefRefPtr browser, const CefString& requesting_url, - int request_id) { - if (CEF_MEMBER_MISSING(struct_, on_cancel_geolocation_permission)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Verify param: requesting_url; type: string_byref_const - DCHECK(!requesting_url.empty()); - if (requesting_url.empty()) - return; - - // Execute - struct_->on_cancel_geolocation_permission(struct_, - CefBrowserCppToC::Wrap(browser), - requesting_url.GetStruct(), - request_id); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/geolocation_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/geolocation_handler_ctocpp.h deleted file mode 100644 index 3e35292aa..000000000 --- a/cef1/libcef_dll/ctocpp/geolocation_handler_ctocpp.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_GEOLOCATION_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_GEOLOCATION_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_geolocation_handler.h" -#include "include/capi/cef_geolocation_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefGeolocationHandlerCToCpp - : public CefCToCpp { - public: - explicit CefGeolocationHandlerCToCpp(cef_geolocation_handler_t* str) - : CefCToCpp(str) {} - virtual ~CefGeolocationHandlerCToCpp() {} - - // CefGeolocationHandler methods - virtual void OnRequestGeolocationPermission(CefRefPtr browser, - const CefString& requesting_url, int request_id, - CefRefPtr callback) OVERRIDE; - virtual void OnCancelGeolocationPermission(CefRefPtr browser, - const CefString& requesting_url, int request_id) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_GEOLOCATION_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/get_geolocation_callback_ctocpp.cc b/cef1/libcef_dll/ctocpp/get_geolocation_callback_ctocpp.cc deleted file mode 100644 index b90fcfbbf..000000000 --- a/cef1/libcef_dll/ctocpp/get_geolocation_callback_ctocpp.cc +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/get_geolocation_callback_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefGetGeolocationCallbackCToCpp::OnLocationUpdate( - const CefGeoposition& position) { - if (CEF_MEMBER_MISSING(struct_, on_location_update)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->on_location_update(struct_, - &position); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = - 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/get_geolocation_callback_ctocpp.h b/cef1/libcef_dll/ctocpp/get_geolocation_callback_ctocpp.h deleted file mode 100644 index 3cab47b3f..000000000 --- a/cef1/libcef_dll/ctocpp/get_geolocation_callback_ctocpp.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_GET_GEOLOCATION_CALLBACK_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_GET_GEOLOCATION_CALLBACK_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_geolocation.h" -#include "include/capi/cef_geolocation_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefGetGeolocationCallbackCToCpp - : public CefCToCpp { - public: - explicit CefGetGeolocationCallbackCToCpp(cef_get_geolocation_callback_t* str) - : CefCToCpp(str) {} - virtual ~CefGetGeolocationCallbackCToCpp() {} - - // CefGetGeolocationCallback methods - virtual void OnLocationUpdate(const CefGeoposition& position) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_GET_GEOLOCATION_CALLBACK_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/jsdialog_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/jsdialog_handler_ctocpp.cc deleted file mode 100644 index 80a0a93d0..000000000 --- a/cef1/libcef_dll/ctocpp/jsdialog_handler_ctocpp.cc +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/frame_cpptoc.h" -#include "libcef_dll/ctocpp/jsdialog_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefJSDialogHandlerCToCpp::OnJSAlert(CefRefPtr browser, - CefRefPtr frame, const CefString& message) { - if (CEF_MEMBER_MISSING(struct_, on_jsalert)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return false; - // Unverified params: message - - // Execute - int _retval = struct_->on_jsalert(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - message.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - -bool CefJSDialogHandlerCToCpp::OnJSConfirm(CefRefPtr browser, - CefRefPtr frame, const CefString& message, bool& retval) { - if (CEF_MEMBER_MISSING(struct_, on_jsconfirm)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return false; - // Unverified params: message - - // Translate param: retval; type: bool_byref - int retvalInt = retval; - - // Execute - int _retval = struct_->on_jsconfirm(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - message.GetStruct(), - &retvalInt); - - // Restore param:retval; type: bool_byref - retval = retvalInt?true:false; - - // Return type: bool - return _retval?true:false; -} - -bool CefJSDialogHandlerCToCpp::OnJSPrompt(CefRefPtr browser, - CefRefPtr frame, const CefString& message, - const CefString& defaultValue, bool& retval, CefString& result) { - if (CEF_MEMBER_MISSING(struct_, on_jsprompt)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return false; - // Unverified params: message, defaultValue - - // Translate param: retval; type: bool_byref - int retvalInt = retval; - - // Execute - int _retval = struct_->on_jsprompt(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - message.GetStruct(), - defaultValue.GetStruct(), - &retvalInt, - result.GetWritableStruct()); - - // Restore param:retval; type: bool_byref - retval = retvalInt?true:false; - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/jsdialog_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/jsdialog_handler_ctocpp.h deleted file mode 100644 index e762e35d9..000000000 --- a/cef1/libcef_dll/ctocpp/jsdialog_handler_ctocpp.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_JSDIALOG_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_JSDIALOG_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_jsdialog_handler.h" -#include "include/capi/cef_jsdialog_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefJSDialogHandlerCToCpp - : public CefCToCpp { - public: - explicit CefJSDialogHandlerCToCpp(cef_jsdialog_handler_t* str) - : CefCToCpp(str) {} - virtual ~CefJSDialogHandlerCToCpp() {} - - // CefJSDialogHandler methods - virtual bool OnJSAlert(CefRefPtr browser, - CefRefPtr frame, const CefString& message) OVERRIDE; - virtual bool OnJSConfirm(CefRefPtr browser, - CefRefPtr frame, const CefString& message, - bool& retval) OVERRIDE; - virtual bool OnJSPrompt(CefRefPtr browser, - CefRefPtr frame, const CefString& message, - const CefString& defaultValue, bool& retval, - CefString& result) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_JSDIALOG_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/keyboard_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/keyboard_handler_ctocpp.cc deleted file mode 100644 index 677d5c242..000000000 --- a/cef1/libcef_dll/ctocpp/keyboard_handler_ctocpp.cc +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/ctocpp/keyboard_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefKeyboardHandlerCToCpp::OnKeyEvent(CefRefPtr browser, - KeyEventType type, int code, int modifiers, bool isSystemKey, - bool isAfterJavaScript) { - if (CEF_MEMBER_MISSING(struct_, on_key_event)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - - // Execute - int _retval = struct_->on_key_event(struct_, - CefBrowserCppToC::Wrap(browser), - type, - code, - modifiers, - isSystemKey, - isAfterJavaScript); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/keyboard_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/keyboard_handler_ctocpp.h deleted file mode 100644 index b261677f0..000000000 --- a/cef1/libcef_dll/ctocpp/keyboard_handler_ctocpp.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_KEYBOARD_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_KEYBOARD_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_keyboard_handler.h" -#include "include/capi/cef_keyboard_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefKeyboardHandlerCToCpp - : public CefCToCpp { - public: - explicit CefKeyboardHandlerCToCpp(cef_keyboard_handler_t* str) - : CefCToCpp(str) {} - virtual ~CefKeyboardHandlerCToCpp() {} - - // CefKeyboardHandler methods - virtual bool OnKeyEvent(CefRefPtr browser, KeyEventType type, - int code, int modifiers, bool isSystemKey, - bool isAfterJavaScript) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_KEYBOARD_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/life_span_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/life_span_handler_ctocpp.cc deleted file mode 100644 index fd1382eaa..000000000 --- a/cef1/libcef_dll/ctocpp/life_span_handler_ctocpp.cc +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/ctocpp/client_ctocpp.h" -#include "libcef_dll/ctocpp/life_span_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefLifeSpanHandlerCToCpp::OnBeforePopup( - CefRefPtr parentBrowser, const CefPopupFeatures& popupFeatures, - CefWindowInfo& windowInfo, const CefString& url, - CefRefPtr& client, CefBrowserSettings& settings) { - if (CEF_MEMBER_MISSING(struct_, on_before_popup)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: parentBrowser; type: refptr_diff - DCHECK(parentBrowser.get()); - if (!parentBrowser.get()) - return false; - // Unverified params: url - - // Translate param: client; type: refptr_same_byref - cef_client_t* clientStruct = NULL; - if (client.get()) - clientStruct = CefClientCToCpp::Unwrap(client); - cef_client_t* clientOrig = clientStruct; - - // Execute - int _retval = struct_->on_before_popup(struct_, - CefBrowserCppToC::Wrap(parentBrowser), - &popupFeatures, - &windowInfo, - url.GetStruct(), - &clientStruct, - &settings); - - // Restore param:client; type: refptr_same_byref - if (clientStruct) { - if (clientStruct != clientOrig) { - client = CefClientCToCpp::Wrap(clientStruct); - } - } else { - client = NULL; - } - - // Return type: bool - return _retval?true:false; -} - -void CefLifeSpanHandlerCToCpp::OnAfterCreated(CefRefPtr browser) { - if (CEF_MEMBER_MISSING(struct_, on_after_created)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - - // Execute - struct_->on_after_created(struct_, - CefBrowserCppToC::Wrap(browser)); -} - -bool CefLifeSpanHandlerCToCpp::RunModal(CefRefPtr browser) { - if (CEF_MEMBER_MISSING(struct_, run_modal)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - - // Execute - int _retval = struct_->run_modal(struct_, - CefBrowserCppToC::Wrap(browser)); - - // Return type: bool - return _retval?true:false; -} - -bool CefLifeSpanHandlerCToCpp::DoClose(CefRefPtr browser) { - if (CEF_MEMBER_MISSING(struct_, do_close)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - - // Execute - int _retval = struct_->do_close(struct_, - CefBrowserCppToC::Wrap(browser)); - - // Return type: bool - return _retval?true:false; -} - -void CefLifeSpanHandlerCToCpp::OnBeforeClose(CefRefPtr browser) { - if (CEF_MEMBER_MISSING(struct_, on_before_close)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - - // Execute - struct_->on_before_close(struct_, - CefBrowserCppToC::Wrap(browser)); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/life_span_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/life_span_handler_ctocpp.h deleted file mode 100644 index ebcc21c53..000000000 --- a/cef1/libcef_dll/ctocpp/life_span_handler_ctocpp.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_LIFE_SPAN_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_LIFE_SPAN_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_life_span_handler.h" -#include "include/capi/cef_life_span_handler_capi.h" -#include "include/cef_client.h" -#include "include/capi/cef_client_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefLifeSpanHandlerCToCpp - : public CefCToCpp { - public: - explicit CefLifeSpanHandlerCToCpp(cef_life_span_handler_t* str) - : CefCToCpp(str) {} - virtual ~CefLifeSpanHandlerCToCpp() {} - - // CefLifeSpanHandler methods - virtual bool OnBeforePopup(CefRefPtr parentBrowser, - const CefPopupFeatures& popupFeatures, CefWindowInfo& windowInfo, - const CefString& url, CefRefPtr& client, - CefBrowserSettings& settings) OVERRIDE; - virtual void OnAfterCreated(CefRefPtr browser) OVERRIDE; - virtual bool RunModal(CefRefPtr browser) OVERRIDE; - virtual bool DoClose(CefRefPtr browser) OVERRIDE; - virtual void OnBeforeClose(CefRefPtr browser) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_LIFE_SPAN_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/load_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/load_handler_ctocpp.cc deleted file mode 100644 index e887a33c0..000000000 --- a/cef1/libcef_dll/ctocpp/load_handler_ctocpp.cc +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/frame_cpptoc.h" -#include "libcef_dll/ctocpp/load_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefLoadHandlerCToCpp::OnLoadStart(CefRefPtr browser, - CefRefPtr frame) { - if (CEF_MEMBER_MISSING(struct_, on_load_start)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return; - - // Execute - struct_->on_load_start(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame)); -} - -void CefLoadHandlerCToCpp::OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, int httpStatusCode) { - if (CEF_MEMBER_MISSING(struct_, on_load_end)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return; - - // Execute - struct_->on_load_end(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - httpStatusCode); -} - -bool CefLoadHandlerCToCpp::OnLoadError(CefRefPtr browser, - CefRefPtr frame, ErrorCode errorCode, const CefString& failedUrl, - CefString& errorText) { - if (CEF_MEMBER_MISSING(struct_, on_load_error)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return false; - // Verify param: failedUrl; type: string_byref_const - DCHECK(!failedUrl.empty()); - if (failedUrl.empty()) - return false; - - // Execute - int _retval = struct_->on_load_error(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - errorCode, - failedUrl.GetStruct(), - errorText.GetWritableStruct()); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/load_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/load_handler_ctocpp.h deleted file mode 100644 index 6fcaeb8a2..000000000 --- a/cef1/libcef_dll/ctocpp/load_handler_ctocpp.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_LOAD_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_LOAD_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_load_handler.h" -#include "include/capi/cef_load_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefLoadHandlerCToCpp - : public CefCToCpp { - public: - explicit CefLoadHandlerCToCpp(cef_load_handler_t* str) - : CefCToCpp( - str) {} - virtual ~CefLoadHandlerCToCpp() {} - - // CefLoadHandler methods - virtual void OnLoadStart(CefRefPtr browser, - CefRefPtr frame) OVERRIDE; - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, int httpStatusCode) OVERRIDE; - virtual bool OnLoadError(CefRefPtr browser, - CefRefPtr frame, ErrorCode errorCode, - const CefString& failedUrl, CefString& errorText) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_LOAD_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/menu_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/menu_handler_ctocpp.cc deleted file mode 100644 index 9807d8c6e..000000000 --- a/cef1/libcef_dll/ctocpp/menu_handler_ctocpp.cc +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/ctocpp/menu_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefMenuHandlerCToCpp::OnBeforeMenu(CefRefPtr browser, - const CefMenuInfo& menuInfo) { - if (CEF_MEMBER_MISSING(struct_, on_before_menu)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - - // Execute - int _retval = struct_->on_before_menu(struct_, - CefBrowserCppToC::Wrap(browser), - &menuInfo); - - // Return type: bool - return _retval?true:false; -} - -void CefMenuHandlerCToCpp::GetMenuLabel(CefRefPtr browser, - MenuId menuId, CefString& label) { - if (CEF_MEMBER_MISSING(struct_, get_menu_label)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - - // Execute - struct_->get_menu_label(struct_, - CefBrowserCppToC::Wrap(browser), - menuId, - label.GetWritableStruct()); -} - -bool CefMenuHandlerCToCpp::OnMenuAction(CefRefPtr browser, - MenuId menuId) { - if (CEF_MEMBER_MISSING(struct_, on_menu_action)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - - // Execute - int _retval = struct_->on_menu_action(struct_, - CefBrowserCppToC::Wrap(browser), - menuId); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/menu_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/menu_handler_ctocpp.h deleted file mode 100644 index 733ef8a31..000000000 --- a/cef1/libcef_dll/ctocpp/menu_handler_ctocpp.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_MENU_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_MENU_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_menu_handler.h" -#include "include/capi/cef_menu_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefMenuHandlerCToCpp - : public CefCToCpp { - public: - explicit CefMenuHandlerCToCpp(cef_menu_handler_t* str) - : CefCToCpp( - str) {} - virtual ~CefMenuHandlerCToCpp() {} - - // CefMenuHandler methods - virtual bool OnBeforeMenu(CefRefPtr browser, - const CefMenuInfo& menuInfo) OVERRIDE; - virtual void GetMenuLabel(CefRefPtr browser, MenuId menuId, - CefString& label) OVERRIDE; - virtual bool OnMenuAction(CefRefPtr browser, - MenuId menuId) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_MENU_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/permission_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/permission_handler_ctocpp.cc deleted file mode 100644 index 2c713018f..000000000 --- a/cef1/libcef_dll/ctocpp/permission_handler_ctocpp.cc +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/frame_cpptoc.h" -#include "libcef_dll/ctocpp/permission_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefPermissionHandlerCToCpp::OnBeforeScriptExtensionLoad( - CefRefPtr browser, CefRefPtr frame, - const CefString& extensionName) { - if (CEF_MEMBER_MISSING(struct_, on_before_script_extension_load)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return false; - // Verify param: extensionName; type: string_byref_const - DCHECK(!extensionName.empty()); - if (extensionName.empty()) - return false; - - // Execute - int _retval = struct_->on_before_script_extension_load(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - extensionName.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/permission_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/permission_handler_ctocpp.h deleted file mode 100644 index 58378f36f..000000000 --- a/cef1/libcef_dll/ctocpp/permission_handler_ctocpp.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_PERMISSION_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_PERMISSION_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_permission_handler.h" -#include "include/capi/cef_permission_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefPermissionHandlerCToCpp - : public CefCToCpp { - public: - explicit CefPermissionHandlerCToCpp(cef_permission_handler_t* str) - : CefCToCpp(str) {} - virtual ~CefPermissionHandlerCToCpp() {} - - // CefPermissionHandler methods - virtual bool OnBeforeScriptExtensionLoad(CefRefPtr browser, - CefRefPtr frame, const CefString& extensionName) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_PERMISSION_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/post_data_ctocpp.cc b/cef1/libcef_dll/ctocpp/post_data_ctocpp.cc deleted file mode 100644 index 92c424e42..000000000 --- a/cef1/libcef_dll/ctocpp/post_data_ctocpp.cc +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/post_data_ctocpp.h" -#include "libcef_dll/ctocpp/post_data_element_ctocpp.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefPostData::CreatePostData() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_post_data_t* _retval = cef_post_data_create(); - - // Return type: refptr_same - return CefPostDataCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -size_t CefPostDataCToCpp::GetElementCount() { - if (CEF_MEMBER_MISSING(struct_, get_element_count)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - size_t _retval = struct_->get_element_count(struct_); - - // Return type: simple - return _retval; -} - -void CefPostDataCToCpp::GetElements(ElementVector& elements) { - if (CEF_MEMBER_MISSING(struct_, get_elements)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: elements; type: refptr_vec_same_byref - size_t elementsSize = elements.size(); - size_t elementsCount = std::max(GetElementCount(), elementsSize); - cef_post_data_element_t** elementsList = NULL; - if (elementsCount > 0) { - elementsList = new cef_post_data_element_t*[elementsCount]; - DCHECK(elementsList); - if (elementsList) { - memset(elementsList, 0, sizeof(cef_post_data_element_t*)*elementsCount); - } - if (elementsList && elementsSize > 0) { - for (size_t i = 0; i < elementsSize; ++i) { - elementsList[i] = CefPostDataElementCToCpp::Unwrap(elements[i]); - } - } - } - - // Execute - struct_->get_elements(struct_, - &elementsCount, - elementsList); - - // Restore param:elements; type: refptr_vec_same_byref - elements.clear(); - if (elementsCount > 0 && elementsList) { - for (size_t i = 0; i < elementsCount; ++i) { - elements.push_back(CefPostDataElementCToCpp::Wrap(elementsList[i])); - } - delete [] elementsList; - } -} - -bool CefPostDataCToCpp::RemoveElement(CefRefPtr element) { - if (CEF_MEMBER_MISSING(struct_, remove_element)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: element; type: refptr_same - DCHECK(element.get()); - if (!element.get()) - return false; - - // Execute - int _retval = struct_->remove_element(struct_, - CefPostDataElementCToCpp::Unwrap(element)); - - // Return type: bool - return _retval?true:false; -} - -bool CefPostDataCToCpp::AddElement(CefRefPtr element) { - if (CEF_MEMBER_MISSING(struct_, add_element)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: element; type: refptr_same - DCHECK(element.get()); - if (!element.get()) - return false; - - // Execute - int _retval = struct_->add_element(struct_, - CefPostDataElementCToCpp::Unwrap(element)); - - // Return type: bool - return _retval?true:false; -} - -void CefPostDataCToCpp::RemoveElements() { - if (CEF_MEMBER_MISSING(struct_, remove_elements)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->remove_elements(struct_); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/post_data_ctocpp.h b/cef1/libcef_dll/ctocpp/post_data_ctocpp.h deleted file mode 100644 index 2f6e7e1e3..000000000 --- a/cef1/libcef_dll/ctocpp/post_data_ctocpp.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_POST_DATA_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_POST_DATA_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_request.h" -#include "include/capi/cef_request_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefPostDataCToCpp - : public CefCToCpp { - public: - explicit CefPostDataCToCpp(cef_post_data_t* str) - : CefCToCpp(str) {} - virtual ~CefPostDataCToCpp() {} - - // CefPostData methods - virtual size_t GetElementCount() OVERRIDE; - virtual void GetElements(ElementVector& elements) OVERRIDE; - virtual bool RemoveElement(CefRefPtr element) OVERRIDE; - virtual bool AddElement(CefRefPtr element) OVERRIDE; - virtual void RemoveElements() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_POST_DATA_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/post_data_element_ctocpp.cc b/cef1/libcef_dll/ctocpp/post_data_element_ctocpp.cc deleted file mode 100644 index d578e6e50..000000000 --- a/cef1/libcef_dll/ctocpp/post_data_element_ctocpp.cc +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/post_data_element_ctocpp.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefPostDataElement::CreatePostDataElement() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_post_data_element_t* _retval = cef_post_data_element_create(); - - // Return type: refptr_same - return CefPostDataElementCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefPostDataElementCToCpp::SetToEmpty() { - if (CEF_MEMBER_MISSING(struct_, set_to_empty)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->set_to_empty(struct_); -} - -void CefPostDataElementCToCpp::SetToFile(const CefString& fileName) { - if (CEF_MEMBER_MISSING(struct_, set_to_file)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: fileName; type: string_byref_const - DCHECK(!fileName.empty()); - if (fileName.empty()) - return; - - // Execute - struct_->set_to_file(struct_, - fileName.GetStruct()); -} - -void CefPostDataElementCToCpp::SetToBytes(size_t size, const void* bytes) { - if (CEF_MEMBER_MISSING(struct_, set_to_bytes)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: bytes; type: simple_byaddr - DCHECK(bytes); - if (!bytes) - return; - - // Execute - struct_->set_to_bytes(struct_, - size, - bytes); -} - -CefPostDataElement::Type CefPostDataElementCToCpp::GetType() { - if (CEF_MEMBER_MISSING(struct_, get_type)) - return PDE_TYPE_EMPTY; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_postdataelement_type_t _retval = struct_->get_type(struct_); - - // Return type: simple - return _retval; -} - -CefString CefPostDataElementCToCpp::GetFile() { - if (CEF_MEMBER_MISSING(struct_, get_file)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_file(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -size_t CefPostDataElementCToCpp::GetBytesCount() { - if (CEF_MEMBER_MISSING(struct_, get_bytes_count)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - size_t _retval = struct_->get_bytes_count(struct_); - - // Return type: simple - return _retval; -} - -size_t CefPostDataElementCToCpp::GetBytes(size_t size, void* bytes) { - if (CEF_MEMBER_MISSING(struct_, get_bytes)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: bytes; type: simple_byaddr - DCHECK(bytes); - if (!bytes) - return 0; - - // Execute - size_t _retval = struct_->get_bytes(struct_, - size, - bytes); - - // Return type: simple - return _retval; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/post_data_element_ctocpp.h b/cef1/libcef_dll/ctocpp/post_data_element_ctocpp.h deleted file mode 100644 index c94e38686..000000000 --- a/cef1/libcef_dll/ctocpp/post_data_element_ctocpp.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_POST_DATA_ELEMENT_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_POST_DATA_ELEMENT_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_request.h" -#include "include/capi/cef_request_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefPostDataElementCToCpp - : public CefCToCpp { - public: - explicit CefPostDataElementCToCpp(cef_post_data_element_t* str) - : CefCToCpp(str) {} - virtual ~CefPostDataElementCToCpp() {} - - // CefPostDataElement methods - virtual void SetToEmpty() OVERRIDE; - virtual void SetToFile(const CefString& fileName) OVERRIDE; - virtual void SetToBytes(size_t size, const void* bytes) OVERRIDE; - virtual Type GetType() OVERRIDE; - virtual CefString GetFile() OVERRIDE; - virtual size_t GetBytesCount() OVERRIDE; - virtual size_t GetBytes(size_t size, void* bytes) OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_POST_DATA_ELEMENT_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/print_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/print_handler_ctocpp.cc deleted file mode 100644 index 6d9a5da9c..000000000 --- a/cef1/libcef_dll/ctocpp/print_handler_ctocpp.cc +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/frame_cpptoc.h" -#include "libcef_dll/ctocpp/print_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefPrintHandlerCToCpp::GetPrintOptions(CefRefPtr browser, - CefPrintOptions& printOptions) { - if (CEF_MEMBER_MISSING(struct_, get_print_options)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - - // Execute - int _retval = struct_->get_print_options(struct_, - CefBrowserCppToC::Wrap(browser), - &printOptions); - - // Return type: bool - return _retval?true:false; -} - -bool CefPrintHandlerCToCpp::GetPrintHeaderFooter(CefRefPtr browser, - CefRefPtr frame, const CefPrintInfo& printInfo, - const CefString& url, const CefString& title, int currentPage, - int maxPages, CefString& topLeft, CefString& topCenter, - CefString& topRight, CefString& bottomLeft, CefString& bottomCenter, - CefString& bottomRight) { - if (CEF_MEMBER_MISSING(struct_, get_print_header_footer)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return false; - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return false; - // Verify param: title; type: string_byref_const - DCHECK(!title.empty()); - if (title.empty()) - return false; - - // Execute - int _retval = struct_->get_print_header_footer(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - &printInfo, - url.GetStruct(), - title.GetStruct(), - currentPage, - maxPages, - topLeft.GetWritableStruct(), - topCenter.GetWritableStruct(), - topRight.GetWritableStruct(), - bottomLeft.GetWritableStruct(), - bottomCenter.GetWritableStruct(), - bottomRight.GetWritableStruct()); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/print_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/print_handler_ctocpp.h deleted file mode 100644 index d22eb28cd..000000000 --- a/cef1/libcef_dll/ctocpp/print_handler_ctocpp.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_PRINT_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_PRINT_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_print_handler.h" -#include "include/capi/cef_print_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefPrintHandlerCToCpp - : public CefCToCpp { - public: - explicit CefPrintHandlerCToCpp(cef_print_handler_t* str) - : CefCToCpp( - str) {} - virtual ~CefPrintHandlerCToCpp() {} - - // CefPrintHandler methods - virtual bool GetPrintOptions(CefRefPtr browser, - CefPrintOptions& printOptions) OVERRIDE; - virtual bool GetPrintHeaderFooter(CefRefPtr browser, - CefRefPtr frame, const CefPrintInfo& printInfo, - const CefString& url, const CefString& title, int currentPage, - int maxPages, CefString& topLeft, CefString& topCenter, - CefString& topRight, CefString& bottomLeft, CefString& bottomCenter, - CefString& bottomRight) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_PRINT_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/proxy_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/proxy_handler_ctocpp.cc deleted file mode 100644 index f93baa12c..000000000 --- a/cef1/libcef_dll/ctocpp/proxy_handler_ctocpp.cc +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/proxy_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefProxyHandlerCToCpp::GetProxyForUrl(const CefString& url, - CefProxyInfo& proxy_info) { - if (CEF_MEMBER_MISSING(struct_, get_proxy_for_url)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return; - - // Execute - struct_->get_proxy_for_url(struct_, - url.GetStruct(), - &proxy_info); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/proxy_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/proxy_handler_ctocpp.h deleted file mode 100644 index 4b87f1f61..000000000 --- a/cef1/libcef_dll/ctocpp/proxy_handler_ctocpp.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_PROXY_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_PROXY_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_proxy_handler.h" -#include "include/capi/cef_proxy_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefProxyHandlerCToCpp - : public CefCToCpp { - public: - explicit CefProxyHandlerCToCpp(cef_proxy_handler_t* str) - : CefCToCpp( - str) {} - virtual ~CefProxyHandlerCToCpp() {} - - // CefProxyHandler methods - virtual void GetProxyForUrl(const CefString& url, - CefProxyInfo& proxy_info) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_PROXY_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/read_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/read_handler_ctocpp.cc deleted file mode 100644 index b4066d609..000000000 --- a/cef1/libcef_dll/ctocpp/read_handler_ctocpp.cc +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/read_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -size_t CefReadHandlerCToCpp::Read(void* ptr, size_t size, size_t n) { - if (CEF_MEMBER_MISSING(struct_, read)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: ptr; type: simple_byaddr - DCHECK(ptr); - if (!ptr) - return 0; - - // Execute - size_t _retval = struct_->read(struct_, - ptr, - size, - n); - - // Return type: simple - return _retval; -} - -int CefReadHandlerCToCpp::Seek(int64 offset, int whence) { - if (CEF_MEMBER_MISSING(struct_, seek)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->seek(struct_, - offset, - whence); - - // Return type: simple - return _retval; -} - -int64 CefReadHandlerCToCpp::Tell() { - if (CEF_MEMBER_MISSING(struct_, tell)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int64 _retval = struct_->tell(struct_); - - // Return type: simple - return _retval; -} - -int CefReadHandlerCToCpp::Eof() { - if (CEF_MEMBER_MISSING(struct_, eof)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->eof(struct_); - - // Return type: simple - return _retval; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/read_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/read_handler_ctocpp.h deleted file mode 100644 index 06742cbdb..000000000 --- a/cef1/libcef_dll/ctocpp/read_handler_ctocpp.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_READ_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_READ_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_stream.h" -#include "include/capi/cef_stream_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefReadHandlerCToCpp - : public CefCToCpp { - public: - explicit CefReadHandlerCToCpp(cef_read_handler_t* str) - : CefCToCpp( - str) {} - virtual ~CefReadHandlerCToCpp() {} - - // CefReadHandler methods - virtual size_t Read(void* ptr, size_t size, size_t n) OVERRIDE; - virtual int Seek(int64 offset, int whence) OVERRIDE; - virtual int64 Tell() OVERRIDE; - virtual int Eof() OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_READ_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/render_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/render_handler_ctocpp.cc deleted file mode 100644 index 4d1f79190..000000000 --- a/cef1/libcef_dll/ctocpp/render_handler_ctocpp.cc +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/ctocpp/render_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefRenderHandlerCToCpp::GetViewRect(CefRefPtr browser, - CefRect& rect) { - if (CEF_MEMBER_MISSING(struct_, get_view_rect)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - - // Execute - int _retval = struct_->get_view_rect(struct_, - CefBrowserCppToC::Wrap(browser), - &rect); - - // Return type: bool - return _retval?true:false; -} - -bool CefRenderHandlerCToCpp::GetScreenRect(CefRefPtr browser, - CefRect& rect) { - if (CEF_MEMBER_MISSING(struct_, get_screen_rect)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - - // Execute - int _retval = struct_->get_screen_rect(struct_, - CefBrowserCppToC::Wrap(browser), - &rect); - - // Return type: bool - return _retval?true:false; -} - -bool CefRenderHandlerCToCpp::GetScreenPoint(CefRefPtr browser, - int viewX, int viewY, int& screenX, int& screenY) { - if (CEF_MEMBER_MISSING(struct_, get_screen_point)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - - // Execute - int _retval = struct_->get_screen_point(struct_, - CefBrowserCppToC::Wrap(browser), - viewX, - viewY, - &screenX, - &screenY); - - // Return type: bool - return _retval?true:false; -} - -void CefRenderHandlerCToCpp::OnPopupShow(CefRefPtr browser, - bool show) { - if (CEF_MEMBER_MISSING(struct_, on_popup_show)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - - // Execute - struct_->on_popup_show(struct_, - CefBrowserCppToC::Wrap(browser), - show); -} - -void CefRenderHandlerCToCpp::OnPopupSize(CefRefPtr browser, - const CefRect& rect) { - if (CEF_MEMBER_MISSING(struct_, on_popup_size)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - - // Execute - struct_->on_popup_size(struct_, - CefBrowserCppToC::Wrap(browser), - &rect); -} - -void CefRenderHandlerCToCpp::OnPaint(CefRefPtr browser, - PaintElementType type, const RectList& dirtyRects, const void* buffer) { - if (CEF_MEMBER_MISSING(struct_, on_paint)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Verify param: buffer; type: simple_byaddr - DCHECK(buffer); - if (!buffer) - return; - - // Translate param: dirtyRects; type: simple_vec_byref_const - const size_t dirtyRectsCount = dirtyRects.size(); - cef_rect_t* dirtyRectsList = NULL; - if (dirtyRectsCount > 0) { - dirtyRectsList = new cef_rect_t[dirtyRectsCount]; - DCHECK(dirtyRectsList); - if (dirtyRectsList) { - for (size_t i = 0; i < dirtyRectsCount; ++i) { - dirtyRectsList[i] = dirtyRects[i]; - } - } - } - - // Execute - struct_->on_paint(struct_, - CefBrowserCppToC::Wrap(browser), - type, - dirtyRectsCount, - dirtyRectsList, - buffer); - - // Restore param:dirtyRects; type: simple_vec_byref_const - if (dirtyRectsList) - delete [] dirtyRectsList; -} - -void CefRenderHandlerCToCpp::OnCursorChange(CefRefPtr browser, - CefCursorHandle cursor) { - if (CEF_MEMBER_MISSING(struct_, on_cursor_change)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - - // Execute - struct_->on_cursor_change(struct_, - CefBrowserCppToC::Wrap(browser), - cursor); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/render_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/render_handler_ctocpp.h deleted file mode 100644 index 6afe9645a..000000000 --- a/cef1/libcef_dll/ctocpp/render_handler_ctocpp.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_RENDER_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_RENDER_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_render_handler.h" -#include "include/capi/cef_render_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefRenderHandlerCToCpp - : public CefCToCpp { - public: - explicit CefRenderHandlerCToCpp(cef_render_handler_t* str) - : CefCToCpp(str) {} - virtual ~CefRenderHandlerCToCpp() {} - - // CefRenderHandler methods - virtual bool GetViewRect(CefRefPtr browser, - CefRect& rect) OVERRIDE; - virtual bool GetScreenRect(CefRefPtr browser, - CefRect& rect) OVERRIDE; - virtual bool GetScreenPoint(CefRefPtr browser, int viewX, - int viewY, int& screenX, int& screenY) OVERRIDE; - virtual void OnPopupShow(CefRefPtr browser, bool show) OVERRIDE; - virtual void OnPopupSize(CefRefPtr browser, - const CefRect& rect) OVERRIDE; - virtual void OnPaint(CefRefPtr browser, PaintElementType type, - const RectList& dirtyRects, const void* buffer) OVERRIDE; - virtual void OnCursorChange(CefRefPtr browser, - CefCursorHandle cursor) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_RENDER_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/request_ctocpp.cc b/cef1/libcef_dll/ctocpp/request_ctocpp.cc deleted file mode 100644 index b4b17a38f..000000000 --- a/cef1/libcef_dll/ctocpp/request_ctocpp.cc +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/post_data_ctocpp.h" -#include "libcef_dll/ctocpp/request_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefRequest::CreateRequest() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_request_t* _retval = cef_request_create(); - - // Return type: refptr_same - return CefRequestCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -CefString CefRequestCToCpp::GetURL() { - if (CEF_MEMBER_MISSING(struct_, get_url)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_url(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -void CefRequestCToCpp::SetURL(const CefString& url) { - if (CEF_MEMBER_MISSING(struct_, set_url)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return; - - // Execute - struct_->set_url(struct_, - url.GetStruct()); -} - -CefString CefRequestCToCpp::GetMethod() { - if (CEF_MEMBER_MISSING(struct_, get_method)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_method(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -void CefRequestCToCpp::SetMethod(const CefString& method) { - if (CEF_MEMBER_MISSING(struct_, set_method)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: method; type: string_byref_const - DCHECK(!method.empty()); - if (method.empty()) - return; - - // Execute - struct_->set_method(struct_, - method.GetStruct()); -} - -CefRefPtr CefRequestCToCpp::GetPostData() { - if (CEF_MEMBER_MISSING(struct_, get_post_data)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_post_data_t* _retval = struct_->get_post_data(struct_); - - // Return type: refptr_same - return CefPostDataCToCpp::Wrap(_retval); -} - -void CefRequestCToCpp::SetPostData(CefRefPtr postData) { - if (CEF_MEMBER_MISSING(struct_, set_post_data)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: postData; type: refptr_same - DCHECK(postData.get()); - if (!postData.get()) - return; - - // Execute - struct_->set_post_data(struct_, - CefPostDataCToCpp::Unwrap(postData)); -} - -void CefRequestCToCpp::GetHeaderMap(HeaderMap& headerMap) { - if (CEF_MEMBER_MISSING(struct_, get_header_map)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: headerMap; type: string_map_multi_byref - cef_string_multimap_t headerMapMultimap = cef_string_multimap_alloc(); - DCHECK(headerMapMultimap); - if (headerMapMultimap) - transfer_string_multimap_contents(headerMap, headerMapMultimap); - - // Execute - struct_->get_header_map(struct_, - headerMapMultimap); - - // Restore param:headerMap; type: string_map_multi_byref - if (headerMapMultimap) { - headerMap.clear(); - transfer_string_multimap_contents(headerMapMultimap, headerMap); - cef_string_multimap_free(headerMapMultimap); - } -} - -void CefRequestCToCpp::SetHeaderMap(const HeaderMap& headerMap) { - if (CEF_MEMBER_MISSING(struct_, set_header_map)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: headerMap; type: string_map_multi_byref_const - cef_string_multimap_t headerMapMultimap = cef_string_multimap_alloc(); - DCHECK(headerMapMultimap); - if (headerMapMultimap) - transfer_string_multimap_contents(headerMap, headerMapMultimap); - - // Execute - struct_->set_header_map(struct_, - headerMapMultimap); - - // Restore param:headerMap; type: string_map_multi_byref_const - if (headerMapMultimap) - cef_string_multimap_free(headerMapMultimap); -} - -void CefRequestCToCpp::Set(const CefString& url, const CefString& method, - CefRefPtr postData, const HeaderMap& headerMap) { - if (CEF_MEMBER_MISSING(struct_, set)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return; - // Verify param: method; type: string_byref_const - DCHECK(!method.empty()); - if (method.empty()) - return; - // Unverified params: postData - - // Translate param: headerMap; type: string_map_multi_byref_const - cef_string_multimap_t headerMapMultimap = cef_string_multimap_alloc(); - DCHECK(headerMapMultimap); - if (headerMapMultimap) - transfer_string_multimap_contents(headerMap, headerMapMultimap); - - // Execute - struct_->set(struct_, - url.GetStruct(), - method.GetStruct(), - CefPostDataCToCpp::Unwrap(postData), - headerMapMultimap); - - // Restore param:headerMap; type: string_map_multi_byref_const - if (headerMapMultimap) - cef_string_multimap_free(headerMapMultimap); -} - -CefRequest::RequestFlags CefRequestCToCpp::GetFlags() { - if (CEF_MEMBER_MISSING(struct_, get_flags)) - return WUR_FLAG_NONE; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_weburlrequest_flags_t _retval = struct_->get_flags(struct_); - - // Return type: simple - return _retval; -} - -void CefRequestCToCpp::SetFlags(RequestFlags flags) { - if (CEF_MEMBER_MISSING(struct_, set_flags)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->set_flags(struct_, - flags); -} - -CefString CefRequestCToCpp::GetFirstPartyForCookies() { - if (CEF_MEMBER_MISSING(struct_, get_first_party_for_cookies)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_first_party_for_cookies(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -void CefRequestCToCpp::SetFirstPartyForCookies(const CefString& url) { - if (CEF_MEMBER_MISSING(struct_, set_first_party_for_cookies)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return; - - // Execute - struct_->set_first_party_for_cookies(struct_, - url.GetStruct()); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/request_ctocpp.h b/cef1/libcef_dll/ctocpp/request_ctocpp.h deleted file mode 100644 index 6386a96bd..000000000 --- a/cef1/libcef_dll/ctocpp/request_ctocpp.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_REQUEST_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_REQUEST_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_request.h" -#include "include/capi/cef_request_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefRequestCToCpp - : public CefCToCpp { - public: - explicit CefRequestCToCpp(cef_request_t* str) - : CefCToCpp(str) {} - virtual ~CefRequestCToCpp() {} - - // CefRequest methods - virtual CefString GetURL() OVERRIDE; - virtual void SetURL(const CefString& url) OVERRIDE; - virtual CefString GetMethod() OVERRIDE; - virtual void SetMethod(const CefString& method) OVERRIDE; - virtual CefRefPtr GetPostData() OVERRIDE; - virtual void SetPostData(CefRefPtr postData) OVERRIDE; - virtual void GetHeaderMap(HeaderMap& headerMap) OVERRIDE; - virtual void SetHeaderMap(const HeaderMap& headerMap) OVERRIDE; - virtual void Set(const CefString& url, const CefString& method, - CefRefPtr postData, const HeaderMap& headerMap) OVERRIDE; - virtual RequestFlags GetFlags() OVERRIDE; - virtual void SetFlags(RequestFlags flags) OVERRIDE; - virtual CefString GetFirstPartyForCookies() OVERRIDE; - virtual void SetFirstPartyForCookies(const CefString& url) OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_REQUEST_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/request_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/request_handler_ctocpp.cc deleted file mode 100644 index 32f25d3ba..000000000 --- a/cef1/libcef_dll/ctocpp/request_handler_ctocpp.cc +++ /dev/null @@ -1,320 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/cookie_manager_cpptoc.h" -#include "libcef_dll/cpptoc/frame_cpptoc.h" -#include "libcef_dll/cpptoc/request_cpptoc.h" -#include "libcef_dll/cpptoc/response_cpptoc.h" -#include "libcef_dll/cpptoc/stream_reader_cpptoc.h" -#include "libcef_dll/ctocpp/content_filter_ctocpp.h" -#include "libcef_dll/ctocpp/download_handler_ctocpp.h" -#include "libcef_dll/ctocpp/request_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefRequestHandlerCToCpp::OnBeforeBrowse(CefRefPtr browser, - CefRefPtr frame, CefRefPtr request, NavType navType, - bool isRedirect) { - if (CEF_MEMBER_MISSING(struct_, on_before_browse)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return false; - // Verify param: request; type: refptr_diff - DCHECK(request.get()); - if (!request.get()) - return false; - - // Execute - int _retval = struct_->on_before_browse(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - CefRequestCppToC::Wrap(request), - navType, - isRedirect); - - // Return type: bool - return _retval?true:false; -} - -bool CefRequestHandlerCToCpp::OnBeforeResourceLoad( - CefRefPtr browser, CefRefPtr request, - CefString& redirectUrl, CefRefPtr& resourceStream, - CefRefPtr response, int loadFlags) { - if (CEF_MEMBER_MISSING(struct_, on_before_resource_load)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: request; type: refptr_diff - DCHECK(request.get()); - if (!request.get()) - return false; - // Verify param: response; type: refptr_diff - DCHECK(response.get()); - if (!response.get()) - return false; - - // Translate param: resourceStream; type: refptr_diff_byref - cef_stream_reader_t* resourceStreamStruct = NULL; - if (resourceStream.get()) - resourceStreamStruct = CefStreamReaderCppToC::Wrap(resourceStream); - cef_stream_reader_t* resourceStreamOrig = resourceStreamStruct; - - // Execute - int _retval = struct_->on_before_resource_load(struct_, - CefBrowserCppToC::Wrap(browser), - CefRequestCppToC::Wrap(request), - redirectUrl.GetWritableStruct(), - &resourceStreamStruct, - CefResponseCppToC::Wrap(response), - loadFlags); - - // Restore param:resourceStream; type: refptr_diff_byref - if (resourceStreamStruct) { - if (resourceStreamStruct != resourceStreamOrig) { - resourceStream = CefStreamReaderCppToC::Unwrap(resourceStreamStruct); - } - } else { - resourceStream = NULL; - } - - // Return type: bool - return _retval?true:false; -} - -void CefRequestHandlerCToCpp::OnResourceRedirect(CefRefPtr browser, - const CefString& old_url, CefString& new_url) { - if (CEF_MEMBER_MISSING(struct_, on_resource_redirect)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Verify param: old_url; type: string_byref_const - DCHECK(!old_url.empty()); - if (old_url.empty()) - return; - - // Execute - struct_->on_resource_redirect(struct_, - CefBrowserCppToC::Wrap(browser), - old_url.GetStruct(), - new_url.GetWritableStruct()); -} - -void CefRequestHandlerCToCpp::OnResourceResponse(CefRefPtr browser, - const CefString& url, CefRefPtr response, - CefRefPtr& filter) { - if (CEF_MEMBER_MISSING(struct_, on_resource_response)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return; - // Verify param: response; type: refptr_diff - DCHECK(response.get()); - if (!response.get()) - return; - - // Translate param: filter; type: refptr_same_byref - cef_content_filter_t* filterStruct = NULL; - if (filter.get()) - filterStruct = CefContentFilterCToCpp::Unwrap(filter); - cef_content_filter_t* filterOrig = filterStruct; - - // Execute - struct_->on_resource_response(struct_, - CefBrowserCppToC::Wrap(browser), - url.GetStruct(), - CefResponseCppToC::Wrap(response), - &filterStruct); - - // Restore param:filter; type: refptr_same_byref - if (filterStruct) { - if (filterStruct != filterOrig) { - filter = CefContentFilterCToCpp::Wrap(filterStruct); - } - } else { - filter = NULL; - } -} - -bool CefRequestHandlerCToCpp::OnProtocolExecution(CefRefPtr browser, - const CefString& url, bool& allowOSExecution) { - if (CEF_MEMBER_MISSING(struct_, on_protocol_execution)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return false; - - // Translate param: allowOSExecution; type: bool_byref - int allowOSExecutionInt = allowOSExecution; - - // Execute - int _retval = struct_->on_protocol_execution(struct_, - CefBrowserCppToC::Wrap(browser), - url.GetStruct(), - &allowOSExecutionInt); - - // Restore param:allowOSExecution; type: bool_byref - allowOSExecution = allowOSExecutionInt?true:false; - - // Return type: bool - return _retval?true:false; -} - -bool CefRequestHandlerCToCpp::GetDownloadHandler(CefRefPtr browser, - const CefString& mimeType, const CefString& fileName, int64 contentLength, - CefRefPtr& handler) { - if (CEF_MEMBER_MISSING(struct_, get_download_handler)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: fileName; type: string_byref_const - DCHECK(!fileName.empty()); - if (fileName.empty()) - return false; - // Unverified params: mimeType - - // Translate param: handler; type: refptr_same_byref - cef_download_handler_t* handlerStruct = NULL; - if (handler.get()) - handlerStruct = CefDownloadHandlerCToCpp::Unwrap(handler); - cef_download_handler_t* handlerOrig = handlerStruct; - - // Execute - int _retval = struct_->get_download_handler(struct_, - CefBrowserCppToC::Wrap(browser), - mimeType.GetStruct(), - fileName.GetStruct(), - contentLength, - &handlerStruct); - - // Restore param:handler; type: refptr_same_byref - if (handlerStruct) { - if (handlerStruct != handlerOrig) { - handler = CefDownloadHandlerCToCpp::Wrap(handlerStruct); - } - } else { - handler = NULL; - } - - // Return type: bool - return _retval?true:false; -} - -bool CefRequestHandlerCToCpp::GetAuthCredentials(CefRefPtr browser, - bool isProxy, const CefString& host, int port, const CefString& realm, - const CefString& scheme, CefString& username, CefString& password) { - if (CEF_MEMBER_MISSING(struct_, get_auth_credentials)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: host; type: string_byref_const - DCHECK(!host.empty()); - if (host.empty()) - return false; - // Verify param: scheme; type: string_byref_const - DCHECK(!scheme.empty()); - if (scheme.empty()) - return false; - // Unverified params: realm - - // Execute - int _retval = struct_->get_auth_credentials(struct_, - CefBrowserCppToC::Wrap(browser), - isProxy, - host.GetStruct(), - port, - realm.GetStruct(), - scheme.GetStruct(), - username.GetWritableStruct(), - password.GetWritableStruct()); - - // Return type: bool - return _retval?true:false; -} - -CefRefPtr CefRequestHandlerCToCpp::GetCookieManager( - CefRefPtr browser, const CefString& main_url) { - if (CEF_MEMBER_MISSING(struct_, get_cookie_manager)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return NULL; - // Verify param: main_url; type: string_byref_const - DCHECK(!main_url.empty()); - if (main_url.empty()) - return NULL; - - // Execute - cef_cookie_manager_t* _retval = struct_->get_cookie_manager(struct_, - CefBrowserCppToC::Wrap(browser), - main_url.GetStruct()); - - // Return type: refptr_diff - return CefCookieManagerCppToC::Unwrap(_retval); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/request_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/request_handler_ctocpp.h deleted file mode 100644 index 3cd3385af..000000000 --- a/cef1/libcef_dll/ctocpp/request_handler_ctocpp.h +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_REQUEST_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_REQUEST_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_request_handler.h" -#include "include/capi/cef_request_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefRequestHandlerCToCpp - : public CefCToCpp { - public: - explicit CefRequestHandlerCToCpp(cef_request_handler_t* str) - : CefCToCpp(str) {} - virtual ~CefRequestHandlerCToCpp() {} - - // CefRequestHandler methods - virtual bool OnBeforeBrowse(CefRefPtr browser, - CefRefPtr frame, CefRefPtr request, - NavType navType, bool isRedirect) OVERRIDE; - virtual bool OnBeforeResourceLoad(CefRefPtr browser, - CefRefPtr request, CefString& redirectUrl, - CefRefPtr& resourceStream, - CefRefPtr response, int loadFlags) OVERRIDE; - virtual void OnResourceRedirect(CefRefPtr browser, - const CefString& old_url, CefString& new_url) OVERRIDE; - virtual void OnResourceResponse(CefRefPtr browser, - const CefString& url, CefRefPtr response, - CefRefPtr& filter) OVERRIDE; - virtual bool OnProtocolExecution(CefRefPtr browser, - const CefString& url, bool& allowOSExecution) OVERRIDE; - virtual bool GetDownloadHandler(CefRefPtr browser, - const CefString& mimeType, const CefString& fileName, - int64 contentLength, CefRefPtr& handler) OVERRIDE; - virtual bool GetAuthCredentials(CefRefPtr browser, bool isProxy, - const CefString& host, int port, const CefString& realm, - const CefString& scheme, CefString& username, - CefString& password) OVERRIDE; - virtual CefRefPtr GetCookieManager( - CefRefPtr browser, const CefString& main_url) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_REQUEST_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/resource_bundle_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/resource_bundle_handler_ctocpp.cc deleted file mode 100644 index ff85a27ab..000000000 --- a/cef1/libcef_dll/ctocpp/resource_bundle_handler_ctocpp.cc +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/resource_bundle_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefResourceBundleHandlerCToCpp::GetLocalizedString(int message_id, - CefString& string) { - if (CEF_MEMBER_MISSING(struct_, get_localized_string)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_localized_string(struct_, - message_id, - string.GetWritableStruct()); - - // Return type: bool - return _retval?true:false; -} - -bool CefResourceBundleHandlerCToCpp::GetDataResource(int resource_id, - void*& data, size_t& data_size) { - if (CEF_MEMBER_MISSING(struct_, get_data_resource)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_data_resource(struct_, - resource_id, - &data, - &data_size); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/resource_bundle_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/resource_bundle_handler_ctocpp.h deleted file mode 100644 index c05398062..000000000 --- a/cef1/libcef_dll/ctocpp/resource_bundle_handler_ctocpp.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_RESOURCE_BUNDLE_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_RESOURCE_BUNDLE_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_resource_bundle_handler.h" -#include "include/capi/cef_resource_bundle_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefResourceBundleHandlerCToCpp - : public CefCToCpp { - public: - explicit CefResourceBundleHandlerCToCpp(cef_resource_bundle_handler_t* str) - : CefCToCpp(str) {} - virtual ~CefResourceBundleHandlerCToCpp() {} - - // CefResourceBundleHandler methods - virtual bool GetLocalizedString(int message_id, CefString& string) OVERRIDE; - virtual bool GetDataResource(int resource_id, void*& data, - size_t& data_size) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_RESOURCE_BUNDLE_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/response_ctocpp.cc b/cef1/libcef_dll/ctocpp/response_ctocpp.cc deleted file mode 100644 index 6e53ab7f1..000000000 --- a/cef1/libcef_dll/ctocpp/response_ctocpp.cc +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/response_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -int CefResponseCToCpp::GetStatus() { - if (CEF_MEMBER_MISSING(struct_, get_status)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_status(struct_); - - // Return type: simple - return _retval; -} - -void CefResponseCToCpp::SetStatus(int status) { - if (CEF_MEMBER_MISSING(struct_, set_status)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->set_status(struct_, - status); -} - -CefString CefResponseCToCpp::GetStatusText() { - if (CEF_MEMBER_MISSING(struct_, get_status_text)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_status_text(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -void CefResponseCToCpp::SetStatusText(const CefString& statusText) { - if (CEF_MEMBER_MISSING(struct_, set_status_text)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: statusText; type: string_byref_const - DCHECK(!statusText.empty()); - if (statusText.empty()) - return; - - // Execute - struct_->set_status_text(struct_, - statusText.GetStruct()); -} - -CefString CefResponseCToCpp::GetMimeType() { - if (CEF_MEMBER_MISSING(struct_, get_mime_type)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_mime_type(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -void CefResponseCToCpp::SetMimeType(const CefString& mimeType) { - if (CEF_MEMBER_MISSING(struct_, set_mime_type)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: mimeType; type: string_byref_const - DCHECK(!mimeType.empty()); - if (mimeType.empty()) - return; - - // Execute - struct_->set_mime_type(struct_, - mimeType.GetStruct()); -} - -CefString CefResponseCToCpp::GetHeader(const CefString& name) { - if (CEF_MEMBER_MISSING(struct_, get_header)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(!name.empty()); - if (name.empty()) - return CefString(); - - // Execute - cef_string_userfree_t _retval = struct_->get_header(struct_, - name.GetStruct()); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -void CefResponseCToCpp::GetHeaderMap(HeaderMap& headerMap) { - if (CEF_MEMBER_MISSING(struct_, get_header_map)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: headerMap; type: string_map_multi_byref - cef_string_multimap_t headerMapMultimap = cef_string_multimap_alloc(); - DCHECK(headerMapMultimap); - if (headerMapMultimap) - transfer_string_multimap_contents(headerMap, headerMapMultimap); - - // Execute - struct_->get_header_map(struct_, - headerMapMultimap); - - // Restore param:headerMap; type: string_map_multi_byref - if (headerMapMultimap) { - headerMap.clear(); - transfer_string_multimap_contents(headerMapMultimap, headerMap); - cef_string_multimap_free(headerMapMultimap); - } -} - -void CefResponseCToCpp::SetHeaderMap(const HeaderMap& headerMap) { - if (CEF_MEMBER_MISSING(struct_, set_header_map)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: headerMap; type: string_map_multi_byref_const - cef_string_multimap_t headerMapMultimap = cef_string_multimap_alloc(); - DCHECK(headerMapMultimap); - if (headerMapMultimap) - transfer_string_multimap_contents(headerMap, headerMapMultimap); - - // Execute - struct_->set_header_map(struct_, - headerMapMultimap); - - // Restore param:headerMap; type: string_map_multi_byref_const - if (headerMapMultimap) - cef_string_multimap_free(headerMapMultimap); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/response_ctocpp.h b/cef1/libcef_dll/ctocpp/response_ctocpp.h deleted file mode 100644 index 679d67344..000000000 --- a/cef1/libcef_dll/ctocpp/response_ctocpp.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_RESPONSE_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_RESPONSE_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_response.h" -#include "include/capi/cef_response_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefResponseCToCpp - : public CefCToCpp { - public: - explicit CefResponseCToCpp(cef_response_t* str) - : CefCToCpp(str) {} - virtual ~CefResponseCToCpp() {} - - // CefResponse methods - virtual int GetStatus() OVERRIDE; - virtual void SetStatus(int status) OVERRIDE; - virtual CefString GetStatusText() OVERRIDE; - virtual void SetStatusText(const CefString& statusText) OVERRIDE; - virtual CefString GetMimeType() OVERRIDE; - virtual void SetMimeType(const CefString& mimeType) OVERRIDE; - virtual CefString GetHeader(const CefString& name) OVERRIDE; - virtual void GetHeaderMap(HeaderMap& headerMap) OVERRIDE; - virtual void SetHeaderMap(const HeaderMap& headerMap) OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_RESPONSE_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/scheme_handler_callback_ctocpp.cc b/cef1/libcef_dll/ctocpp/scheme_handler_callback_ctocpp.cc deleted file mode 100644 index 3e268c576..000000000 --- a/cef1/libcef_dll/ctocpp/scheme_handler_callback_ctocpp.cc +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/scheme_handler_callback_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefSchemeHandlerCallbackCToCpp::HeadersAvailable() { - if (CEF_MEMBER_MISSING(struct_, headers_available)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->headers_available(struct_); -} - -void CefSchemeHandlerCallbackCToCpp::BytesAvailable() { - if (CEF_MEMBER_MISSING(struct_, bytes_available)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->bytes_available(struct_); -} - -void CefSchemeHandlerCallbackCToCpp::Cancel() { - if (CEF_MEMBER_MISSING(struct_, cancel)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->cancel(struct_); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/scheme_handler_callback_ctocpp.h b/cef1/libcef_dll/ctocpp/scheme_handler_callback_ctocpp.h deleted file mode 100644 index da8e6fdcf..000000000 --- a/cef1/libcef_dll/ctocpp/scheme_handler_callback_ctocpp.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_SCHEME_HANDLER_CALLBACK_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_SCHEME_HANDLER_CALLBACK_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_scheme.h" -#include "include/capi/cef_scheme_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefSchemeHandlerCallbackCToCpp - : public CefCToCpp { - public: - explicit CefSchemeHandlerCallbackCToCpp(cef_scheme_handler_callback_t* str) - : CefCToCpp(str) {} - virtual ~CefSchemeHandlerCallbackCToCpp() {} - - // CefSchemeHandlerCallback methods - virtual void HeadersAvailable() OVERRIDE; - virtual void BytesAvailable() OVERRIDE; - virtual void Cancel() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_SCHEME_HANDLER_CALLBACK_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/scheme_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/scheme_handler_ctocpp.cc deleted file mode 100644 index 028a2c7bc..000000000 --- a/cef1/libcef_dll/ctocpp/scheme_handler_ctocpp.cc +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/request_cpptoc.h" -#include "libcef_dll/cpptoc/response_cpptoc.h" -#include "libcef_dll/cpptoc/scheme_handler_callback_cpptoc.h" -#include "libcef_dll/ctocpp/scheme_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefSchemeHandlerCToCpp::ProcessRequest(CefRefPtr request, - CefRefPtr callback) { - if (CEF_MEMBER_MISSING(struct_, process_request)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: request; type: refptr_diff - DCHECK(request.get()); - if (!request.get()) - return false; - // Verify param: callback; type: refptr_diff - DCHECK(callback.get()); - if (!callback.get()) - return false; - - // Execute - int _retval = struct_->process_request(struct_, - CefRequestCppToC::Wrap(request), - CefSchemeHandlerCallbackCppToC::Wrap(callback)); - - // Return type: bool - return _retval?true:false; -} - -void CefSchemeHandlerCToCpp::GetResponseHeaders(CefRefPtr response, - int64& response_length, CefString& redirectUrl) { - if (CEF_MEMBER_MISSING(struct_, get_response_headers)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: response; type: refptr_diff - DCHECK(response.get()); - if (!response.get()) - return; - - // Execute - struct_->get_response_headers(struct_, - CefResponseCppToC::Wrap(response), - &response_length, - redirectUrl.GetWritableStruct()); -} - -bool CefSchemeHandlerCToCpp::ReadResponse(void* data_out, int bytes_to_read, - int& bytes_read, CefRefPtr callback) { - if (CEF_MEMBER_MISSING(struct_, read_response)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: data_out; type: simple_byaddr - DCHECK(data_out); - if (!data_out) - return false; - // Verify param: callback; type: refptr_diff - DCHECK(callback.get()); - if (!callback.get()) - return false; - - // Execute - int _retval = struct_->read_response(struct_, - data_out, - bytes_to_read, - &bytes_read, - CefSchemeHandlerCallbackCppToC::Wrap(callback)); - - // Return type: bool - return _retval?true:false; -} - -void CefSchemeHandlerCToCpp::Cancel() { - if (CEF_MEMBER_MISSING(struct_, cancel)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->cancel(struct_); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/scheme_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/scheme_handler_ctocpp.h deleted file mode 100644 index 424608eb8..000000000 --- a/cef1/libcef_dll/ctocpp/scheme_handler_ctocpp.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_SCHEME_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_SCHEME_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_scheme.h" -#include "include/capi/cef_scheme_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefSchemeHandlerCToCpp - : public CefCToCpp { - public: - explicit CefSchemeHandlerCToCpp(cef_scheme_handler_t* str) - : CefCToCpp(str) {} - virtual ~CefSchemeHandlerCToCpp() {} - - // CefSchemeHandler methods - virtual bool ProcessRequest(CefRefPtr request, - CefRefPtr callback) OVERRIDE; - virtual void GetResponseHeaders(CefRefPtr response, - int64& response_length, CefString& redirectUrl) OVERRIDE; - virtual bool ReadResponse(void* data_out, int bytes_to_read, int& bytes_read, - CefRefPtr callback) OVERRIDE; - virtual void Cancel() OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_SCHEME_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/scheme_handler_factory_ctocpp.cc b/cef1/libcef_dll/ctocpp/scheme_handler_factory_ctocpp.cc deleted file mode 100644 index 60d1ab1b8..000000000 --- a/cef1/libcef_dll/ctocpp/scheme_handler_factory_ctocpp.cc +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/request_cpptoc.h" -#include "libcef_dll/ctocpp/scheme_handler_ctocpp.h" -#include "libcef_dll/ctocpp/scheme_handler_factory_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -CefRefPtr CefSchemeHandlerFactoryCToCpp::Create( - CefRefPtr browser, const CefString& scheme_name, - CefRefPtr request) { - if (CEF_MEMBER_MISSING(struct_, create)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: scheme_name; type: string_byref_const - DCHECK(!scheme_name.empty()); - if (scheme_name.empty()) - return NULL; - // Verify param: request; type: refptr_diff - DCHECK(request.get()); - if (!request.get()) - return NULL; - // Unverified params: browser - - // Execute - cef_scheme_handler_t* _retval = struct_->create(struct_, - CefBrowserCppToC::Wrap(browser), - scheme_name.GetStruct(), - CefRequestCppToC::Wrap(request)); - - // Return type: refptr_same - return CefSchemeHandlerCToCpp::Wrap(_retval); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/scheme_handler_factory_ctocpp.h b/cef1/libcef_dll/ctocpp/scheme_handler_factory_ctocpp.h deleted file mode 100644 index 9c2de6bd9..000000000 --- a/cef1/libcef_dll/ctocpp/scheme_handler_factory_ctocpp.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_SCHEME_HANDLER_FACTORY_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_SCHEME_HANDLER_FACTORY_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_scheme.h" -#include "include/capi/cef_scheme_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefSchemeHandlerFactoryCToCpp - : public CefCToCpp { - public: - explicit CefSchemeHandlerFactoryCToCpp(cef_scheme_handler_factory_t* str) - : CefCToCpp(str) {} - virtual ~CefSchemeHandlerFactoryCToCpp() {} - - // CefSchemeHandlerFactory methods - virtual CefRefPtr Create(CefRefPtr browser, - const CefString& scheme_name, CefRefPtr request) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_SCHEME_HANDLER_FACTORY_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.cc b/cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.cc deleted file mode 100644 index bbc05d41b..000000000 --- a/cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.cc +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/scheme_registrar_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefSchemeRegistrarCToCpp::AddCustomScheme(const CefString& scheme_name, - bool is_standard, bool is_local, bool is_display_isolated) { - if (CEF_MEMBER_MISSING(struct_, add_custom_scheme)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: scheme_name; type: string_byref_const - DCHECK(!scheme_name.empty()); - if (scheme_name.empty()) - return false; - - // Execute - int _retval = struct_->add_custom_scheme(struct_, - scheme_name.GetStruct(), - is_standard, - is_local, - is_display_isolated); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.h b/cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.h deleted file mode 100644 index f01b9a5f1..000000000 --- a/cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_SCHEME_REGISTRAR_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_SCHEME_REGISTRAR_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_scheme.h" -#include "include/capi/cef_scheme_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefSchemeRegistrarCToCpp - : public CefCToCpp { - public: - explicit CefSchemeRegistrarCToCpp(cef_scheme_registrar_t* str) - : CefCToCpp(str) {} - virtual ~CefSchemeRegistrarCToCpp() {} - - // CefSchemeRegistrar methods - virtual bool AddCustomScheme(const CefString& scheme_name, bool is_standard, - bool is_local, bool is_display_isolated) OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_SCHEME_REGISTRAR_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/stream_reader_ctocpp.cc b/cef1/libcef_dll/ctocpp/stream_reader_ctocpp.cc deleted file mode 100644 index 6f63d9ff1..000000000 --- a/cef1/libcef_dll/ctocpp/stream_reader_ctocpp.cc +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/read_handler_cpptoc.h" -#include "libcef_dll/ctocpp/stream_reader_ctocpp.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefStreamReader::CreateForFile( - const CefString& fileName) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: fileName; type: string_byref_const - DCHECK(!fileName.empty()); - if (fileName.empty()) - return NULL; - - // Execute - cef_stream_reader_t* _retval = cef_stream_reader_create_for_file( - fileName.GetStruct()); - - // Return type: refptr_same - return CefStreamReaderCToCpp::Wrap(_retval); -} - -CefRefPtr CefStreamReader::CreateForData(void* data, - size_t size) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: data; type: simple_byaddr - DCHECK(data); - if (!data) - return NULL; - - // Execute - cef_stream_reader_t* _retval = cef_stream_reader_create_for_data( - data, - size); - - // Return type: refptr_same - return CefStreamReaderCToCpp::Wrap(_retval); -} - -CefRefPtr CefStreamReader::CreateForHandler( - CefRefPtr handler) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: handler; type: refptr_diff - DCHECK(handler.get()); - if (!handler.get()) - return NULL; - - // Execute - cef_stream_reader_t* _retval = cef_stream_reader_create_for_handler( - CefReadHandlerCppToC::Wrap(handler)); - - // Return type: refptr_same - return CefStreamReaderCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -size_t CefStreamReaderCToCpp::Read(void* ptr, size_t size, size_t n) { - if (CEF_MEMBER_MISSING(struct_, read)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: ptr; type: simple_byaddr - DCHECK(ptr); - if (!ptr) - return 0; - - // Execute - size_t _retval = struct_->read(struct_, - ptr, - size, - n); - - // Return type: simple - return _retval; -} - -int CefStreamReaderCToCpp::Seek(int64 offset, int whence) { - if (CEF_MEMBER_MISSING(struct_, seek)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->seek(struct_, - offset, - whence); - - // Return type: simple - return _retval; -} - -int64 CefStreamReaderCToCpp::Tell() { - if (CEF_MEMBER_MISSING(struct_, tell)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int64 _retval = struct_->tell(struct_); - - // Return type: simple - return _retval; -} - -int CefStreamReaderCToCpp::Eof() { - if (CEF_MEMBER_MISSING(struct_, eof)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->eof(struct_); - - // Return type: simple - return _retval; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/stream_reader_ctocpp.h b/cef1/libcef_dll/ctocpp/stream_reader_ctocpp.h deleted file mode 100644 index a856ee6d9..000000000 --- a/cef1/libcef_dll/ctocpp/stream_reader_ctocpp.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_STREAM_READER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_STREAM_READER_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_stream.h" -#include "include/capi/cef_stream_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefStreamReaderCToCpp - : public CefCToCpp { - public: - explicit CefStreamReaderCToCpp(cef_stream_reader_t* str) - : CefCToCpp( - str) {} - virtual ~CefStreamReaderCToCpp() {} - - // CefStreamReader methods - virtual size_t Read(void* ptr, size_t size, size_t n) OVERRIDE; - virtual int Seek(int64 offset, int whence) OVERRIDE; - virtual int64 Tell() OVERRIDE; - virtual int Eof() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_STREAM_READER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/stream_writer_ctocpp.cc b/cef1/libcef_dll/ctocpp/stream_writer_ctocpp.cc deleted file mode 100644 index 7c0561a8b..000000000 --- a/cef1/libcef_dll/ctocpp/stream_writer_ctocpp.cc +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/write_handler_cpptoc.h" -#include "libcef_dll/ctocpp/stream_writer_ctocpp.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefStreamWriter::CreateForFile( - const CefString& fileName) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: fileName; type: string_byref_const - DCHECK(!fileName.empty()); - if (fileName.empty()) - return NULL; - - // Execute - cef_stream_writer_t* _retval = cef_stream_writer_create_for_file( - fileName.GetStruct()); - - // Return type: refptr_same - return CefStreamWriterCToCpp::Wrap(_retval); -} - -CefRefPtr CefStreamWriter::CreateForHandler( - CefRefPtr handler) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: handler; type: refptr_diff - DCHECK(handler.get()); - if (!handler.get()) - return NULL; - - // Execute - cef_stream_writer_t* _retval = cef_stream_writer_create_for_handler( - CefWriteHandlerCppToC::Wrap(handler)); - - // Return type: refptr_same - return CefStreamWriterCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -size_t CefStreamWriterCToCpp::Write(const void* ptr, size_t size, size_t n) { - if (CEF_MEMBER_MISSING(struct_, write)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: ptr; type: simple_byaddr - DCHECK(ptr); - if (!ptr) - return 0; - - // Execute - size_t _retval = struct_->write(struct_, - ptr, - size, - n); - - // Return type: simple - return _retval; -} - -int CefStreamWriterCToCpp::Seek(int64 offset, int whence) { - if (CEF_MEMBER_MISSING(struct_, seek)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->seek(struct_, - offset, - whence); - - // Return type: simple - return _retval; -} - -int64 CefStreamWriterCToCpp::Tell() { - if (CEF_MEMBER_MISSING(struct_, tell)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int64 _retval = struct_->tell(struct_); - - // Return type: simple - return _retval; -} - -int CefStreamWriterCToCpp::Flush() { - if (CEF_MEMBER_MISSING(struct_, flush)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->flush(struct_); - - // Return type: simple - return _retval; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/stream_writer_ctocpp.h b/cef1/libcef_dll/ctocpp/stream_writer_ctocpp.h deleted file mode 100644 index dc148e656..000000000 --- a/cef1/libcef_dll/ctocpp/stream_writer_ctocpp.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_STREAM_WRITER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_STREAM_WRITER_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_stream.h" -#include "include/capi/cef_stream_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefStreamWriterCToCpp - : public CefCToCpp { - public: - explicit CefStreamWriterCToCpp(cef_stream_writer_t* str) - : CefCToCpp( - str) {} - virtual ~CefStreamWriterCToCpp() {} - - // CefStreamWriter methods - virtual size_t Write(const void* ptr, size_t size, size_t n) OVERRIDE; - virtual int Seek(int64 offset, int whence) OVERRIDE; - virtual int64 Tell() OVERRIDE; - virtual int Flush() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_STREAM_WRITER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/task_ctocpp.cc b/cef1/libcef_dll/ctocpp/task_ctocpp.cc deleted file mode 100644 index 9bf6e0879..000000000 --- a/cef1/libcef_dll/ctocpp/task_ctocpp.cc +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/task_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefTaskCToCpp::Execute(CefThreadId threadId) { - if (CEF_MEMBER_MISSING(struct_, execute)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->execute(struct_, - threadId); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/task_ctocpp.h b/cef1/libcef_dll/ctocpp/task_ctocpp.h deleted file mode 100644 index 102e3a053..000000000 --- a/cef1/libcef_dll/ctocpp/task_ctocpp.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_TASK_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_TASK_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_task.h" -#include "include/capi/cef_task_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefTaskCToCpp - : public CefCToCpp { - public: - explicit CefTaskCToCpp(cef_task_t* str) - : CefCToCpp(str) {} - virtual ~CefTaskCToCpp() {} - - // CefTask methods - virtual void Execute(CefThreadId threadId) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_TASK_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/v8accessor_ctocpp.cc b/cef1/libcef_dll/ctocpp/v8accessor_ctocpp.cc deleted file mode 100644 index 9d5c6767d..000000000 --- a/cef1/libcef_dll/ctocpp/v8accessor_ctocpp.cc +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/v8value_cpptoc.h" -#include "libcef_dll/ctocpp/v8accessor_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefV8AccessorCToCpp::Get(const CefString& name, - const CefRefPtr object, CefRefPtr& retval, - CefString& exception) { - if (CEF_MEMBER_MISSING(struct_, get)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(!name.empty()); - if (name.empty()) - return false; - // Verify param: object; type: refptr_diff - DCHECK(object.get()); - if (!object.get()) - return false; - - // Translate param: retval; type: refptr_diff_byref - cef_v8value_t* retvalStruct = NULL; - if (retval.get()) - retvalStruct = CefV8ValueCppToC::Wrap(retval); - cef_v8value_t* retvalOrig = retvalStruct; - - // Execute - int _retval = struct_->get(struct_, - name.GetStruct(), - CefV8ValueCppToC::Wrap(object), - &retvalStruct, - exception.GetWritableStruct()); - - // Restore param:retval; type: refptr_diff_byref - if (retvalStruct) { - if (retvalStruct != retvalOrig) { - retval = CefV8ValueCppToC::Unwrap(retvalStruct); - } - } else { - retval = NULL; - } - - // Return type: bool - return _retval?true:false; -} - -bool CefV8AccessorCToCpp::Set(const CefString& name, - const CefRefPtr object, const CefRefPtr value, - CefString& exception) { - if (CEF_MEMBER_MISSING(struct_, set)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(!name.empty()); - if (name.empty()) - return false; - // Verify param: object; type: refptr_diff - DCHECK(object.get()); - if (!object.get()) - return false; - // Verify param: value; type: refptr_diff - DCHECK(value.get()); - if (!value.get()) - return false; - - // Execute - int _retval = struct_->set(struct_, - name.GetStruct(), - CefV8ValueCppToC::Wrap(object), - CefV8ValueCppToC::Wrap(value), - exception.GetWritableStruct()); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/v8accessor_ctocpp.h b/cef1/libcef_dll/ctocpp/v8accessor_ctocpp.h deleted file mode 100644 index e09004418..000000000 --- a/cef1/libcef_dll/ctocpp/v8accessor_ctocpp.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_V8ACCESSOR_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_V8ACCESSOR_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefV8AccessorCToCpp - : public CefCToCpp { - public: - explicit CefV8AccessorCToCpp(cef_v8accessor_t* str) - : CefCToCpp(str) {} - virtual ~CefV8AccessorCToCpp() {} - - // CefV8Accessor methods - virtual bool Get(const CefString& name, const CefRefPtr object, - CefRefPtr& retval, CefString& exception) OVERRIDE; - virtual bool Set(const CefString& name, const CefRefPtr object, - const CefRefPtr value, CefString& exception) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_V8ACCESSOR_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/v8context_ctocpp.cc b/cef1/libcef_dll/ctocpp/v8context_ctocpp.cc deleted file mode 100644 index 3491eeb96..000000000 --- a/cef1/libcef_dll/ctocpp/v8context_ctocpp.cc +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/frame_ctocpp.h" -#include "libcef_dll/ctocpp/v8context_ctocpp.h" -#include "libcef_dll/ctocpp/v8exception_ctocpp.h" -#include "libcef_dll/ctocpp/v8value_ctocpp.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefV8Context::GetCurrentContext() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8context_t* _retval = cef_v8context_get_current_context(); - - // Return type: refptr_same - return CefV8ContextCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8Context::GetEnteredContext() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8context_t* _retval = cef_v8context_get_entered_context(); - - // Return type: refptr_same - return CefV8ContextCToCpp::Wrap(_retval); -} - -bool CefV8Context::InContext() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = cef_v8context_in_context(); - - // Return type: bool - return _retval?true:false; -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefV8ContextCToCpp::IsValid() { - if (CEF_MEMBER_MISSING(struct_, is_valid)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_valid(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefRefPtr CefV8ContextCToCpp::GetBrowser() { - if (CEF_MEMBER_MISSING(struct_, get_browser)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_browser_t* _retval = struct_->get_browser(struct_); - - // Return type: refptr_same - return CefBrowserCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8ContextCToCpp::GetFrame() { - if (CEF_MEMBER_MISSING(struct_, get_frame)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_frame_t* _retval = struct_->get_frame(struct_); - - // Return type: refptr_same - return CefFrameCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8ContextCToCpp::GetGlobal() { - if (CEF_MEMBER_MISSING(struct_, get_global)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8value_t* _retval = struct_->get_global(struct_); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -bool CefV8ContextCToCpp::Enter() { - if (CEF_MEMBER_MISSING(struct_, enter)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->enter(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ContextCToCpp::Exit() { - if (CEF_MEMBER_MISSING(struct_, exit)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->exit(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ContextCToCpp::IsSame(CefRefPtr that) { - if (CEF_MEMBER_MISSING(struct_, is_same)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: that; type: refptr_same - DCHECK(that.get()); - if (!that.get()) - return false; - - // Execute - int _retval = struct_->is_same(struct_, - CefV8ContextCToCpp::Unwrap(that)); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ContextCToCpp::Eval(const CefString& code, - CefRefPtr& retval, CefRefPtr& exception) { - if (CEF_MEMBER_MISSING(struct_, eval)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: code; type: string_byref_const - DCHECK(!code.empty()); - if (code.empty()) - return false; - - // Translate param: retval; type: refptr_same_byref - cef_v8value_t* retvalStruct = NULL; - if (retval.get()) - retvalStruct = CefV8ValueCToCpp::Unwrap(retval); - cef_v8value_t* retvalOrig = retvalStruct; - // Translate param: exception; type: refptr_same_byref - cef_v8exception_t* exceptionStruct = NULL; - if (exception.get()) - exceptionStruct = CefV8ExceptionCToCpp::Unwrap(exception); - cef_v8exception_t* exceptionOrig = exceptionStruct; - - // Execute - int _retval = struct_->eval(struct_, - code.GetStruct(), - &retvalStruct, - &exceptionStruct); - - // Restore param:retval; type: refptr_same_byref - if (retvalStruct) { - if (retvalStruct != retvalOrig) { - retval = CefV8ValueCToCpp::Wrap(retvalStruct); - } - } else { - retval = NULL; - } - // Restore param:exception; type: refptr_same_byref - if (exceptionStruct) { - if (exceptionStruct != exceptionOrig) { - exception = CefV8ExceptionCToCpp::Wrap(exceptionStruct); - } - } else { - exception = NULL; - } - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/v8context_ctocpp.h b/cef1/libcef_dll/ctocpp/v8context_ctocpp.h deleted file mode 100644 index 3ba74cd5c..000000000 --- a/cef1/libcef_dll/ctocpp/v8context_ctocpp.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_V8CONTEXT_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_V8CONTEXT_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefV8ContextCToCpp - : public CefCToCpp { - public: - explicit CefV8ContextCToCpp(cef_v8context_t* str) - : CefCToCpp(str) {} - virtual ~CefV8ContextCToCpp() {} - - // CefV8Context methods - virtual bool IsValid() OVERRIDE; - virtual CefRefPtr GetBrowser() OVERRIDE; - virtual CefRefPtr GetFrame() OVERRIDE; - virtual CefRefPtr GetGlobal() OVERRIDE; - virtual bool Enter() OVERRIDE; - virtual bool Exit() OVERRIDE; - virtual bool IsSame(CefRefPtr that) OVERRIDE; - virtual bool Eval(const CefString& code, CefRefPtr& retval, - CefRefPtr& exception) OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_V8CONTEXT_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/v8context_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/v8context_handler_ctocpp.cc deleted file mode 100644 index 02dc6b7fb..000000000 --- a/cef1/libcef_dll/ctocpp/v8context_handler_ctocpp.cc +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/frame_cpptoc.h" -#include "libcef_dll/cpptoc/v8context_cpptoc.h" -#include "libcef_dll/cpptoc/v8exception_cpptoc.h" -#include "libcef_dll/cpptoc/v8stack_trace_cpptoc.h" -#include "libcef_dll/ctocpp/v8context_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefV8ContextHandlerCToCpp::OnContextCreated(CefRefPtr browser, - CefRefPtr frame, CefRefPtr context) { - if (CEF_MEMBER_MISSING(struct_, on_context_created)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return; - // Verify param: context; type: refptr_diff - DCHECK(context.get()); - if (!context.get()) - return; - - // Execute - struct_->on_context_created(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - CefV8ContextCppToC::Wrap(context)); -} - -void CefV8ContextHandlerCToCpp::OnContextReleased(CefRefPtr browser, - CefRefPtr frame, CefRefPtr context) { - if (CEF_MEMBER_MISSING(struct_, on_context_released)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return; - // Verify param: context; type: refptr_diff - DCHECK(context.get()); - if (!context.get()) - return; - - // Execute - struct_->on_context_released(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - CefV8ContextCppToC::Wrap(context)); -} - -void CefV8ContextHandlerCToCpp::OnUncaughtException( - CefRefPtr browser, CefRefPtr frame, - CefRefPtr context, CefRefPtr exception, - CefRefPtr stackTrace) { - if (CEF_MEMBER_MISSING(struct_, on_uncaught_exception)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return; - // Verify param: frame; type: refptr_diff - DCHECK(frame.get()); - if (!frame.get()) - return; - // Verify param: context; type: refptr_diff - DCHECK(context.get()); - if (!context.get()) - return; - // Verify param: exception; type: refptr_diff - DCHECK(exception.get()); - if (!exception.get()) - return; - // Verify param: stackTrace; type: refptr_diff - DCHECK(stackTrace.get()); - if (!stackTrace.get()) - return; - - // Execute - struct_->on_uncaught_exception(struct_, - CefBrowserCppToC::Wrap(browser), - CefFrameCppToC::Wrap(frame), - CefV8ContextCppToC::Wrap(context), - CefV8ExceptionCppToC::Wrap(exception), - CefV8StackTraceCppToC::Wrap(stackTrace)); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/v8context_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/v8context_handler_ctocpp.h deleted file mode 100644 index 1adc30d43..000000000 --- a/cef1/libcef_dll/ctocpp/v8context_handler_ctocpp.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_V8CONTEXT_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_V8CONTEXT_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_v8context_handler.h" -#include "include/capi/cef_v8context_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefV8ContextHandlerCToCpp - : public CefCToCpp { - public: - explicit CefV8ContextHandlerCToCpp(cef_v8context_handler_t* str) - : CefCToCpp(str) {} - virtual ~CefV8ContextHandlerCToCpp() {} - - // CefV8ContextHandler methods - virtual void OnContextCreated(CefRefPtr browser, - CefRefPtr frame, CefRefPtr context) OVERRIDE; - virtual void OnContextReleased(CefRefPtr browser, - CefRefPtr frame, CefRefPtr context) OVERRIDE; - virtual void OnUncaughtException(CefRefPtr browser, - CefRefPtr frame, CefRefPtr context, - CefRefPtr exception, - CefRefPtr stackTrace) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_V8CONTEXT_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/v8exception_ctocpp.cc b/cef1/libcef_dll/ctocpp/v8exception_ctocpp.cc deleted file mode 100644 index 633a21dc4..000000000 --- a/cef1/libcef_dll/ctocpp/v8exception_ctocpp.cc +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/v8exception_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -CefString CefV8ExceptionCToCpp::GetMessage() { - if (CEF_MEMBER_MISSING(struct_, get_message)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_message(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefV8ExceptionCToCpp::GetSourceLine() { - if (CEF_MEMBER_MISSING(struct_, get_source_line)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_source_line(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefV8ExceptionCToCpp::GetScriptResourceName() { - if (CEF_MEMBER_MISSING(struct_, get_script_resource_name)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_script_resource_name(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -int CefV8ExceptionCToCpp::GetLineNumber() { - if (CEF_MEMBER_MISSING(struct_, get_line_number)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_line_number(struct_); - - // Return type: simple - return _retval; -} - -int CefV8ExceptionCToCpp::GetStartPosition() { - if (CEF_MEMBER_MISSING(struct_, get_start_position)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_start_position(struct_); - - // Return type: simple - return _retval; -} - -int CefV8ExceptionCToCpp::GetEndPosition() { - if (CEF_MEMBER_MISSING(struct_, get_end_position)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_end_position(struct_); - - // Return type: simple - return _retval; -} - -int CefV8ExceptionCToCpp::GetStartColumn() { - if (CEF_MEMBER_MISSING(struct_, get_start_column)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_start_column(struct_); - - // Return type: simple - return _retval; -} - -int CefV8ExceptionCToCpp::GetEndColumn() { - if (CEF_MEMBER_MISSING(struct_, get_end_column)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_end_column(struct_); - - // Return type: simple - return _retval; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/v8exception_ctocpp.h b/cef1/libcef_dll/ctocpp/v8exception_ctocpp.h deleted file mode 100644 index 1006a4c0c..000000000 --- a/cef1/libcef_dll/ctocpp/v8exception_ctocpp.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_V8EXCEPTION_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_V8EXCEPTION_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefV8ExceptionCToCpp - : public CefCToCpp { - public: - explicit CefV8ExceptionCToCpp(cef_v8exception_t* str) - : CefCToCpp( - str) {} - virtual ~CefV8ExceptionCToCpp() {} - - // CefV8Exception methods - virtual CefString GetMessage() OVERRIDE; - virtual CefString GetSourceLine() OVERRIDE; - virtual CefString GetScriptResourceName() OVERRIDE; - virtual int GetLineNumber() OVERRIDE; - virtual int GetStartPosition() OVERRIDE; - virtual int GetEndPosition() OVERRIDE; - virtual int GetStartColumn() OVERRIDE; - virtual int GetEndColumn() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_V8EXCEPTION_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/v8handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/v8handler_ctocpp.cc deleted file mode 100644 index 4ff8439ca..000000000 --- a/cef1/libcef_dll/ctocpp/v8handler_ctocpp.cc +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/v8value_cpptoc.h" -#include "libcef_dll/ctocpp/v8handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefV8HandlerCToCpp::Execute(const CefString& name, - CefRefPtr object, const CefV8ValueList& arguments, - CefRefPtr& retval, CefString& exception) { - if (CEF_MEMBER_MISSING(struct_, execute)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(!name.empty()); - if (name.empty()) - return false; - // Verify param: object; type: refptr_diff - DCHECK(object.get()); - if (!object.get()) - return false; - - // Translate param: arguments; type: refptr_vec_diff_byref_const - const size_t argumentsCount = arguments.size(); - cef_v8value_t** argumentsList = NULL; - if (argumentsCount > 0) { - argumentsList = new cef_v8value_t*[argumentsCount]; - DCHECK(argumentsList); - if (argumentsList) { - for (size_t i = 0; i < argumentsCount; ++i) { - argumentsList[i] = CefV8ValueCppToC::Wrap(arguments[i]); - } - } - } - // Translate param: retval; type: refptr_diff_byref - cef_v8value_t* retvalStruct = NULL; - if (retval.get()) - retvalStruct = CefV8ValueCppToC::Wrap(retval); - cef_v8value_t* retvalOrig = retvalStruct; - - // Execute - int _retval = struct_->execute(struct_, - name.GetStruct(), - CefV8ValueCppToC::Wrap(object), - argumentsCount, - argumentsList, - &retvalStruct, - exception.GetWritableStruct()); - - // Restore param:arguments; type: refptr_vec_diff_byref_const - if (argumentsList) - delete [] argumentsList; - // Restore param:retval; type: refptr_diff_byref - if (retvalStruct) { - if (retvalStruct != retvalOrig) { - retval = CefV8ValueCppToC::Unwrap(retvalStruct); - } - } else { - retval = NULL; - } - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/v8handler_ctocpp.h b/cef1/libcef_dll/ctocpp/v8handler_ctocpp.h deleted file mode 100644 index 534ccdfe1..000000000 --- a/cef1/libcef_dll/ctocpp/v8handler_ctocpp.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_V8HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_V8HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefV8HandlerCToCpp - : public CefCToCpp { - public: - explicit CefV8HandlerCToCpp(cef_v8handler_t* str) - : CefCToCpp(str) {} - virtual ~CefV8HandlerCToCpp() {} - - // CefV8Handler methods - virtual bool Execute(const CefString& name, CefRefPtr object, - const CefV8ValueList& arguments, CefRefPtr& retval, - CefString& exception) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_V8HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/v8stack_frame_ctocpp.cc b/cef1/libcef_dll/ctocpp/v8stack_frame_ctocpp.cc deleted file mode 100644 index a0de4d3a0..000000000 --- a/cef1/libcef_dll/ctocpp/v8stack_frame_ctocpp.cc +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/v8stack_frame_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefV8StackFrameCToCpp::IsValid() { - if (CEF_MEMBER_MISSING(struct_, is_valid)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_valid(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefString CefV8StackFrameCToCpp::GetScriptName() { - if (CEF_MEMBER_MISSING(struct_, get_script_name)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_script_name(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefV8StackFrameCToCpp::GetScriptNameOrSourceURL() { - if (CEF_MEMBER_MISSING(struct_, get_script_name_or_source_url)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_script_name_or_source_url( - struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefV8StackFrameCToCpp::GetFunctionName() { - if (CEF_MEMBER_MISSING(struct_, get_function_name)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_function_name(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -int CefV8StackFrameCToCpp::GetLineNumber() { - if (CEF_MEMBER_MISSING(struct_, get_line_number)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_line_number(struct_); - - // Return type: simple - return _retval; -} - -int CefV8StackFrameCToCpp::GetColumn() { - if (CEF_MEMBER_MISSING(struct_, get_column)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_column(struct_); - - // Return type: simple - return _retval; -} - -bool CefV8StackFrameCToCpp::IsEval() { - if (CEF_MEMBER_MISSING(struct_, is_eval)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_eval(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8StackFrameCToCpp::IsConstructor() { - if (CEF_MEMBER_MISSING(struct_, is_constructor)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_constructor(struct_); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/v8stack_frame_ctocpp.h b/cef1/libcef_dll/ctocpp/v8stack_frame_ctocpp.h deleted file mode 100644 index 7d1cace31..000000000 --- a/cef1/libcef_dll/ctocpp/v8stack_frame_ctocpp.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_V8STACK_FRAME_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_V8STACK_FRAME_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefV8StackFrameCToCpp - : public CefCToCpp { - public: - explicit CefV8StackFrameCToCpp(cef_v8stack_frame_t* str) - : CefCToCpp( - str) {} - virtual ~CefV8StackFrameCToCpp() {} - - // CefV8StackFrame methods - virtual bool IsValid() OVERRIDE; - virtual CefString GetScriptName() OVERRIDE; - virtual CefString GetScriptNameOrSourceURL() OVERRIDE; - virtual CefString GetFunctionName() OVERRIDE; - virtual int GetLineNumber() OVERRIDE; - virtual int GetColumn() OVERRIDE; - virtual bool IsEval() OVERRIDE; - virtual bool IsConstructor() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_V8STACK_FRAME_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/v8stack_trace_ctocpp.cc b/cef1/libcef_dll/ctocpp/v8stack_trace_ctocpp.cc deleted file mode 100644 index 0764c7ead..000000000 --- a/cef1/libcef_dll/ctocpp/v8stack_trace_ctocpp.cc +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/v8stack_frame_ctocpp.h" -#include "libcef_dll/ctocpp/v8stack_trace_ctocpp.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefV8StackTrace::GetCurrent(int frame_limit) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8stack_trace_t* _retval = cef_v8stack_trace_get_current( - frame_limit); - - // Return type: refptr_same - return CefV8StackTraceCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefV8StackTraceCToCpp::IsValid() { - if (CEF_MEMBER_MISSING(struct_, is_valid)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_valid(struct_); - - // Return type: bool - return _retval?true:false; -} - -int CefV8StackTraceCToCpp::GetFrameCount() { - if (CEF_MEMBER_MISSING(struct_, get_frame_count)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_frame_count(struct_); - - // Return type: simple - return _retval; -} - -CefRefPtr CefV8StackTraceCToCpp::GetFrame(int index) { - if (CEF_MEMBER_MISSING(struct_, get_frame)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8stack_frame_t* _retval = struct_->get_frame(struct_, - index); - - // Return type: refptr_same - return CefV8StackFrameCToCpp::Wrap(_retval); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/v8stack_trace_ctocpp.h b/cef1/libcef_dll/ctocpp/v8stack_trace_ctocpp.h deleted file mode 100644 index 8e72b8865..000000000 --- a/cef1/libcef_dll/ctocpp/v8stack_trace_ctocpp.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_V8STACK_TRACE_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_V8STACK_TRACE_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefV8StackTraceCToCpp - : public CefCToCpp { - public: - explicit CefV8StackTraceCToCpp(cef_v8stack_trace_t* str) - : CefCToCpp( - str) {} - virtual ~CefV8StackTraceCToCpp() {} - - // CefV8StackTrace methods - virtual bool IsValid() OVERRIDE; - virtual int GetFrameCount() OVERRIDE; - virtual CefRefPtr GetFrame(int index) OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_V8STACK_TRACE_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/v8value_ctocpp.cc b/cef1/libcef_dll/ctocpp/v8value_ctocpp.cc deleted file mode 100644 index 36d2063d2..000000000 --- a/cef1/libcef_dll/ctocpp/v8value_ctocpp.cc +++ /dev/null @@ -1,874 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/base_cpptoc.h" -#include "libcef_dll/cpptoc/v8accessor_cpptoc.h" -#include "libcef_dll/cpptoc/v8handler_cpptoc.h" -#include "libcef_dll/ctocpp/v8context_ctocpp.h" -#include "libcef_dll/ctocpp/v8exception_ctocpp.h" -#include "libcef_dll/ctocpp/v8value_ctocpp.h" -#include "libcef_dll/transfer_util.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefV8Value::CreateUndefined() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8value_t* _retval = cef_v8value_create_undefined(); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8Value::CreateNull() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8value_t* _retval = cef_v8value_create_null(); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8Value::CreateBool(bool value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8value_t* _retval = cef_v8value_create_bool( - value); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8Value::CreateInt(int32 value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8value_t* _retval = cef_v8value_create_int( - value); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8Value::CreateUInt(uint32 value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8value_t* _retval = cef_v8value_create_uint( - value); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8Value::CreateDouble(double value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8value_t* _retval = cef_v8value_create_double( - value); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8Value::CreateDate(const CefTime& date) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8value_t* _retval = cef_v8value_create_date( - &date); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8Value::CreateString(const CefString& value) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: value - - // Execute - cef_v8value_t* _retval = cef_v8value_create_string( - value.GetStruct()); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8Value::CreateObject( - CefRefPtr accessor) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: accessor - - // Execute - cef_v8value_t* _retval = cef_v8value_create_object( - CefV8AccessorCppToC::Wrap(accessor)); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8Value::CreateArray(int length) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8value_t* _retval = cef_v8value_create_array( - length); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8Value::CreateFunction(const CefString& name, - CefRefPtr handler) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(!name.empty()); - if (name.empty()) - return NULL; - // Verify param: handler; type: refptr_diff - DCHECK(handler.get()); - if (!handler.get()) - return NULL; - - // Execute - cef_v8value_t* _retval = cef_v8value_create_function( - name.GetStruct(), - CefV8HandlerCppToC::Wrap(handler)); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefV8ValueCToCpp::IsValid() { - if (CEF_MEMBER_MISSING(struct_, is_valid)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_valid(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::IsUndefined() { - if (CEF_MEMBER_MISSING(struct_, is_undefined)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_undefined(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::IsNull() { - if (CEF_MEMBER_MISSING(struct_, is_null)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_null(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::IsBool() { - if (CEF_MEMBER_MISSING(struct_, is_bool)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_bool(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::IsInt() { - if (CEF_MEMBER_MISSING(struct_, is_int)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_int(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::IsUInt() { - if (CEF_MEMBER_MISSING(struct_, is_uint)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_uint(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::IsDouble() { - if (CEF_MEMBER_MISSING(struct_, is_double)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_double(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::IsDate() { - if (CEF_MEMBER_MISSING(struct_, is_date)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_date(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::IsString() { - if (CEF_MEMBER_MISSING(struct_, is_string)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_string(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::IsObject() { - if (CEF_MEMBER_MISSING(struct_, is_object)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_object(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::IsArray() { - if (CEF_MEMBER_MISSING(struct_, is_array)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_array(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::IsFunction() { - if (CEF_MEMBER_MISSING(struct_, is_function)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_function(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::IsSame(CefRefPtr that) { - if (CEF_MEMBER_MISSING(struct_, is_same)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: that; type: refptr_same - DCHECK(that.get()); - if (!that.get()) - return false; - - // Execute - int _retval = struct_->is_same(struct_, - CefV8ValueCToCpp::Unwrap(that)); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::GetBoolValue() { - if (CEF_MEMBER_MISSING(struct_, get_bool_value)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_bool_value(struct_); - - // Return type: bool - return _retval?true:false; -} - -int32 CefV8ValueCToCpp::GetIntValue() { - if (CEF_MEMBER_MISSING(struct_, get_int_value)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int32 _retval = struct_->get_int_value(struct_); - - // Return type: simple - return _retval; -} - -uint32 CefV8ValueCToCpp::GetUIntValue() { - if (CEF_MEMBER_MISSING(struct_, get_uint_value)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - uint32 _retval = struct_->get_uint_value(struct_); - - // Return type: simple - return _retval; -} - -double CefV8ValueCToCpp::GetDoubleValue() { - if (CEF_MEMBER_MISSING(struct_, get_double_value)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - double _retval = struct_->get_double_value(struct_); - - // Return type: simple - return _retval; -} - -CefTime CefV8ValueCToCpp::GetDateValue() { - if (CEF_MEMBER_MISSING(struct_, get_date_value)) - return CefTime(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_time_t _retval = struct_->get_date_value(struct_); - - // Return type: simple - return _retval; -} - -CefString CefV8ValueCToCpp::GetStringValue() { - if (CEF_MEMBER_MISSING(struct_, get_string_value)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_string_value(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -bool CefV8ValueCToCpp::IsUserCreated() { - if (CEF_MEMBER_MISSING(struct_, is_user_created)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_user_created(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::HasException() { - if (CEF_MEMBER_MISSING(struct_, has_exception)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->has_exception(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefRefPtr CefV8ValueCToCpp::GetException() { - if (CEF_MEMBER_MISSING(struct_, get_exception)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8exception_t* _retval = struct_->get_exception(struct_); - - // Return type: refptr_same - return CefV8ExceptionCToCpp::Wrap(_retval); -} - -bool CefV8ValueCToCpp::ClearException() { - if (CEF_MEMBER_MISSING(struct_, clear_exception)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->clear_exception(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::WillRethrowExceptions() { - if (CEF_MEMBER_MISSING(struct_, will_rethrow_exceptions)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->will_rethrow_exceptions(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::SetRethrowExceptions(bool rethrow) { - if (CEF_MEMBER_MISSING(struct_, set_rethrow_exceptions)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->set_rethrow_exceptions(struct_, - rethrow); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::HasValue(const CefString& key) { - if (CEF_MEMBER_MISSING(struct_, has_value_bykey)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: key - - // Execute - int _retval = struct_->has_value_bykey(struct_, - key.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::HasValue(int index) { - if (CEF_MEMBER_MISSING(struct_, has_value_byindex)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: index; type: simple_byval - DCHECK_GE(index, 0); - if (index < 0) - return false; - - // Execute - int _retval = struct_->has_value_byindex(struct_, - index); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::DeleteValue(const CefString& key) { - if (CEF_MEMBER_MISSING(struct_, delete_value_bykey)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: key - - // Execute - int _retval = struct_->delete_value_bykey(struct_, - key.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::DeleteValue(int index) { - if (CEF_MEMBER_MISSING(struct_, delete_value_byindex)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: index; type: simple_byval - DCHECK_GE(index, 0); - if (index < 0) - return false; - - // Execute - int _retval = struct_->delete_value_byindex(struct_, - index); - - // Return type: bool - return _retval?true:false; -} - -CefRefPtr CefV8ValueCToCpp::GetValue(const CefString& key) { - if (CEF_MEMBER_MISSING(struct_, get_value_bykey)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: key - - // Execute - cef_v8value_t* _retval = struct_->get_value_bykey(struct_, - key.GetStruct()); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8ValueCToCpp::GetValue(int index) { - if (CEF_MEMBER_MISSING(struct_, get_value_byindex)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: index; type: simple_byval - DCHECK_GE(index, 0); - if (index < 0) - return NULL; - - // Execute - cef_v8value_t* _retval = struct_->get_value_byindex(struct_, - index); - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -bool CefV8ValueCToCpp::SetValue(const CefString& key, - CefRefPtr value, PropertyAttribute attribute) { - if (CEF_MEMBER_MISSING(struct_, set_value_bykey)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: value; type: refptr_same - DCHECK(value.get()); - if (!value.get()) - return false; - // Unverified params: key - - // Execute - int _retval = struct_->set_value_bykey(struct_, - key.GetStruct(), - CefV8ValueCToCpp::Unwrap(value), - attribute); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::SetValue(int index, CefRefPtr value) { - if (CEF_MEMBER_MISSING(struct_, set_value_byindex)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: index; type: simple_byval - DCHECK_GE(index, 0); - if (index < 0) - return false; - // Verify param: value; type: refptr_same - DCHECK(value.get()); - if (!value.get()) - return false; - - // Execute - int _retval = struct_->set_value_byindex(struct_, - index, - CefV8ValueCToCpp::Unwrap(value)); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::SetValue(const CefString& key, AccessControl settings, - PropertyAttribute attribute) { - if (CEF_MEMBER_MISSING(struct_, set_value_byaccessor)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: key - - // Execute - int _retval = struct_->set_value_byaccessor(struct_, - key.GetStruct(), - settings, - attribute); - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::GetKeys(std::vector& keys) { - if (CEF_MEMBER_MISSING(struct_, get_keys)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Translate param: keys; type: string_vec_byref - cef_string_list_t keysList = cef_string_list_alloc(); - DCHECK(keysList); - if (keysList) - transfer_string_list_contents(keys, keysList); - - // Execute - int _retval = struct_->get_keys(struct_, - keysList); - - // Restore param:keys; type: string_vec_byref - if (keysList) { - keys.clear(); - transfer_string_list_contents(keysList, keys); - cef_string_list_free(keysList); - } - - // Return type: bool - return _retval?true:false; -} - -bool CefV8ValueCToCpp::SetUserData(CefRefPtr user_data) { - if (CEF_MEMBER_MISSING(struct_, set_user_data)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: user_data - - // Execute - int _retval = struct_->set_user_data(struct_, - CefBaseCppToC::Wrap(user_data)); - - // Return type: bool - return _retval?true:false; -} - -CefRefPtr CefV8ValueCToCpp::GetUserData() { - if (CEF_MEMBER_MISSING(struct_, get_user_data)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_base_t* _retval = struct_->get_user_data(struct_); - - // Return type: refptr_diff - return CefBaseCppToC::Unwrap(_retval); -} - -int CefV8ValueCToCpp::GetExternallyAllocatedMemory() { - if (CEF_MEMBER_MISSING(struct_, get_externally_allocated_memory)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_externally_allocated_memory(struct_); - - // Return type: simple - return _retval; -} - -int CefV8ValueCToCpp::AdjustExternallyAllocatedMemory(int change_in_bytes) { - if (CEF_MEMBER_MISSING(struct_, adjust_externally_allocated_memory)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->adjust_externally_allocated_memory(struct_, - change_in_bytes); - - // Return type: simple - return _retval; -} - -int CefV8ValueCToCpp::GetArrayLength() { - if (CEF_MEMBER_MISSING(struct_, get_array_length)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_array_length(struct_); - - // Return type: simple - return _retval; -} - -CefString CefV8ValueCToCpp::GetFunctionName() { - if (CEF_MEMBER_MISSING(struct_, get_function_name)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_function_name(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefRefPtr CefV8ValueCToCpp::GetFunctionHandler() { - if (CEF_MEMBER_MISSING(struct_, get_function_handler)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_v8handler_t* _retval = struct_->get_function_handler(struct_); - - // Return type: refptr_diff - return CefV8HandlerCppToC::Unwrap(_retval); -} - -CefRefPtr CefV8ValueCToCpp::ExecuteFunction( - CefRefPtr object, const CefV8ValueList& arguments) { - if (CEF_MEMBER_MISSING(struct_, execute_function)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: object - - // Translate param: arguments; type: refptr_vec_same_byref_const - const size_t argumentsCount = arguments.size(); - cef_v8value_t** argumentsList = NULL; - if (argumentsCount > 0) { - argumentsList = new cef_v8value_t*[argumentsCount]; - DCHECK(argumentsList); - if (argumentsList) { - for (size_t i = 0; i < argumentsCount; ++i) { - argumentsList[i] = CefV8ValueCToCpp::Unwrap(arguments[i]); - } - } - } - - // Execute - cef_v8value_t* _retval = struct_->execute_function(struct_, - CefV8ValueCToCpp::Unwrap(object), - argumentsCount, - argumentsList); - - // Restore param:arguments; type: refptr_vec_same_byref_const - if (argumentsList) - delete [] argumentsList; - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - -CefRefPtr CefV8ValueCToCpp::ExecuteFunctionWithContext( - CefRefPtr context, CefRefPtr object, - const CefV8ValueList& arguments) { - if (CEF_MEMBER_MISSING(struct_, execute_function_with_context)) - return NULL; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: context; type: refptr_same - DCHECK(context.get()); - if (!context.get()) - return NULL; - // Unverified params: object - - // Translate param: arguments; type: refptr_vec_same_byref_const - const size_t argumentsCount = arguments.size(); - cef_v8value_t** argumentsList = NULL; - if (argumentsCount > 0) { - argumentsList = new cef_v8value_t*[argumentsCount]; - DCHECK(argumentsList); - if (argumentsList) { - for (size_t i = 0; i < argumentsCount; ++i) { - argumentsList[i] = CefV8ValueCToCpp::Unwrap(arguments[i]); - } - } - } - - // Execute - cef_v8value_t* _retval = struct_->execute_function_with_context(struct_, - CefV8ContextCToCpp::Unwrap(context), - CefV8ValueCToCpp::Unwrap(object), - argumentsCount, - argumentsList); - - // Restore param:arguments; type: refptr_vec_same_byref_const - if (argumentsList) - delete [] argumentsList; - - // Return type: refptr_same - return CefV8ValueCToCpp::Wrap(_retval); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/v8value_ctocpp.h b/cef1/libcef_dll/ctocpp/v8value_ctocpp.h deleted file mode 100644 index 552b020b5..000000000 --- a/cef1/libcef_dll/ctocpp/v8value_ctocpp.h +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_V8VALUE_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_V8VALUE_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefV8ValueCToCpp - : public CefCToCpp { - public: - explicit CefV8ValueCToCpp(cef_v8value_t* str) - : CefCToCpp(str) {} - virtual ~CefV8ValueCToCpp() {} - - // CefV8Value methods - virtual bool IsValid() OVERRIDE; - virtual bool IsUndefined() OVERRIDE; - virtual bool IsNull() OVERRIDE; - virtual bool IsBool() OVERRIDE; - virtual bool IsInt() OVERRIDE; - virtual bool IsUInt() OVERRIDE; - virtual bool IsDouble() OVERRIDE; - virtual bool IsDate() OVERRIDE; - virtual bool IsString() OVERRIDE; - virtual bool IsObject() OVERRIDE; - virtual bool IsArray() OVERRIDE; - virtual bool IsFunction() OVERRIDE; - virtual bool IsSame(CefRefPtr that) OVERRIDE; - virtual bool GetBoolValue() OVERRIDE; - virtual int32 GetIntValue() OVERRIDE; - virtual uint32 GetUIntValue() OVERRIDE; - virtual double GetDoubleValue() OVERRIDE; - virtual CefTime GetDateValue() OVERRIDE; - virtual CefString GetStringValue() OVERRIDE; - virtual bool IsUserCreated() OVERRIDE; - virtual bool HasException() OVERRIDE; - virtual CefRefPtr GetException() OVERRIDE; - virtual bool ClearException() OVERRIDE; - virtual bool WillRethrowExceptions() OVERRIDE; - virtual bool SetRethrowExceptions(bool rethrow) OVERRIDE; - virtual bool HasValue(const CefString& key) OVERRIDE; - virtual bool HasValue(int index) OVERRIDE; - virtual bool DeleteValue(const CefString& key) OVERRIDE; - virtual bool DeleteValue(int index) OVERRIDE; - virtual CefRefPtr GetValue(const CefString& key) OVERRIDE; - virtual CefRefPtr GetValue(int index) OVERRIDE; - virtual bool SetValue(const CefString& key, CefRefPtr value, - PropertyAttribute attribute) OVERRIDE; - virtual bool SetValue(int index, CefRefPtr value) OVERRIDE; - virtual bool SetValue(const CefString& key, AccessControl settings, - PropertyAttribute attribute) OVERRIDE; - virtual bool GetKeys(std::vector& keys) OVERRIDE; - virtual bool SetUserData(CefRefPtr user_data) OVERRIDE; - virtual CefRefPtr GetUserData() OVERRIDE; - virtual int GetExternallyAllocatedMemory() OVERRIDE; - virtual int AdjustExternallyAllocatedMemory(int change_in_bytes) OVERRIDE; - virtual int GetArrayLength() OVERRIDE; - virtual CefString GetFunctionName() OVERRIDE; - virtual CefRefPtr GetFunctionHandler() OVERRIDE; - virtual CefRefPtr ExecuteFunction(CefRefPtr object, - const CefV8ValueList& arguments) OVERRIDE; - virtual CefRefPtr ExecuteFunctionWithContext( - CefRefPtr context, CefRefPtr object, - const CefV8ValueList& arguments) OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_V8VALUE_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/web_plugin_info_ctocpp.cc b/cef1/libcef_dll/ctocpp/web_plugin_info_ctocpp.cc deleted file mode 100644 index 602021219..000000000 --- a/cef1/libcef_dll/ctocpp/web_plugin_info_ctocpp.cc +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/web_plugin_info_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -CefString CefWebPluginInfoCToCpp::GetName() { - if (CEF_MEMBER_MISSING(struct_, get_name)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_name(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefWebPluginInfoCToCpp::GetPath() { - if (CEF_MEMBER_MISSING(struct_, get_path)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_path(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefWebPluginInfoCToCpp::GetVersion() { - if (CEF_MEMBER_MISSING(struct_, get_version)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_version(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefWebPluginInfoCToCpp::GetDescription() { - if (CEF_MEMBER_MISSING(struct_, get_description)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_description(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/web_plugin_info_ctocpp.h b/cef1/libcef_dll/ctocpp/web_plugin_info_ctocpp.h deleted file mode 100644 index c1be75da0..000000000 --- a/cef1/libcef_dll/ctocpp/web_plugin_info_ctocpp.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_WEB_PLUGIN_INFO_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_WEB_PLUGIN_INFO_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_web_plugin.h" -#include "include/capi/cef_web_plugin_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefWebPluginInfoCToCpp - : public CefCToCpp { - public: - explicit CefWebPluginInfoCToCpp(cef_web_plugin_info_t* str) - : CefCToCpp(str) {} - virtual ~CefWebPluginInfoCToCpp() {} - - // CefWebPluginInfo methods - virtual CefString GetName() OVERRIDE; - virtual CefString GetPath() OVERRIDE; - virtual CefString GetVersion() OVERRIDE; - virtual CefString GetDescription() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_WEB_PLUGIN_INFO_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/web_urlrequest_client_ctocpp.cc b/cef1/libcef_dll/ctocpp/web_urlrequest_client_ctocpp.cc deleted file mode 100644 index 9d54adcb6..000000000 --- a/cef1/libcef_dll/ctocpp/web_urlrequest_client_ctocpp.cc +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/request_cpptoc.h" -#include "libcef_dll/cpptoc/response_cpptoc.h" -#include "libcef_dll/cpptoc/web_urlrequest_cpptoc.h" -#include "libcef_dll/ctocpp/web_urlrequest_client_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefWebURLRequestClientCToCpp::OnStateChange( - CefRefPtr requester, RequestState state) { - if (CEF_MEMBER_MISSING(struct_, on_state_change)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: requester; type: refptr_diff - DCHECK(requester.get()); - if (!requester.get()) - return; - - // Execute - struct_->on_state_change(struct_, - CefWebURLRequestCppToC::Wrap(requester), - state); -} - -void CefWebURLRequestClientCToCpp::OnRedirect( - CefRefPtr requester, CefRefPtr request, - CefRefPtr response) { - if (CEF_MEMBER_MISSING(struct_, on_redirect)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: requester; type: refptr_diff - DCHECK(requester.get()); - if (!requester.get()) - return; - // Verify param: request; type: refptr_diff - DCHECK(request.get()); - if (!request.get()) - return; - // Verify param: response; type: refptr_diff - DCHECK(response.get()); - if (!response.get()) - return; - - // Execute - struct_->on_redirect(struct_, - CefWebURLRequestCppToC::Wrap(requester), - CefRequestCppToC::Wrap(request), - CefResponseCppToC::Wrap(response)); -} - -void CefWebURLRequestClientCToCpp::OnHeadersReceived( - CefRefPtr requester, CefRefPtr response) { - if (CEF_MEMBER_MISSING(struct_, on_headers_received)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: requester; type: refptr_diff - DCHECK(requester.get()); - if (!requester.get()) - return; - // Verify param: response; type: refptr_diff - DCHECK(response.get()); - if (!response.get()) - return; - - // Execute - struct_->on_headers_received(struct_, - CefWebURLRequestCppToC::Wrap(requester), - CefResponseCppToC::Wrap(response)); -} - -void CefWebURLRequestClientCToCpp::OnProgress( - CefRefPtr requester, uint64 bytesSent, - uint64 totalBytesToBeSent) { - if (CEF_MEMBER_MISSING(struct_, on_progress)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: requester; type: refptr_diff - DCHECK(requester.get()); - if (!requester.get()) - return; - - // Execute - struct_->on_progress(struct_, - CefWebURLRequestCppToC::Wrap(requester), - bytesSent, - totalBytesToBeSent); -} - -void CefWebURLRequestClientCToCpp::OnData(CefRefPtr requester, - const void* data, int dataLength) { - if (CEF_MEMBER_MISSING(struct_, on_data)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: requester; type: refptr_diff - DCHECK(requester.get()); - if (!requester.get()) - return; - // Verify param: data; type: simple_byaddr - DCHECK(data); - if (!data) - return; - - // Execute - struct_->on_data(struct_, - CefWebURLRequestCppToC::Wrap(requester), - data, - dataLength); -} - -void CefWebURLRequestClientCToCpp::OnError( - CefRefPtr requester, ErrorCode errorCode) { - if (CEF_MEMBER_MISSING(struct_, on_error)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: requester; type: refptr_diff - DCHECK(requester.get()); - if (!requester.get()) - return; - - // Execute - struct_->on_error(struct_, - CefWebURLRequestCppToC::Wrap(requester), - errorCode); -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/web_urlrequest_client_ctocpp.h b/cef1/libcef_dll/ctocpp/web_urlrequest_client_ctocpp.h deleted file mode 100644 index 82e4e3002..000000000 --- a/cef1/libcef_dll/ctocpp/web_urlrequest_client_ctocpp.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_WEB_URLREQUEST_CLIENT_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_WEB_URLREQUEST_CLIENT_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_web_urlrequest.h" -#include "include/capi/cef_web_urlrequest_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefWebURLRequestClientCToCpp - : public CefCToCpp { - public: - explicit CefWebURLRequestClientCToCpp(cef_web_urlrequest_client_t* str) - : CefCToCpp(str) {} - virtual ~CefWebURLRequestClientCToCpp() {} - - // CefWebURLRequestClient methods - virtual void OnStateChange(CefRefPtr requester, - RequestState state) OVERRIDE; - virtual void OnRedirect(CefRefPtr requester, - CefRefPtr request, - CefRefPtr response) OVERRIDE; - virtual void OnHeadersReceived(CefRefPtr requester, - CefRefPtr response) OVERRIDE; - virtual void OnProgress(CefRefPtr requester, - uint64 bytesSent, uint64 totalBytesToBeSent) OVERRIDE; - virtual void OnData(CefRefPtr requester, const void* data, - int dataLength) OVERRIDE; - virtual void OnError(CefRefPtr requester, - ErrorCode errorCode) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_WEB_URLREQUEST_CLIENT_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/web_urlrequest_ctocpp.cc b/cef1/libcef_dll/ctocpp/web_urlrequest_ctocpp.cc deleted file mode 100644 index 1c7e9d37c..000000000 --- a/cef1/libcef_dll/ctocpp/web_urlrequest_ctocpp.cc +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/web_urlrequest_client_cpptoc.h" -#include "libcef_dll/ctocpp/request_ctocpp.h" -#include "libcef_dll/ctocpp/web_urlrequest_ctocpp.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefWebURLRequest::CreateWebURLRequest( - CefRefPtr request, CefRefPtr client) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: request; type: refptr_same - DCHECK(request.get()); - if (!request.get()) - return NULL; - // Verify param: client; type: refptr_diff - DCHECK(client.get()); - if (!client.get()) - return NULL; - - // Execute - cef_web_urlrequest_t* _retval = cef_web_urlrequest_create( - CefRequestCToCpp::Unwrap(request), - CefWebURLRequestClientCppToC::Wrap(client)); - - // Return type: refptr_same - return CefWebURLRequestCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -void CefWebURLRequestCToCpp::Cancel() { - if (CEF_MEMBER_MISSING(struct_, cancel)) - return; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - struct_->cancel(struct_); -} - -CefWebURLRequest::RequestState CefWebURLRequestCToCpp::GetState() { - if (CEF_MEMBER_MISSING(struct_, get_state)) - return WUR_STATE_UNSENT; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_weburlrequest_state_t _retval = struct_->get_state(struct_); - - // Return type: simple - return _retval; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/web_urlrequest_ctocpp.h b/cef1/libcef_dll/ctocpp/web_urlrequest_ctocpp.h deleted file mode 100644 index 7c1129851..000000000 --- a/cef1/libcef_dll/ctocpp/web_urlrequest_ctocpp.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_WEB_URLREQUEST_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_WEB_URLREQUEST_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_web_urlrequest.h" -#include "include/capi/cef_web_urlrequest_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefWebURLRequestCToCpp - : public CefCToCpp { - public: - explicit CefWebURLRequestCToCpp(cef_web_urlrequest_t* str) - : CefCToCpp(str) {} - virtual ~CefWebURLRequestCToCpp() {} - - // CefWebURLRequest methods - virtual void Cancel() OVERRIDE; - virtual RequestState GetState() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_WEB_URLREQUEST_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/write_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/write_handler_ctocpp.cc deleted file mode 100644 index 19745e429..000000000 --- a/cef1/libcef_dll/ctocpp/write_handler_ctocpp.cc +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/write_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -size_t CefWriteHandlerCToCpp::Write(const void* ptr, size_t size, size_t n) { - if (CEF_MEMBER_MISSING(struct_, write)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: ptr; type: simple_byaddr - DCHECK(ptr); - if (!ptr) - return 0; - - // Execute - size_t _retval = struct_->write(struct_, - ptr, - size, - n); - - // Return type: simple - return _retval; -} - -int CefWriteHandlerCToCpp::Seek(int64 offset, int whence) { - if (CEF_MEMBER_MISSING(struct_, seek)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->seek(struct_, - offset, - whence); - - // Return type: simple - return _retval; -} - -int64 CefWriteHandlerCToCpp::Tell() { - if (CEF_MEMBER_MISSING(struct_, tell)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int64 _retval = struct_->tell(struct_); - - // Return type: simple - return _retval; -} - -int CefWriteHandlerCToCpp::Flush() { - if (CEF_MEMBER_MISSING(struct_, flush)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->flush(struct_); - - // Return type: simple - return _retval; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/write_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/write_handler_ctocpp.h deleted file mode 100644 index fb13edc2c..000000000 --- a/cef1/libcef_dll/ctocpp/write_handler_ctocpp.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_WRITE_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_WRITE_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_stream.h" -#include "include/capi/cef_stream_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefWriteHandlerCToCpp - : public CefCToCpp { - public: - explicit CefWriteHandlerCToCpp(cef_write_handler_t* str) - : CefCToCpp( - str) {} - virtual ~CefWriteHandlerCToCpp() {} - - // CefWriteHandler methods - virtual size_t Write(const void* ptr, size_t size, size_t n) OVERRIDE; - virtual int Seek(int64 offset, int whence) OVERRIDE; - virtual int64 Tell() OVERRIDE; - virtual int Flush() OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_WRITE_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/xml_reader_ctocpp.cc b/cef1/libcef_dll/ctocpp/xml_reader_ctocpp.cc deleted file mode 100644 index be5c533b7..000000000 --- a/cef1/libcef_dll/ctocpp/xml_reader_ctocpp.cc +++ /dev/null @@ -1,501 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/stream_reader_ctocpp.h" -#include "libcef_dll/ctocpp/xml_reader_ctocpp.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefXmlReader::Create(CefRefPtr stream, - EncodingType encodingType, const CefString& URI) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: stream; type: refptr_same - DCHECK(stream.get()); - if (!stream.get()) - return NULL; - // Verify param: URI; type: string_byref_const - DCHECK(!URI.empty()); - if (URI.empty()) - return NULL; - - // Execute - cef_xml_reader_t* _retval = cef_xml_reader_create( - CefStreamReaderCToCpp::Unwrap(stream), - encodingType, - URI.GetStruct()); - - // Return type: refptr_same - return CefXmlReaderCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefXmlReaderCToCpp::MoveToNextNode() { - if (CEF_MEMBER_MISSING(struct_, move_to_next_node)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->move_to_next_node(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefXmlReaderCToCpp::Close() { - if (CEF_MEMBER_MISSING(struct_, close)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->close(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefXmlReaderCToCpp::HasError() { - if (CEF_MEMBER_MISSING(struct_, has_error)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->has_error(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefString CefXmlReaderCToCpp::GetError() { - if (CEF_MEMBER_MISSING(struct_, get_error)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_error(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefXmlReader::NodeType CefXmlReaderCToCpp::GetType() { - if (CEF_MEMBER_MISSING(struct_, get_type)) - return XML_NODE_UNSUPPORTED; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_xml_node_type_t _retval = struct_->get_type(struct_); - - // Return type: simple - return _retval; -} - -int CefXmlReaderCToCpp::GetDepth() { - if (CEF_MEMBER_MISSING(struct_, get_depth)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_depth(struct_); - - // Return type: simple - return _retval; -} - -CefString CefXmlReaderCToCpp::GetLocalName() { - if (CEF_MEMBER_MISSING(struct_, get_local_name)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_local_name(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefXmlReaderCToCpp::GetPrefix() { - if (CEF_MEMBER_MISSING(struct_, get_prefix)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_prefix(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefXmlReaderCToCpp::GetQualifiedName() { - if (CEF_MEMBER_MISSING(struct_, get_qualified_name)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_qualified_name(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefXmlReaderCToCpp::GetNamespaceURI() { - if (CEF_MEMBER_MISSING(struct_, get_namespace_uri)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_namespace_uri(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefXmlReaderCToCpp::GetBaseURI() { - if (CEF_MEMBER_MISSING(struct_, get_base_uri)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_base_uri(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefXmlReaderCToCpp::GetXmlLang() { - if (CEF_MEMBER_MISSING(struct_, get_xml_lang)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_xml_lang(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -bool CefXmlReaderCToCpp::IsEmptyElement() { - if (CEF_MEMBER_MISSING(struct_, is_empty_element)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->is_empty_element(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefXmlReaderCToCpp::HasValue() { - if (CEF_MEMBER_MISSING(struct_, has_value)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->has_value(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefString CefXmlReaderCToCpp::GetValue() { - if (CEF_MEMBER_MISSING(struct_, get_value)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_value(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -bool CefXmlReaderCToCpp::HasAttributes() { - if (CEF_MEMBER_MISSING(struct_, has_attributes)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->has_attributes(struct_); - - // Return type: bool - return _retval?true:false; -} - -size_t CefXmlReaderCToCpp::GetAttributeCount() { - if (CEF_MEMBER_MISSING(struct_, get_attribute_count)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - size_t _retval = struct_->get_attribute_count(struct_); - - // Return type: simple - return _retval; -} - -CefString CefXmlReaderCToCpp::GetAttribute(int index) { - if (CEF_MEMBER_MISSING(struct_, get_attribute_byindex)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: index; type: simple_byval - DCHECK_GE(index, 0); - if (index < 0) - return CefString(); - - // Execute - cef_string_userfree_t _retval = struct_->get_attribute_byindex(struct_, - index); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefXmlReaderCToCpp::GetAttribute(const CefString& qualifiedName) { - if (CEF_MEMBER_MISSING(struct_, get_attribute_byqname)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: qualifiedName; type: string_byref_const - DCHECK(!qualifiedName.empty()); - if (qualifiedName.empty()) - return CefString(); - - // Execute - cef_string_userfree_t _retval = struct_->get_attribute_byqname(struct_, - qualifiedName.GetStruct()); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefXmlReaderCToCpp::GetAttribute(const CefString& localName, - const CefString& namespaceURI) { - if (CEF_MEMBER_MISSING(struct_, get_attribute_bylname)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: localName; type: string_byref_const - DCHECK(!localName.empty()); - if (localName.empty()) - return CefString(); - // Verify param: namespaceURI; type: string_byref_const - DCHECK(!namespaceURI.empty()); - if (namespaceURI.empty()) - return CefString(); - - // Execute - cef_string_userfree_t _retval = struct_->get_attribute_bylname(struct_, - localName.GetStruct(), - namespaceURI.GetStruct()); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefXmlReaderCToCpp::GetInnerXml() { - if (CEF_MEMBER_MISSING(struct_, get_inner_xml)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_inner_xml(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -CefString CefXmlReaderCToCpp::GetOuterXml() { - if (CEF_MEMBER_MISSING(struct_, get_outer_xml)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_outer_xml(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -int CefXmlReaderCToCpp::GetLineNumber() { - if (CEF_MEMBER_MISSING(struct_, get_line_number)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->get_line_number(struct_); - - // Return type: simple - return _retval; -} - -bool CefXmlReaderCToCpp::MoveToAttribute(int index) { - if (CEF_MEMBER_MISSING(struct_, move_to_attribute_byindex)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: index; type: simple_byval - DCHECK_GE(index, 0); - if (index < 0) - return false; - - // Execute - int _retval = struct_->move_to_attribute_byindex(struct_, - index); - - // Return type: bool - return _retval?true:false; -} - -bool CefXmlReaderCToCpp::MoveToAttribute(const CefString& qualifiedName) { - if (CEF_MEMBER_MISSING(struct_, move_to_attribute_byqname)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: qualifiedName; type: string_byref_const - DCHECK(!qualifiedName.empty()); - if (qualifiedName.empty()) - return false; - - // Execute - int _retval = struct_->move_to_attribute_byqname(struct_, - qualifiedName.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - -bool CefXmlReaderCToCpp::MoveToAttribute(const CefString& localName, - const CefString& namespaceURI) { - if (CEF_MEMBER_MISSING(struct_, move_to_attribute_bylname)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: localName; type: string_byref_const - DCHECK(!localName.empty()); - if (localName.empty()) - return false; - // Verify param: namespaceURI; type: string_byref_const - DCHECK(!namespaceURI.empty()); - if (namespaceURI.empty()) - return false; - - // Execute - int _retval = struct_->move_to_attribute_bylname(struct_, - localName.GetStruct(), - namespaceURI.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - -bool CefXmlReaderCToCpp::MoveToFirstAttribute() { - if (CEF_MEMBER_MISSING(struct_, move_to_first_attribute)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->move_to_first_attribute(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefXmlReaderCToCpp::MoveToNextAttribute() { - if (CEF_MEMBER_MISSING(struct_, move_to_next_attribute)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->move_to_next_attribute(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefXmlReaderCToCpp::MoveToCarryingElement() { - if (CEF_MEMBER_MISSING(struct_, move_to_carrying_element)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->move_to_carrying_element(struct_); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/xml_reader_ctocpp.h b/cef1/libcef_dll/ctocpp/xml_reader_ctocpp.h deleted file mode 100644 index ab8653c76..000000000 --- a/cef1/libcef_dll/ctocpp/xml_reader_ctocpp.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_XML_READER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_XML_READER_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_xml_reader.h" -#include "include/capi/cef_xml_reader_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefXmlReaderCToCpp - : public CefCToCpp { - public: - explicit CefXmlReaderCToCpp(cef_xml_reader_t* str) - : CefCToCpp(str) {} - virtual ~CefXmlReaderCToCpp() {} - - // CefXmlReader methods - virtual bool MoveToNextNode() OVERRIDE; - virtual bool Close() OVERRIDE; - virtual bool HasError() OVERRIDE; - virtual CefString GetError() OVERRIDE; - virtual NodeType GetType() OVERRIDE; - virtual int GetDepth() OVERRIDE; - virtual CefString GetLocalName() OVERRIDE; - virtual CefString GetPrefix() OVERRIDE; - virtual CefString GetQualifiedName() OVERRIDE; - virtual CefString GetNamespaceURI() OVERRIDE; - virtual CefString GetBaseURI() OVERRIDE; - virtual CefString GetXmlLang() OVERRIDE; - virtual bool IsEmptyElement() OVERRIDE; - virtual bool HasValue() OVERRIDE; - virtual CefString GetValue() OVERRIDE; - virtual bool HasAttributes() OVERRIDE; - virtual size_t GetAttributeCount() OVERRIDE; - virtual CefString GetAttribute(int index) OVERRIDE; - virtual CefString GetAttribute(const CefString& qualifiedName) OVERRIDE; - virtual CefString GetAttribute(const CefString& localName, - const CefString& namespaceURI) OVERRIDE; - virtual CefString GetInnerXml() OVERRIDE; - virtual CefString GetOuterXml() OVERRIDE; - virtual int GetLineNumber() OVERRIDE; - virtual bool MoveToAttribute(int index) OVERRIDE; - virtual bool MoveToAttribute(const CefString& qualifiedName) OVERRIDE; - virtual bool MoveToAttribute(const CefString& localName, - const CefString& namespaceURI) OVERRIDE; - virtual bool MoveToFirstAttribute() OVERRIDE; - virtual bool MoveToNextAttribute() OVERRIDE; - virtual bool MoveToCarryingElement() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_XML_READER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/zip_reader_ctocpp.cc b/cef1/libcef_dll/ctocpp/zip_reader_ctocpp.cc deleted file mode 100644 index a1dc226ed..000000000 --- a/cef1/libcef_dll/ctocpp/zip_reader_ctocpp.cc +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/ctocpp/stream_reader_ctocpp.h" -#include "libcef_dll/ctocpp/zip_reader_ctocpp.h" - - -// STATIC METHODS - Body may be edited by hand. - -CefRefPtr CefZipReader::Create( - CefRefPtr stream) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: stream; type: refptr_same - DCHECK(stream.get()); - if (!stream.get()) - return NULL; - - // Execute - cef_zip_reader_t* _retval = cef_zip_reader_create( - CefStreamReaderCToCpp::Unwrap(stream)); - - // Return type: refptr_same - return CefZipReaderCToCpp::Wrap(_retval); -} - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefZipReaderCToCpp::MoveToFirstFile() { - if (CEF_MEMBER_MISSING(struct_, move_to_first_file)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->move_to_first_file(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefZipReaderCToCpp::MoveToNextFile() { - if (CEF_MEMBER_MISSING(struct_, move_to_next_file)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->move_to_next_file(struct_); - - // Return type: bool - return _retval?true:false; -} - -bool CefZipReaderCToCpp::MoveToFile(const CefString& fileName, - bool caseSensitive) { - if (CEF_MEMBER_MISSING(struct_, move_to_file)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: fileName; type: string_byref_const - DCHECK(!fileName.empty()); - if (fileName.empty()) - return false; - - // Execute - int _retval = struct_->move_to_file(struct_, - fileName.GetStruct(), - caseSensitive); - - // Return type: bool - return _retval?true:false; -} - -bool CefZipReaderCToCpp::Close() { - if (CEF_MEMBER_MISSING(struct_, close)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->close(struct_); - - // Return type: bool - return _retval?true:false; -} - -CefString CefZipReaderCToCpp::GetFileName() { - if (CEF_MEMBER_MISSING(struct_, get_file_name)) - return CefString(); - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_string_userfree_t _retval = struct_->get_file_name(struct_); - - // Return type: string - CefString _retvalStr; - _retvalStr.AttachToUserFree(_retval); - return _retvalStr; -} - -int64 CefZipReaderCToCpp::GetFileSize() { - if (CEF_MEMBER_MISSING(struct_, get_file_size)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int64 _retval = struct_->get_file_size(struct_); - - // Return type: simple - return _retval; -} - -time_t CefZipReaderCToCpp::GetFileLastModified() { - if (CEF_MEMBER_MISSING(struct_, get_file_last_modified)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - time_t _retval = struct_->get_file_last_modified(struct_); - - // Return type: simple - return _retval; -} - -bool CefZipReaderCToCpp::OpenFile(const CefString& password) { - if (CEF_MEMBER_MISSING(struct_, open_file)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: password - - // Execute - int _retval = struct_->open_file(struct_, - password.GetStruct()); - - // Return type: bool - return _retval?true:false; -} - -bool CefZipReaderCToCpp::CloseFile() { - if (CEF_MEMBER_MISSING(struct_, close_file)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->close_file(struct_); - - // Return type: bool - return _retval?true:false; -} - -int CefZipReaderCToCpp::ReadFile(void* buffer, size_t bufferSize) { - if (CEF_MEMBER_MISSING(struct_, read_file)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: buffer; type: simple_byaddr - DCHECK(buffer); - if (!buffer) - return 0; - - // Execute - int _retval = struct_->read_file(struct_, - buffer, - bufferSize); - - // Return type: simple - return _retval; -} - -int64 CefZipReaderCToCpp::Tell() { - if (CEF_MEMBER_MISSING(struct_, tell)) - return 0; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int64 _retval = struct_->tell(struct_); - - // Return type: simple - return _retval; -} - -bool CefZipReaderCToCpp::Eof() { - if (CEF_MEMBER_MISSING(struct_, eof)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = struct_->eof(struct_); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/zip_reader_ctocpp.h b/cef1/libcef_dll/ctocpp/zip_reader_ctocpp.h deleted file mode 100644 index 812516d5a..000000000 --- a/cef1/libcef_dll/ctocpp/zip_reader_ctocpp.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_ZIP_READER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_ZIP_READER_CTOCPP_H_ -#pragma once - -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED - -#include "include/cef_zip_reader.h" -#include "include/capi/cef_zip_reader_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed wrapper-side only. -class CefZipReaderCToCpp - : public CefCToCpp { - public: - explicit CefZipReaderCToCpp(cef_zip_reader_t* str) - : CefCToCpp(str) {} - virtual ~CefZipReaderCToCpp() {} - - // CefZipReader methods - virtual bool MoveToFirstFile() OVERRIDE; - virtual bool MoveToNextFile() OVERRIDE; - virtual bool MoveToFile(const CefString& fileName, - bool caseSensitive) OVERRIDE; - virtual bool Close() OVERRIDE; - virtual CefString GetFileName() OVERRIDE; - virtual int64 GetFileSize() OVERRIDE; - virtual time_t GetFileLastModified() OVERRIDE; - virtual bool OpenFile(const CefString& password) OVERRIDE; - virtual bool CloseFile() OVERRIDE; - virtual int ReadFile(void* buffer, size_t bufferSize) OVERRIDE; - virtual int64 Tell() OVERRIDE; - virtual bool Eof() OVERRIDE; -}; - -#endif // USING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_ZIP_READER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/ctocpp/zoom_handler_ctocpp.cc b/cef1/libcef_dll/ctocpp/zoom_handler_ctocpp.cc deleted file mode 100644 index dfcf1bc4a..000000000 --- a/cef1/libcef_dll/ctocpp/zoom_handler_ctocpp.cc +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/ctocpp/zoom_handler_ctocpp.h" - - -// VIRTUAL METHODS - Body may be edited by hand. - -bool CefZoomHandlerCToCpp::OnGetZoomLevel(CefRefPtr browser, - const CefString& url, double& zoomLevel) { - if (CEF_MEMBER_MISSING(struct_, on_get_zoom_level)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return false; - - // Execute - int _retval = struct_->on_get_zoom_level(struct_, - CefBrowserCppToC::Wrap(browser), - url.GetStruct(), - &zoomLevel); - - // Return type: bool - return _retval?true:false; -} - -bool CefZoomHandlerCToCpp::OnSetZoomLevel(CefRefPtr browser, - const CefString& url, double zoomLevel) { - if (CEF_MEMBER_MISSING(struct_, on_set_zoom_level)) - return false; - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: browser; type: refptr_diff - DCHECK(browser.get()); - if (!browser.get()) - return false; - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return false; - - // Execute - int _retval = struct_->on_set_zoom_level(struct_, - CefBrowserCppToC::Wrap(browser), - url.GetStruct(), - zoomLevel); - - // Return type: bool - return _retval?true:false; -} - - -#ifndef NDEBUG -template<> long CefCToCpp::DebugObjCt = 0; -#endif - diff --git a/cef1/libcef_dll/ctocpp/zoom_handler_ctocpp.h b/cef1/libcef_dll/ctocpp/zoom_handler_ctocpp.h deleted file mode 100644 index a8d1c93af..000000000 --- a/cef1/libcef_dll/ctocpp/zoom_handler_ctocpp.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#ifndef CEF_LIBCEF_DLL_CTOCPP_ZOOM_HANDLER_CTOCPP_H_ -#define CEF_LIBCEF_DLL_CTOCPP_ZOOM_HANDLER_CTOCPP_H_ -#pragma once - -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED - -#include "include/cef_zoom_handler.h" -#include "include/capi/cef_zoom_handler_capi.h" -#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -// This class may be instantiated and accessed DLL-side only. -class CefZoomHandlerCToCpp - : public CefCToCpp { - public: - explicit CefZoomHandlerCToCpp(cef_zoom_handler_t* str) - : CefCToCpp( - str) {} - virtual ~CefZoomHandlerCToCpp() {} - - // CefZoomHandler methods - virtual bool OnGetZoomLevel(CefRefPtr browser, - const CefString& url, double& zoomLevel) OVERRIDE; - virtual bool OnSetZoomLevel(CefRefPtr browser, - const CefString& url, double zoomLevel) OVERRIDE; -}; - -#endif // BUILDING_CEF_SHARED -#endif // CEF_LIBCEF_DLL_CTOCPP_ZOOM_HANDLER_CTOCPP_H_ - diff --git a/cef1/libcef_dll/libcef_dll.cc b/cef1/libcef_dll/libcef_dll.cc deleted file mode 100644 index f980d0d4e..000000000 --- a/cef1/libcef_dll/libcef_dll.cc +++ /dev/null @@ -1,491 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "include/cef_app.h" -#include "include/capi/cef_app_capi.h" -#include "include/cef_geolocation.h" -#include "include/capi/cef_geolocation_capi.h" -#include "include/cef_origin_whitelist.h" -#include "include/capi/cef_origin_whitelist_capi.h" -#include "include/cef_scheme.h" -#include "include/capi/cef_scheme_capi.h" -#include "include/cef_task.h" -#include "include/capi/cef_task_capi.h" -#include "include/cef_url.h" -#include "include/capi/cef_url_capi.h" -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "include/cef_web_plugin.h" -#include "include/capi/cef_web_plugin_capi.h" -#include "libcef_dll/cpptoc/browser_cpptoc.h" -#include "libcef_dll/cpptoc/cookie_manager_cpptoc.h" -#include "libcef_dll/cpptoc/domdocument_cpptoc.h" -#include "libcef_dll/cpptoc/domevent_cpptoc.h" -#include "libcef_dll/cpptoc/domnode_cpptoc.h" -#include "libcef_dll/cpptoc/drag_data_cpptoc.h" -#include "libcef_dll/cpptoc/frame_cpptoc.h" -#include "libcef_dll/cpptoc/geolocation_callback_cpptoc.h" -#include "libcef_dll/cpptoc/post_data_cpptoc.h" -#include "libcef_dll/cpptoc/post_data_element_cpptoc.h" -#include "libcef_dll/cpptoc/request_cpptoc.h" -#include "libcef_dll/cpptoc/response_cpptoc.h" -#include "libcef_dll/cpptoc/scheme_handler_callback_cpptoc.h" -#include "libcef_dll/cpptoc/scheme_registrar_cpptoc.h" -#include "libcef_dll/cpptoc/stream_reader_cpptoc.h" -#include "libcef_dll/cpptoc/stream_writer_cpptoc.h" -#include "libcef_dll/cpptoc/v8context_cpptoc.h" -#include "libcef_dll/cpptoc/v8exception_cpptoc.h" -#include "libcef_dll/cpptoc/v8stack_frame_cpptoc.h" -#include "libcef_dll/cpptoc/v8stack_trace_cpptoc.h" -#include "libcef_dll/cpptoc/v8value_cpptoc.h" -#include "libcef_dll/cpptoc/web_plugin_info_cpptoc.h" -#include "libcef_dll/cpptoc/web_urlrequest_cpptoc.h" -#include "libcef_dll/cpptoc/xml_reader_cpptoc.h" -#include "libcef_dll/cpptoc/zip_reader_cpptoc.h" -#include "libcef_dll/ctocpp/app_ctocpp.h" -#include "libcef_dll/ctocpp/content_filter_ctocpp.h" -#include "libcef_dll/ctocpp/cookie_visitor_ctocpp.h" -#include "libcef_dll/ctocpp/domevent_listener_ctocpp.h" -#include "libcef_dll/ctocpp/domvisitor_ctocpp.h" -#include "libcef_dll/ctocpp/display_handler_ctocpp.h" -#include "libcef_dll/ctocpp/download_handler_ctocpp.h" -#include "libcef_dll/ctocpp/drag_handler_ctocpp.h" -#include "libcef_dll/ctocpp/find_handler_ctocpp.h" -#include "libcef_dll/ctocpp/focus_handler_ctocpp.h" -#include "libcef_dll/ctocpp/geolocation_handler_ctocpp.h" -#include "libcef_dll/ctocpp/get_geolocation_callback_ctocpp.h" -#include "libcef_dll/ctocpp/jsdialog_handler_ctocpp.h" -#include "libcef_dll/ctocpp/keyboard_handler_ctocpp.h" -#include "libcef_dll/ctocpp/life_span_handler_ctocpp.h" -#include "libcef_dll/ctocpp/load_handler_ctocpp.h" -#include "libcef_dll/ctocpp/menu_handler_ctocpp.h" -#include "libcef_dll/ctocpp/permission_handler_ctocpp.h" -#include "libcef_dll/ctocpp/print_handler_ctocpp.h" -#include "libcef_dll/ctocpp/proxy_handler_ctocpp.h" -#include "libcef_dll/ctocpp/read_handler_ctocpp.h" -#include "libcef_dll/ctocpp/render_handler_ctocpp.h" -#include "libcef_dll/ctocpp/request_handler_ctocpp.h" -#include "libcef_dll/ctocpp/resource_bundle_handler_ctocpp.h" -#include "libcef_dll/ctocpp/scheme_handler_ctocpp.h" -#include "libcef_dll/ctocpp/scheme_handler_factory_ctocpp.h" -#include "libcef_dll/ctocpp/task_ctocpp.h" -#include "libcef_dll/ctocpp/v8accessor_ctocpp.h" -#include "libcef_dll/ctocpp/v8context_handler_ctocpp.h" -#include "libcef_dll/ctocpp/v8handler_ctocpp.h" -#include "libcef_dll/ctocpp/web_urlrequest_client_ctocpp.h" -#include "libcef_dll/ctocpp/write_handler_ctocpp.h" -#include "libcef_dll/ctocpp/zoom_handler_ctocpp.h" - - -// GLOBAL FUNCTIONS - Body may be edited by hand. - -CEF_EXPORT int cef_initialize(const struct _cef_settings_t* settings, - struct _cef_app_t* application) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: settings; type: struct_byref_const - DCHECK(settings); - if (!settings) - return 0; - // Unverified params: application - - // Translate param: settings; type: struct_byref_const - CefSettings settingsObj; - if (settings) - settingsObj.Set(*settings, false); - - // Execute - bool _retval = CefInitialize( - settingsObj, - CefAppCToCpp::Wrap(application)); - - // Return type: bool - return _retval; -} - -CEF_EXPORT void cef_shutdown() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefShutdown(); - -#ifndef NDEBUG - // Check that all wrapper objects have been destroyed - DCHECK_EQ(CefBrowserCppToC::DebugObjCt, 0); - DCHECK_EQ(CefContentFilterCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefCookieManagerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefCookieVisitorCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefDOMDocumentCppToC::DebugObjCt, 0); - DCHECK_EQ(CefDOMEventCppToC::DebugObjCt, 0); - DCHECK_EQ(CefDOMEventListenerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefDOMNodeCppToC::DebugObjCt, 0); - DCHECK_EQ(CefDOMVisitorCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefDisplayHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefDownloadHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefDragDataCppToC::DebugObjCt, 0); - DCHECK_EQ(CefDragHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefFindHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefFocusHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefFrameCppToC::DebugObjCt, 0); - DCHECK_EQ(CefGeolocationCallbackCppToC::DebugObjCt, 0); - DCHECK_EQ(CefGeolocationHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefGetGeolocationCallbackCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefJSDialogHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefKeyboardHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefLifeSpanHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefLoadHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefMenuHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefPermissionHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefPostDataCppToC::DebugObjCt, 0); - DCHECK_EQ(CefPostDataElementCppToC::DebugObjCt, 0); - DCHECK_EQ(CefPrintHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefProxyHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefReadHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefRenderHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefRequestCppToC::DebugObjCt, 0); - DCHECK_EQ(CefRequestHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefResourceBundleHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefResponseCppToC::DebugObjCt, 0); - DCHECK_EQ(CefSchemeHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefSchemeHandlerCallbackCppToC::DebugObjCt, 0); - DCHECK_EQ(CefSchemeHandlerFactoryCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefSchemeRegistrarCppToC::DebugObjCt, 0); - DCHECK_EQ(CefStreamReaderCppToC::DebugObjCt, 0); - DCHECK_EQ(CefStreamWriterCppToC::DebugObjCt, 0); - DCHECK_EQ(CefTaskCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefV8AccessorCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefV8ContextCppToC::DebugObjCt, 0); - DCHECK_EQ(CefV8ContextHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefV8ExceptionCppToC::DebugObjCt, 0); - DCHECK_EQ(CefV8HandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefV8StackFrameCppToC::DebugObjCt, 0); - DCHECK_EQ(CefV8StackTraceCppToC::DebugObjCt, 0); - DCHECK_EQ(CefV8ValueCppToC::DebugObjCt, 0); - DCHECK_EQ(CefWebPluginInfoCppToC::DebugObjCt, 0); - DCHECK_EQ(CefWebURLRequestClientCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefWebURLRequestCppToC::DebugObjCt, 0); - DCHECK_EQ(CefWriteHandlerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefXmlReaderCppToC::DebugObjCt, 0); - DCHECK_EQ(CefZipReaderCppToC::DebugObjCt, 0); - DCHECK_EQ(CefZoomHandlerCToCpp::DebugObjCt, 0); -#endif // !NDEBUG -} - -CEF_EXPORT void cef_do_message_loop_work() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefDoMessageLoopWork(); -} - -CEF_EXPORT void cef_run_message_loop() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRunMessageLoop(); -} - -CEF_EXPORT void cef_quit_message_loop() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefQuitMessageLoop(); -} - -CEF_EXPORT void cef_set_osmodal_loop(int osModalLoop) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefSetOSModalLoop( - osModalLoop?true:false); -} - -CEF_EXPORT int cef_get_geolocation( - struct _cef_get_geolocation_callback_t* callback) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: callback; type: refptr_diff - DCHECK(callback); - if (!callback) - return 0; - - // Execute - bool _retval = CefGetGeolocation( - CefGetGeolocationCallbackCToCpp::Wrap(callback)); - - // Return type: bool - return _retval; -} - -CEF_EXPORT int cef_add_cross_origin_whitelist_entry( - const cef_string_t* source_origin, const cef_string_t* target_protocol, - const cef_string_t* target_domain, int allow_target_subdomains) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: source_origin; type: string_byref_const - DCHECK(source_origin); - if (!source_origin) - return 0; - // Verify param: target_protocol; type: string_byref_const - DCHECK(target_protocol); - if (!target_protocol) - return 0; - // Unverified params: target_domain - - // Execute - bool _retval = CefAddCrossOriginWhitelistEntry( - CefString(source_origin), - CefString(target_protocol), - CefString(target_domain), - allow_target_subdomains?true:false); - - // Return type: bool - return _retval; -} - -CEF_EXPORT int cef_remove_cross_origin_whitelist_entry( - const cef_string_t* source_origin, const cef_string_t* target_protocol, - const cef_string_t* target_domain, int allow_target_subdomains) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: source_origin; type: string_byref_const - DCHECK(source_origin); - if (!source_origin) - return 0; - // Verify param: target_protocol; type: string_byref_const - DCHECK(target_protocol); - if (!target_protocol) - return 0; - // Unverified params: target_domain - - // Execute - bool _retval = CefRemoveCrossOriginWhitelistEntry( - CefString(source_origin), - CefString(target_protocol), - CefString(target_domain), - allow_target_subdomains?true:false); - - // Return type: bool - return _retval; -} - -CEF_EXPORT int cef_clear_cross_origin_whitelist() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - bool _retval = CefClearCrossOriginWhitelist(); - - // Return type: bool - return _retval; -} - -CEF_EXPORT int cef_register_scheme_handler_factory( - const cef_string_t* scheme_name, const cef_string_t* domain_name, - struct _cef_scheme_handler_factory_t* factory) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: scheme_name; type: string_byref_const - DCHECK(scheme_name); - if (!scheme_name) - return 0; - // Unverified params: domain_name, factory - - // Execute - bool _retval = CefRegisterSchemeHandlerFactory( - CefString(scheme_name), - CefString(domain_name), - CefSchemeHandlerFactoryCToCpp::Wrap(factory)); - - // Return type: bool - return _retval; -} - -CEF_EXPORT int cef_clear_scheme_handler_factories() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - bool _retval = CefClearSchemeHandlerFactories(); - - // Return type: bool - return _retval; -} - -CEF_EXPORT int cef_currently_on(cef_thread_id_t threadId) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - bool _retval = CefCurrentlyOn( - threadId); - - // Return type: bool - return _retval; -} - -CEF_EXPORT int cef_post_task(cef_thread_id_t threadId, - struct _cef_task_t* task) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: task; type: refptr_diff - DCHECK(task); - if (!task) - return 0; - - // Execute - bool _retval = CefPostTask( - threadId, - CefTaskCToCpp::Wrap(task)); - - // Return type: bool - return _retval; -} - -CEF_EXPORT int cef_post_delayed_task(cef_thread_id_t threadId, - struct _cef_task_t* task, int64 delay_ms) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: task; type: refptr_diff - DCHECK(task); - if (!task) - return 0; - - // Execute - bool _retval = CefPostDelayedTask( - threadId, - CefTaskCToCpp::Wrap(task), - delay_ms); - - // Return type: bool - return _retval; -} - -CEF_EXPORT int cef_parse_url(const cef_string_t* url, - struct _cef_urlparts_t* parts) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: url; type: string_byref_const - DCHECK(url); - if (!url) - return 0; - // Verify param: parts; type: struct_byref - DCHECK(parts); - if (!parts) - return 0; - - // Translate param: parts; type: struct_byref - CefURLParts partsObj; - if (parts) - partsObj.AttachTo(*parts); - - // Execute - bool _retval = CefParseURL( - CefString(url), - partsObj); - - // Restore param: parts; type: struct_byref - if (parts) - partsObj.DetachTo(*parts); - - // Return type: bool - return _retval; -} - -CEF_EXPORT int cef_create_url(const struct _cef_urlparts_t* parts, - cef_string_t* url) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: parts; type: struct_byref_const - DCHECK(parts); - if (!parts) - return 0; - // Verify param: url; type: string_byref - DCHECK(url); - if (!url) - return 0; - - // Translate param: parts; type: struct_byref_const - CefURLParts partsObj; - if (parts) - partsObj.Set(*parts, false); - // Translate param: url; type: string_byref - CefString urlStr(url); - - // Execute - bool _retval = CefCreateURL( - partsObj, - urlStr); - - // Return type: bool - return _retval; -} - -CEF_EXPORT int cef_register_extension(const cef_string_t* extension_name, - const cef_string_t* javascript_code, struct _cef_v8handler_t* handler) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: extension_name; type: string_byref_const - DCHECK(extension_name); - if (!extension_name) - return 0; - // Verify param: javascript_code; type: string_byref_const - DCHECK(javascript_code); - if (!javascript_code) - return 0; - // Unverified params: handler - - // Execute - bool _retval = CefRegisterExtension( - CefString(extension_name), - CefString(javascript_code), - CefV8HandlerCToCpp::Wrap(handler)); - - // Return type: bool - return _retval; -} - -CEF_EXPORT size_t cef_get_web_plugin_count() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - size_t _retval = CefGetWebPluginCount(); - - // Return type: simple - return _retval; -} - -CEF_EXPORT struct _cef_web_plugin_info_t* cef_get_web_plugin_info(int index) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - CefRefPtr _retval = CefGetWebPluginInfo( - index); - - // Return type: refptr_same - return CefWebPluginInfoCppToC::Wrap(_retval); -} - -CEF_EXPORT struct _cef_web_plugin_info_t* cef_get_web_plugin_info_byname( - const cef_string_t* name) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(name); - if (!name) - return NULL; - - // Execute - CefRefPtr _retval = CefGetWebPluginInfo( - CefString(name)); - - // Return type: refptr_same - return CefWebPluginInfoCppToC::Wrap(_retval); -} - diff --git a/cef1/libcef_dll/libcef_dll.rc b/cef1/libcef_dll/libcef_dll.rc deleted file mode 100644 index 07c25c174..000000000 --- a/cef1/libcef_dll/libcef_dll.rc +++ /dev/null @@ -1,122 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#include "include/cef_version.h" -#undef APSTUDIO_HIDDEN_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""windows.h""\r\n" - "#include ""include/version.h""\r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_PROMPT DIALOGEX 0, 0, 241, 76 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "JavaScript Prompt" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - DEFPUSHBUTTON "OK",IDOK,131,55,50,14 - LTEXT "",IDC_DIALOGTEXT,16,17,210,18 - PUSHBUTTON "Cancel",IDCANCEL,184,55,50,14 - EDITTEXT IDC_PROMPTEDIT,15,33,210,14,ES_AUTOHSCROLL -END - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,CHROME_VERSION_BUILD,CEF_REVISION,0 - PRODUCTVERSION 1,CHROME_VERSION_BUILD,CEF_REVISION,0 - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "FileDescription", "Chromium Embedded Framework (CEF) Dynamic Link Library" - VALUE "FileVersion", "1." MAKE_STRING(CHROME_VERSION_BUILD) "." MAKE_STRING(CEF_REVISION) - VALUE "InternalName", "libcef" - VALUE "LegalCopyright", "Copyright (C) " MAKE_STRING(COPYRIGHT_YEAR) " The Chromium Embedded Framework Authors" - VALUE "OriginalFilename", "libcef.dll" - VALUE "ProductName", "Chromium Embedded Framework (CEF) Dynamic Link Library" - VALUE "ProductVersion", "1." MAKE_STRING(CHROME_VERSION_BUILD) "." MAKE_STRING(CEF_REVISION) - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/cef1/libcef_dll/libcef_dll2.cc b/cef1/libcef_dll/libcef_dll2.cc deleted file mode 100644 index 5c7b18acc..000000000 --- a/cef1/libcef_dll/libcef_dll2.cc +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "include/cef_nplugin.h" -#include "include/capi/cef_nplugin_capi.h" -#include "include/cef_version.h" -#include "libcef_dll/cef_logging.h" - -CEF_EXPORT int cef_build_revision() { - return CEF_REVISION; -} - -CEF_EXPORT int cef_register_plugin(const cef_plugin_info_t* plugin_info) { - DCHECK(plugin_info); - if (!plugin_info) - return 0; - - return CefRegisterPlugin(*plugin_info); -} diff --git a/cef1/libcef_dll/resource.h b/cef1/libcef_dll/resource.h deleted file mode 100644 index bbdac5be4..000000000 --- a/cef1/libcef_dll/resource.h +++ /dev/null @@ -1,23 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by libcef_dll.rc -// - -// Avoid files associated with MacOS -#define _X86_ - -#define IDD_PROMPT 132 -#define IDC_PROMPTEDIT 1000 -#define IDC_DIALOGTEXT 1001 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 130 -#define _APS_NEXT_COMMAND_VALUE 32000 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 110 -#endif -#endif diff --git a/cef1/libcef_dll/transfer_util.cpp b/cef1/libcef_dll/transfer_util.cpp deleted file mode 100644 index e9d8d4e22..000000000 --- a/cef1/libcef_dll/transfer_util.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework 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 "transfer_util.h" - -void transfer_string_list_contents(cef_string_list_t fromList, - StringList& toList) -{ - int size = cef_string_list_size(fromList); - CefString value; - - for(int i = 0; i < size; i++) { - cef_string_list_value(fromList, i, value.GetWritableStruct()); - toList.push_back(value); - } -} - -void transfer_string_list_contents(const StringList& fromList, - cef_string_list_t toList) -{ - size_t size = fromList.size(); - for(size_t i = 0; i < size; ++i) - cef_string_list_append(toList, fromList[i].GetStruct()); -} - -void transfer_string_map_contents(cef_string_map_t fromMap, - StringMap& toMap) -{ - int size = cef_string_map_size(fromMap); - CefString key, value; - - for(int i = 0; i < size; ++i) { - cef_string_map_key(fromMap, i, key.GetWritableStruct()); - cef_string_map_value(fromMap, i, value.GetWritableStruct()); - - toMap.insert(std::make_pair(key, value)); - } -} - -void transfer_string_map_contents(const StringMap& fromMap, - cef_string_map_t toMap) -{ - StringMap::const_iterator it = fromMap.begin(); - for(; it != fromMap.end(); ++it) - cef_string_map_append(toMap, it->first.GetStruct(), it->second.GetStruct()); -} - -void transfer_string_multimap_contents(cef_string_multimap_t fromMap, - StringMultimap& toMap) -{ - int size = cef_string_multimap_size(fromMap); - CefString key, value; - - for(int i = 0; i < size; ++i) { - cef_string_multimap_key(fromMap, i, key.GetWritableStruct()); - cef_string_multimap_value(fromMap, i, value.GetWritableStruct()); - - toMap.insert(std::make_pair(key, value)); - } -} - -void transfer_string_multimap_contents(const StringMultimap& fromMap, - cef_string_multimap_t toMap) -{ - StringMultimap::const_iterator it = fromMap.begin(); - for(; it != fromMap.end(); ++it) { - cef_string_multimap_append(toMap, - it->first.GetStruct(), - it->second.GetStruct()); - } -} diff --git a/cef1/libcef_dll/transfer_util.h b/cef1/libcef_dll/transfer_util.h deleted file mode 100644 index 88dff1a38..000000000 --- a/cef1/libcef_dll/transfer_util.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_LIBCEF_DLL_TRANSFER_UTIL_H_ -#define CEF_LIBCEF_DLL_TRANSFER_UTIL_H_ -#pragma once - -#include -#include - -#include "include/internal/cef_string_list.h" -#include "include/internal/cef_string_map.h" -#include "include/internal/cef_string_multimap.h" - -// Copy contents from one list type to another. -typedef std::vector StringList; -void transfer_string_list_contents(cef_string_list_t fromList, - StringList& toList); -void transfer_string_list_contents(const StringList& fromList, - cef_string_list_t toList); - -// Copy contents from one map type to another. -typedef std::map StringMap; -void transfer_string_map_contents(cef_string_map_t fromMap, - StringMap& toMap); -void transfer_string_map_contents(const StringMap& fromMap, - cef_string_map_t toMap); - -// Copy contents from one map type to another. -typedef std::multimap StringMultimap; -void transfer_string_multimap_contents(cef_string_multimap_t fromMap, - StringMultimap& toMap); -void transfer_string_multimap_contents(const StringMultimap& fromMap, - cef_string_multimap_t toMap); - -#endif // CEF_LIBCEF_DLL_TRANSFER_UTIL_H_ diff --git a/cef1/libcef_dll/wrapper/cef_byte_read_handler.cc b/cef1/libcef_dll/wrapper/cef_byte_read_handler.cc deleted file mode 100644 index 77a0188f6..000000000 --- a/cef1/libcef_dll/wrapper/cef_byte_read_handler.cc +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework 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 "include/wrapper/cef_byte_read_handler.h" -#include -#include "libcef_dll/cef_logging.h" - -CefByteReadHandler::CefByteReadHandler(const unsigned char* bytes, size_t size, - CefRefPtr source) - : bytes_(bytes), size_(size), offset_(0), source_(source) { -} - -size_t CefByteReadHandler::Read(void* ptr, size_t size, size_t n) { - AutoLock lock_scope(this); - size_t s = static_cast(size_ - offset_) / size; - size_t ret = std::min(n, s); - memcpy(ptr, bytes_ + offset_, ret * size); - offset_ += ret * size; - return ret; -} - -int CefByteReadHandler::Seek(int64 offset, int whence) { - int rv = -1L; - AutoLock lock_scope(this); - switch (whence) { - case SEEK_CUR: - if (offset_ + offset > size_ || offset_ + offset < 0) - break; - offset_ += offset; - rv = 0; - break; - case SEEK_END: { -#if defined(OS_WIN) - int64 offset_abs = _abs64(offset); -#else - int64 offset_abs = abs(offset); -#endif - if (offset_abs > size_) - break; - offset_ = size_ - offset_abs; - rv = 0; - break; - } - case SEEK_SET: - if (offset > size_ || offset < 0) - break; - offset_ = offset; - rv = 0; - break; - } - - return rv; -} - -int64 CefByteReadHandler::Tell() { - AutoLock lock_scope(this); - return offset_; -} - -int CefByteReadHandler::Eof() { - AutoLock lock_scope(this); - return (offset_ >= size_); -} diff --git a/cef1/libcef_dll/wrapper/cef_xml_object.cc b/cef1/libcef_dll/wrapper/cef_xml_object.cc deleted file mode 100644 index 49b1ff586..000000000 --- a/cef1/libcef_dll/wrapper/cef_xml_object.cc +++ /dev/null @@ -1,456 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework 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 "include/wrapper/cef_xml_object.h" -#include "include/cef_stream.h" -#include "libcef_dll/cef_logging.h" -#include - -namespace { - -class CefXmlObjectLoader { - public: - explicit CefXmlObjectLoader(CefRefPtr root_object) - : root_object_(root_object) { - } - - bool Load(CefRefPtr stream, - CefXmlReader::EncodingType encodingType, - const CefString& URI) { - CefRefPtr reader( - CefXmlReader::Create(stream, encodingType, URI)); - if (!reader.get()) - return false; - - bool ret = reader->MoveToNextNode(); - if (ret) { - CefRefPtr cur_object(root_object_), new_object; - CefXmlObject::ObjectVector queue; - int cur_depth, value_depth = -1; - CefXmlReader::NodeType cur_type; - std::stringstream cur_value; - bool last_has_ns = false; - - queue.push_back(root_object_); - - do { - cur_depth = reader->GetDepth(); - if (value_depth >= 0 && cur_depth > value_depth) { - // The current node has already been parsed as part of a value. - continue; - } - - cur_type = reader->GetType(); - if (cur_type == XML_NODE_ELEMENT_START) { - if (cur_depth == value_depth) { - // Add to the current value. - cur_value << std::string(reader->GetOuterXml()); - continue; - } else if (last_has_ns && reader->GetPrefix().empty()) { - if (!cur_object->HasChildren()) { - // Start a new value because the last element has a namespace and - // this element does not. - value_depth = cur_depth; - cur_value << std::string(reader->GetOuterXml()); - } else { - // Value following a child element is not allowed. - std::stringstream ss; - ss << L"Value following child element, line " << - reader->GetLineNumber(); - load_error_ = ss.str(); - ret = false; - break; - } - } else { - // Start a new element. - new_object = new CefXmlObject(reader->GetQualifiedName()); - cur_object->AddChild(new_object); - last_has_ns = !reader->GetPrefix().empty(); - - if (!reader->IsEmptyElement()) { - // The new element potentially has a value and/or children, so - // set the current object and add the object to the queue. - cur_object = new_object; - queue.push_back(cur_object); - } - - if (reader->HasAttributes() && reader->MoveToFirstAttribute()) { - // Read all object attributes. - do { - new_object->SetAttributeValue(reader->GetQualifiedName(), - reader->GetValue()); - } while (reader->MoveToNextAttribute()); - reader->MoveToCarryingElement(); - } - } - } else if (cur_type == XML_NODE_ELEMENT_END) { - if (cur_depth == value_depth) { - // Ending an element that is already in the value. - continue; - } else if (cur_depth < value_depth) { - // Done with parsing the value portion of the current element. - cur_object->SetValue(cur_value.str()); - cur_value.str(""); - value_depth = -1; - } - - // Pop the current element from the queue. - queue.pop_back(); - - if (queue.empty() || - cur_object->GetName() != reader->GetQualifiedName()) { - // Open tag without close tag or close tag without open tag should - // never occur (the parser catches this error). - DCHECK(false); - std::stringstream ss; - ss << "Mismatched end tag for " << - std::string(cur_object->GetName()) << - ", line " << reader->GetLineNumber(); - load_error_ = ss.str(); - ret = false; - break; - } - - // Set the current object to the previous object in the queue. - cur_object = queue.back().get(); - } else if (cur_type == XML_NODE_TEXT || cur_type == XML_NODE_CDATA || - cur_type == XML_NODE_ENTITY_REFERENCE) { - if (cur_depth == value_depth) { - // Add to the current value. - cur_value << std::string(reader->GetValue()); - } else if (!cur_object->HasChildren()) { - // Start a new value. - value_depth = cur_depth; - cur_value << std::string(reader->GetValue()); - } else { - // Value following a child element is not allowed. - std::stringstream ss; - ss << "Value following child element, line " << - reader->GetLineNumber(); - load_error_ = ss.str(); - ret = false; - break; - } - } - } while (reader->MoveToNextNode()); - } - - if (reader->HasError()) { - load_error_ = reader->GetError(); - return false; - } - - return ret; - } - - CefString GetLoadError() { return load_error_; } - - private: - CefString load_error_; - CefRefPtr root_object_; -}; - -} // namespace - -CefXmlObject::CefXmlObject(const CefString& name) - : name_(name), parent_(NULL) { -} - -CefXmlObject::~CefXmlObject() { -} - -bool CefXmlObject::Load(CefRefPtr stream, - CefXmlReader::EncodingType encodingType, - const CefString& URI, CefString* loadError) { - AutoLock lock_scope(this); - Clear(); - - CefXmlObjectLoader loader(this); - if (!loader.Load(stream, encodingType, URI)) { - if (loadError) - *loadError = loader.GetLoadError(); - return false; - } - return true; -} - -void CefXmlObject::Set(CefRefPtr object) { - DCHECK(object.get()); - - AutoLock lock_scope1(this); - AutoLock lock_scope2(object); - - Clear(); - name_ = object->GetName(); - Append(object, true); -} - -void CefXmlObject::Append(CefRefPtr object, - bool overwriteAttributes) { - DCHECK(object.get()); - - AutoLock lock_scope1(this); - AutoLock lock_scope2(object); - - if (object->HasChildren()) { - ObjectVector children; - object->GetChildren(children); - ObjectVector::const_iterator it = children.begin(); - for (; it != children.end(); ++it) - AddChild((*it)->Duplicate()); - } - - if (object->HasAttributes()) { - AttributeMap attributes; - object->GetAttributes(attributes); - AttributeMap::const_iterator it = attributes.begin(); - for (; it != attributes.end(); ++it) { - if (overwriteAttributes || !HasAttribute(it->first)) - SetAttributeValue(it->first, it->second); - } - } -} - -CefRefPtr CefXmlObject::Duplicate() { - CefRefPtr new_obj; - { - AutoLock lock_scope(this); - new_obj = new CefXmlObject(name_); - new_obj->Append(this, true); - } - return new_obj; -} - -void CefXmlObject::Clear() { - AutoLock lock_scope(this); - ClearChildren(); - ClearAttributes(); -} - -CefString CefXmlObject::GetName() { - CefString name; - { - AutoLock lock_scope(this); - name = name_; - } - return name; -} - -bool CefXmlObject::SetName(const CefString& name) { - DCHECK(!name.empty()); - if (name.empty()) - return false; - - AutoLock lock_scope(this); - name_ = name; - return true; -} - -bool CefXmlObject::HasParent() { - AutoLock lock_scope(this); - return (parent_ != NULL); -} - -CefRefPtr CefXmlObject::GetParent() { - CefRefPtr parent; - { - AutoLock lock_scope(this); - parent = parent_; - } - return parent; -} - -bool CefXmlObject::HasValue() { - AutoLock lock_scope(this); - return !value_.empty(); -} - -CefString CefXmlObject::GetValue() { - CefString value; - { - AutoLock lock_scope(this); - value = value_; - } - return value; -} - -bool CefXmlObject::SetValue(const CefString& value) { - AutoLock lock_scope(this); - DCHECK(children_.empty()); - if (!children_.empty()) - return false; - value_ = value; - return true; -} - -bool CefXmlObject::HasAttributes() { - AutoLock lock_scope(this); - return !attributes_.empty(); -} - -size_t CefXmlObject::GetAttributeCount() { - AutoLock lock_scope(this); - return attributes_.size(); -} - -bool CefXmlObject::HasAttribute(const CefString& name) { - if (name.empty()) - return false; - - AutoLock lock_scope(this); - AttributeMap::const_iterator it = attributes_.find(name); - return (it != attributes_.end()); -} - -CefString CefXmlObject::GetAttributeValue(const CefString& name) { - DCHECK(!name.empty()); - CefString value; - if (!name.empty()) { - AutoLock lock_scope(this); - AttributeMap::const_iterator it = attributes_.find(name); - if (it != attributes_.end()) - value = it->second; - } - return value; -} - -bool CefXmlObject::SetAttributeValue(const CefString& name, - const CefString& value) { - DCHECK(!name.empty()); - if (name.empty()) - return false; - - AutoLock lock_scope(this); - AttributeMap::iterator it = attributes_.find(name); - if (it != attributes_.end()) { - it->second = value; - } else { - attributes_.insert(std::make_pair(name, value)); - } - return true; -} - -size_t CefXmlObject::GetAttributes(AttributeMap& attributes) { - AutoLock lock_scope(this); - attributes = attributes_; - return attributes_.size(); -} - -void CefXmlObject::ClearAttributes() { - AutoLock lock_scope(this); - attributes_.clear(); -} - -bool CefXmlObject::HasChildren() { - AutoLock lock_scope(this); - return !children_.empty(); -} - -size_t CefXmlObject::GetChildCount() { - AutoLock lock_scope(this); - return children_.size(); -} - -bool CefXmlObject::HasChild(CefRefPtr child) { - DCHECK(child.get()); - - AutoLock lock_scope(this); - ObjectVector::const_iterator it = children_.begin(); - for (; it != children_.end(); ++it) { - if ((*it).get() == child.get()) - return true; - } - return false; -} - -bool CefXmlObject::AddChild(CefRefPtr child) { - DCHECK(child.get()); - if (!child.get()) - return false; - - AutoLock lock_scope1(child); - - DCHECK(child->GetParent() == NULL); - if (child->GetParent() != NULL) - return false; - - AutoLock lock_scope2(this); - - children_.push_back(child); - child->SetParent(this); - return true; -} - -bool CefXmlObject::RemoveChild(CefRefPtr child) { - DCHECK(child.get()); - - AutoLock lock_scope(this); - ObjectVector::iterator it = children_.begin(); - for (; it != children_.end(); ++it) { - if ((*it).get() == child.get()) { - children_.erase(it); - child->SetParent(NULL); - return true; - } - } - return false; -} - -size_t CefXmlObject::GetChildren(ObjectVector& children) { - AutoLock lock_scope(this); - children = children_; - return children_.size(); -} - -void CefXmlObject::ClearChildren() { - AutoLock lock_scope(this); - ObjectVector::iterator it = children_.begin(); - for (; it != children_.end(); ++it) - (*it)->SetParent(NULL); - children_.clear(); -} - -CefRefPtr CefXmlObject::FindChild(const CefString& name) { - DCHECK(!name.empty()); - if (name.empty()) - return NULL; - - AutoLock lock_scope(this); - ObjectVector::const_iterator it = children_.begin(); - for (; it != children_.end(); ++it) { - if ((*it)->GetName() == name) - return (*it); - } - return NULL; -} - -size_t CefXmlObject::FindChildren(const CefString& name, - ObjectVector& children) { - DCHECK(!name.empty()); - if (name.empty()) - return 0; - - size_t ct = 0; - - AutoLock lock_scope(this); - ObjectVector::const_iterator it = children_.begin(); - for (; it != children_.end(); ++it) { - if ((*it)->GetName() == name) { - children.push_back(*it); - ct++; - } - } - return ct; -} - -void CefXmlObject::SetParent(CefXmlObject* parent) { - AutoLock lock_scope(this); - if (parent) { - DCHECK(parent_ == NULL); - parent_ = parent; - } else { - DCHECK(parent_ != NULL); - parent_ = NULL; - } -} diff --git a/cef1/libcef_dll/wrapper/cef_zip_archive.cc b/cef1/libcef_dll/wrapper/cef_zip_archive.cc deleted file mode 100644 index b248e40d2..000000000 --- a/cef1/libcef_dll/wrapper/cef_zip_archive.cc +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#if defined(__linux__) -#include -#endif - -#include -#include -#include "include/wrapper/cef_zip_archive.h" -#include "include/cef_stream.h" -#include "include/cef_zip_reader.h" -#include "include/wrapper/cef_byte_read_handler.h" -#include "libcef_dll/cef_logging.h" - -namespace { - -class CefZipFile : public CefZipArchive::File { - public: - explicit CefZipFile(size_t size) : data_(size) {} - ~CefZipFile() {} - - // Returns the read-only data contained in the file. - virtual const unsigned char* GetData() { return &data_[0]; } - - // Returns the size of the data in the file. - virtual size_t GetDataSize() { return data_.size(); } - - // Returns a CefStreamReader object for streaming the contents of the file. - virtual CefRefPtr GetStreamReader() { - CefRefPtr handler( - new CefByteReadHandler(GetData(), GetDataSize(), this)); - return CefStreamReader::CreateForHandler(handler); - } - - std::vector* GetDataVector() { return &data_; } - - private: - std::vector data_; - - IMPLEMENT_REFCOUNTING(CefZipFile); -}; - -} // namespace - -// CefZipArchive implementation - -CefZipArchive::CefZipArchive() { -} - -CefZipArchive::~CefZipArchive() { -} - -size_t CefZipArchive::Load(CefRefPtr stream, - bool overwriteExisting) { - AutoLock lock_scope(this); - - CefRefPtr reader(CefZipReader::Create(stream)); - if (!reader.get()) - return 0; - - if (!reader->MoveToFirstFile()) - return 0; - - std::wstring name; - CefRefPtr contents; - FileMap::iterator it; - std::vector* data; - size_t count = 0, size, offset; - - do { - size = static_cast(reader->GetFileSize()); - if (size == 0) { - // Skip directories and empty files. - continue; - } - - if (!reader->OpenFile(CefString())) - break; - - name = reader->GetFileName(); - std::transform(name.begin(), name.end(), name.begin(), towlower); - - it = contents_.find(name); - if (it != contents_.end()) { - if (overwriteExisting) - contents_.erase(it); - else // Skip files that already exist. - continue; - } - - contents = new CefZipFile(size); - data = contents->GetDataVector(); - offset = 0; - - // Read the file contents. - do { - offset += reader->ReadFile(&(*data)[offset], size - offset); - } while (offset < size && !reader->Eof()); - - DCHECK(offset == size); - - reader->CloseFile(); - count++; - - // Add the file to the map. - contents_.insert(std::make_pair(name, contents.get())); - } while (reader->MoveToNextFile()); - - return count; -} - -void CefZipArchive::Clear() { - AutoLock lock_scope(this); - contents_.clear(); -} - -size_t CefZipArchive::GetFileCount() { - AutoLock lock_scope(this); - return contents_.size(); -} - -bool CefZipArchive::HasFile(const CefString& fileName) { - std::wstring str = fileName; - std::transform(str.begin(), str.end(), str.begin(), towlower); - - AutoLock lock_scope(this); - FileMap::const_iterator it = contents_.find(CefString(str)); - return (it != contents_.end()); -} - -CefRefPtr CefZipArchive::GetFile( - const CefString& fileName) { - std::wstring str = fileName; - std::transform(str.begin(), str.end(), str.begin(), towlower); - - AutoLock lock_scope(this); - FileMap::const_iterator it = contents_.find(CefString(str)); - if (it != contents_.end()) - return it->second; - return NULL; -} - -bool CefZipArchive::RemoveFile(const CefString& fileName) { - std::wstring str = fileName; - std::transform(str.begin(), str.end(), str.begin(), towlower); - - AutoLock lock_scope(this); - FileMap::iterator it = contents_.find(CefString(str)); - if (it != contents_.end()) { - contents_.erase(it); - return true; - } - return false; -} - -size_t CefZipArchive::GetFiles(FileMap& map) { - AutoLock lock_scope(this); - map = contents_; - return contents_.size(); -} diff --git a/cef1/libcef_dll/wrapper/libcef_dll_wrapper.cc b/cef1/libcef_dll/wrapper/libcef_dll_wrapper.cc deleted file mode 100644 index 16a1b5e16..000000000 --- a/cef1/libcef_dll/wrapper/libcef_dll_wrapper.cc +++ /dev/null @@ -1,461 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -#include "include/cef_app.h" -#include "include/capi/cef_app_capi.h" -#include "include/cef_geolocation.h" -#include "include/capi/cef_geolocation_capi.h" -#include "include/cef_origin_whitelist.h" -#include "include/capi/cef_origin_whitelist_capi.h" -#include "include/cef_scheme.h" -#include "include/capi/cef_scheme_capi.h" -#include "include/cef_task.h" -#include "include/capi/cef_task_capi.h" -#include "include/cef_url.h" -#include "include/capi/cef_url_capi.h" -#include "include/cef_v8.h" -#include "include/capi/cef_v8_capi.h" -#include "include/cef_web_plugin.h" -#include "include/capi/cef_web_plugin_capi.h" -#include "include/cef_version.h" -#include "libcef_dll/cpptoc/app_cpptoc.h" -#include "libcef_dll/cpptoc/content_filter_cpptoc.h" -#include "libcef_dll/cpptoc/cookie_visitor_cpptoc.h" -#include "libcef_dll/cpptoc/domevent_listener_cpptoc.h" -#include "libcef_dll/cpptoc/domvisitor_cpptoc.h" -#include "libcef_dll/cpptoc/display_handler_cpptoc.h" -#include "libcef_dll/cpptoc/download_handler_cpptoc.h" -#include "libcef_dll/cpptoc/drag_handler_cpptoc.h" -#include "libcef_dll/cpptoc/find_handler_cpptoc.h" -#include "libcef_dll/cpptoc/focus_handler_cpptoc.h" -#include "libcef_dll/cpptoc/geolocation_handler_cpptoc.h" -#include "libcef_dll/cpptoc/get_geolocation_callback_cpptoc.h" -#include "libcef_dll/cpptoc/jsdialog_handler_cpptoc.h" -#include "libcef_dll/cpptoc/keyboard_handler_cpptoc.h" -#include "libcef_dll/cpptoc/life_span_handler_cpptoc.h" -#include "libcef_dll/cpptoc/load_handler_cpptoc.h" -#include "libcef_dll/cpptoc/menu_handler_cpptoc.h" -#include "libcef_dll/cpptoc/permission_handler_cpptoc.h" -#include "libcef_dll/cpptoc/print_handler_cpptoc.h" -#include "libcef_dll/cpptoc/proxy_handler_cpptoc.h" -#include "libcef_dll/cpptoc/read_handler_cpptoc.h" -#include "libcef_dll/cpptoc/render_handler_cpptoc.h" -#include "libcef_dll/cpptoc/request_handler_cpptoc.h" -#include "libcef_dll/cpptoc/resource_bundle_handler_cpptoc.h" -#include "libcef_dll/cpptoc/scheme_handler_cpptoc.h" -#include "libcef_dll/cpptoc/scheme_handler_factory_cpptoc.h" -#include "libcef_dll/cpptoc/task_cpptoc.h" -#include "libcef_dll/cpptoc/v8accessor_cpptoc.h" -#include "libcef_dll/cpptoc/v8context_handler_cpptoc.h" -#include "libcef_dll/cpptoc/v8handler_cpptoc.h" -#include "libcef_dll/cpptoc/web_urlrequest_client_cpptoc.h" -#include "libcef_dll/cpptoc/write_handler_cpptoc.h" -#include "libcef_dll/cpptoc/zoom_handler_cpptoc.h" -#include "libcef_dll/ctocpp/browser_ctocpp.h" -#include "libcef_dll/ctocpp/cookie_manager_ctocpp.h" -#include "libcef_dll/ctocpp/domdocument_ctocpp.h" -#include "libcef_dll/ctocpp/domevent_ctocpp.h" -#include "libcef_dll/ctocpp/domnode_ctocpp.h" -#include "libcef_dll/ctocpp/drag_data_ctocpp.h" -#include "libcef_dll/ctocpp/frame_ctocpp.h" -#include "libcef_dll/ctocpp/geolocation_callback_ctocpp.h" -#include "libcef_dll/ctocpp/post_data_ctocpp.h" -#include "libcef_dll/ctocpp/post_data_element_ctocpp.h" -#include "libcef_dll/ctocpp/request_ctocpp.h" -#include "libcef_dll/ctocpp/response_ctocpp.h" -#include "libcef_dll/ctocpp/scheme_handler_callback_ctocpp.h" -#include "libcef_dll/ctocpp/scheme_registrar_ctocpp.h" -#include "libcef_dll/ctocpp/stream_reader_ctocpp.h" -#include "libcef_dll/ctocpp/stream_writer_ctocpp.h" -#include "libcef_dll/ctocpp/v8context_ctocpp.h" -#include "libcef_dll/ctocpp/v8exception_ctocpp.h" -#include "libcef_dll/ctocpp/v8stack_frame_ctocpp.h" -#include "libcef_dll/ctocpp/v8stack_trace_ctocpp.h" -#include "libcef_dll/ctocpp/v8value_ctocpp.h" -#include "libcef_dll/ctocpp/web_plugin_info_ctocpp.h" -#include "libcef_dll/ctocpp/web_urlrequest_ctocpp.h" -#include "libcef_dll/ctocpp/xml_reader_ctocpp.h" -#include "libcef_dll/ctocpp/zip_reader_ctocpp.h" - -// Define used to facilitate parsing. -#define CEF_GLOBAL - - -// GLOBAL METHODS - Body may be edited by hand. - -CEF_GLOBAL bool CefInitialize(const CefSettings& settings, - CefRefPtr application) { - int build_revision = cef_build_revision(); - if (build_revision != CEF_REVISION) { - // The libcef build revision does not match the CEF API revision. - DCHECK(false); - return false; - } - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Unverified params: application - - // Execute - int _retval = cef_initialize( - &settings, - CefAppCppToC::Wrap(application)); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL void CefShutdown() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_shutdown(); - -#ifndef NDEBUG - // Check that all wrapper objects have been destroyed - DCHECK_EQ(CefBrowserCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefContentFilterCppToC::DebugObjCt, 0); - DCHECK_EQ(CefCookieManagerCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefCookieVisitorCppToC::DebugObjCt, 0); - DCHECK_EQ(CefDOMDocumentCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefDOMEventCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefDOMEventListenerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefDOMNodeCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefDOMVisitorCppToC::DebugObjCt, 0); - DCHECK_EQ(CefDisplayHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefDownloadHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefDragDataCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefDragHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefFindHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefFocusHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefFrameCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefGeolocationCallbackCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefGeolocationHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefGetGeolocationCallbackCppToC::DebugObjCt, 0); - DCHECK_EQ(CefJSDialogHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefKeyboardHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefLifeSpanHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefLoadHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefMenuHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefPermissionHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefPostDataCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefPostDataElementCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefPrintHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefProxyHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefReadHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefRenderHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefRequestCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefRequestHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefResourceBundleHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefResponseCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefSchemeHandlerCallbackCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefSchemeHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefSchemeHandlerFactoryCppToC::DebugObjCt, 0); - DCHECK_EQ(CefSchemeRegistrarCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefStreamReaderCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefStreamWriterCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefTaskCppToC::DebugObjCt, 0); - DCHECK_EQ(CefV8AccessorCppToC::DebugObjCt, 0); - DCHECK_EQ(CefV8ContextCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefV8ContextHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefV8ExceptionCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefV8HandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefV8StackFrameCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefV8StackTraceCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefV8ValueCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefWebPluginInfoCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefWebURLRequestCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefWebURLRequestClientCppToC::DebugObjCt, 0); - DCHECK_EQ(CefWriteHandlerCppToC::DebugObjCt, 0); - DCHECK_EQ(CefXmlReaderCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefZipReaderCToCpp::DebugObjCt, 0); - DCHECK_EQ(CefZoomHandlerCppToC::DebugObjCt, 0); -#endif // !NDEBUG -} - -CEF_GLOBAL void CefDoMessageLoopWork() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_do_message_loop_work(); -} - -CEF_GLOBAL void CefRunMessageLoop() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_run_message_loop(); -} - -CEF_GLOBAL void CefQuitMessageLoop() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_quit_message_loop(); -} - -CEF_GLOBAL void CefSetOSModalLoop(bool osModalLoop) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_set_osmodal_loop( - osModalLoop); -} - -CEF_GLOBAL bool CefGetGeolocation( - CefRefPtr callback) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: callback; type: refptr_diff - DCHECK(callback.get()); - if (!callback.get()) - return false; - - // Execute - int _retval = cef_get_geolocation( - CefGetGeolocationCallbackCppToC::Wrap(callback)); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL bool CefAddCrossOriginWhitelistEntry(const CefString& source_origin, - const CefString& target_protocol, const CefString& target_domain, - bool allow_target_subdomains) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: source_origin; type: string_byref_const - DCHECK(!source_origin.empty()); - if (source_origin.empty()) - return false; - // Verify param: target_protocol; type: string_byref_const - DCHECK(!target_protocol.empty()); - if (target_protocol.empty()) - return false; - // Unverified params: target_domain - - // Execute - int _retval = cef_add_cross_origin_whitelist_entry( - source_origin.GetStruct(), - target_protocol.GetStruct(), - target_domain.GetStruct(), - allow_target_subdomains); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL bool CefRemoveCrossOriginWhitelistEntry( - const CefString& source_origin, const CefString& target_protocol, - const CefString& target_domain, bool allow_target_subdomains) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: source_origin; type: string_byref_const - DCHECK(!source_origin.empty()); - if (source_origin.empty()) - return false; - // Verify param: target_protocol; type: string_byref_const - DCHECK(!target_protocol.empty()); - if (target_protocol.empty()) - return false; - // Unverified params: target_domain - - // Execute - int _retval = cef_remove_cross_origin_whitelist_entry( - source_origin.GetStruct(), - target_protocol.GetStruct(), - target_domain.GetStruct(), - allow_target_subdomains); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL bool CefClearCrossOriginWhitelist() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = cef_clear_cross_origin_whitelist(); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL bool CefRegisterSchemeHandlerFactory(const CefString& scheme_name, - const CefString& domain_name, - CefRefPtr factory) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: scheme_name; type: string_byref_const - DCHECK(!scheme_name.empty()); - if (scheme_name.empty()) - return false; - // Unverified params: domain_name, factory - - // Execute - int _retval = cef_register_scheme_handler_factory( - scheme_name.GetStruct(), - domain_name.GetStruct(), - CefSchemeHandlerFactoryCppToC::Wrap(factory)); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL bool CefClearSchemeHandlerFactories() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = cef_clear_scheme_handler_factories(); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL bool CefCurrentlyOn(CefThreadId threadId) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = cef_currently_on( - threadId); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL bool CefPostTask(CefThreadId threadId, CefRefPtr task) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: task; type: refptr_diff - DCHECK(task.get()); - if (!task.get()) - return false; - - // Execute - int _retval = cef_post_task( - threadId, - CefTaskCppToC::Wrap(task)); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL bool CefPostDelayedTask(CefThreadId threadId, - CefRefPtr task, int64 delay_ms) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: task; type: refptr_diff - DCHECK(task.get()); - if (!task.get()) - return false; - - // Execute - int _retval = cef_post_delayed_task( - threadId, - CefTaskCppToC::Wrap(task), - delay_ms); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL bool CefParseURL(const CefString& url, CefURLParts& parts) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: url; type: string_byref_const - DCHECK(!url.empty()); - if (url.empty()) - return false; - - // Execute - int _retval = cef_parse_url( - url.GetStruct(), - &parts); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL bool CefCreateURL(const CefURLParts& parts, CefString& url) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - int _retval = cef_create_url( - &parts, - url.GetWritableStruct()); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL bool CefRegisterExtension(const CefString& extension_name, - const CefString& javascript_code, CefRefPtr handler) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: extension_name; type: string_byref_const - DCHECK(!extension_name.empty()); - if (extension_name.empty()) - return false; - // Verify param: javascript_code; type: string_byref_const - DCHECK(!javascript_code.empty()); - if (javascript_code.empty()) - return false; - // Unverified params: handler - - // Execute - int _retval = cef_register_extension( - extension_name.GetStruct(), - javascript_code.GetStruct(), - CefV8HandlerCppToC::Wrap(handler)); - - // Return type: bool - return _retval?true:false; -} - -CEF_GLOBAL size_t CefGetWebPluginCount() { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - size_t _retval = cef_get_web_plugin_count(); - - // Return type: simple - return _retval; -} - -CEF_GLOBAL CefRefPtr CefGetWebPluginInfo(int index) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Execute - cef_web_plugin_info_t* _retval = cef_get_web_plugin_info( - index); - - // Return type: refptr_same - return CefWebPluginInfoCToCpp::Wrap(_retval); -} - -CEF_GLOBAL CefRefPtr CefGetWebPluginInfo( - const CefString& name) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: name; type: string_byref_const - DCHECK(!name.empty()); - if (name.empty()) - return NULL; - - // Execute - cef_web_plugin_info_t* _retval = cef_get_web_plugin_info_byname( - name.GetStruct()); - - // Return type: refptr_same - return CefWebPluginInfoCToCpp::Wrap(_retval); -} - diff --git a/cef1/libcef_dll/wrapper/libcef_dll_wrapper2.cc b/cef1/libcef_dll/wrapper/libcef_dll_wrapper2.cc deleted file mode 100644 index cb34a0a55..000000000 --- a/cef1/libcef_dll/wrapper/libcef_dll_wrapper2.cc +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "include/cef_nplugin.h" -#include "include/capi/cef_nplugin_capi.h" - -bool CefRegisterPlugin(const CefPluginInfo& plugin_info) { - return cef_register_plugin(&plugin_info)?true:false; -} diff --git a/cef1/patch/README.txt b/cef1/patch/README.txt deleted file mode 100644 index f96fe36a4..000000000 --- a/cef1/patch/README.txt +++ /dev/null @@ -1,20 +0,0 @@ -There may be instances where CEF requires changes to the Chromium/WebKit code -base that are not desired by the Chromium/WebKit projects as a whole. To address -this situation the CEF project adds a patch capability as part of the CEF GYP -project generation step. The patch capability works as follows: - -1. The CEF developer creates one or more patch files containing all required - changes to the Chromium/WebKit code base and places those patch files in the - "patches" subdirectory. -2. The CEF developer adds an entry for each patch file in the "patch.cfg" file. -3. CEF applies the patches to the Chromium/WebKit source tree using the - patcher.py tool in the tools directory. If necessary the patcher.py tool - also rewrites the "patch_state.h" file which defines the CEF_PATCHES_APPLIED - preprocessor value. - -To disable automatic application of patches to the Chromium/WebKit code base -create an empty "NOPATCH" file in the "patch" directory. Sections of the CEF -code base that otherwise require patches will be disabled using the -CEF_PATCHES_APPLIED preprocessor value defined in the "patch_state.h" file. Be -warned that not applying all required patches may break important CEF -functionality. diff --git a/cef1/patch/patch.cfg b/cef1/patch/patch.cfg deleted file mode 100644 index 356001c3c..000000000 --- a/cef1/patch/patch.cfg +++ /dev/null @@ -1,40 +0,0 @@ -# Each map in the list associates a patch file name with a target path and -# optional condition. All paths in the patch file must be relative to the -# target path. Each map should include a comment linking to the code review -# or bug report that the patch relates to. If a condition is provided the -# patch will only be applied if an environment variable with the specified -# name exists. - -patches = [ - { - # http://codereview.chromium.org/8086022/ - 'name': 'build', - 'path': '../build/', - }, - { - # http://code.google.com/p/chromiumembedded/issues/detail?id=496 - 'name': 'zlib', - 'path': '../third_party/zlib/', - }, - { - # http://code.google.com/p/gyp/issues/detail?id=443 - 'name': 'message_loop_443', - 'path': '../base/', - }, - { - # http://code.google.com/p/chromiumembedded/issues/detail?id=933 - 'name': 'webkit_933', - 'path': '../third_party/WebKit/Source/WebKit/chromium/src/', - }, - { - # http://code.google.com/p/gyp/issues/detail?id=331 - 'name': 'gyp_331', - 'path': '../tools/gyp/pylib/', - }, - { - # http://code.google.com/p/chromiumembedded/issues/detail?id=364 - 'name': 'spi_webcore_364', - 'path': '../third_party/WebKit/Source/WebCore/', - 'condition': 'CEF_SPI_BUILD', - }, -] diff --git a/cef1/patch/patches/build.patch b/cef1/patch/patches/build.patch deleted file mode 100644 index e73ddb02c..000000000 --- a/cef1/patch/patches/build.patch +++ /dev/null @@ -1,27 +0,0 @@ -Index: common.gypi -=================================================================== ---- common.gypi (revision 102269) -+++ common.gypi (working copy) -@@ -9,6 +9,9 @@ - # Variables expected to be overriden on the GYP command line (-D) or by - # ~/.gyp/include.gypi. - 'variables': { -+ # Directory for CEF source files. This will be set by cef.gypi. -+ 'cef_directory%' : '', -+ - # Putting a variables dict inside another variables dict looks kind of - # weird. This is done so that 'host_arch', 'chromeos', etc are defined as - # variables within the outer variables dict here. This is necessary -Index: mac/strip_save_dsym -=================================================================== ---- mac/strip_save_dsym (revision 102269) -+++ mac/strip_save_dsym (working copy) -@@ -48,7 +48,7 @@ - "bundle"] - macho_types_re = "Mach-O (?:64-bit )?(?:" + "|".join(macho_types) + ")" - -- file_cmd = subprocess.Popen(["/usr/bin/file", "-b", "--", macho], -+ file_cmd = subprocess.Popen(["/usr/bin/file", "-b", "-L", "--", macho], - stdout=subprocess.PIPE) - - archs = [] diff --git a/cef1/patch/patches/gyp_331.patch b/cef1/patch/patches/gyp_331.patch deleted file mode 100644 index 2e0ed113a..000000000 --- a/cef1/patch/patches/gyp_331.patch +++ /dev/null @@ -1,22 +0,0 @@ -Index: gyp/generator/ninja.py -=================================================================== ---- gyp/generator/ninja.py (revision 1602) -+++ gyp/generator/ninja.py (working copy) -@@ -662,7 +662,16 @@ - for path in copy['files']: - # Normalize the path so trailing slashes don't confuse us. - path = os.path.normpath(path) -- basename = os.path.split(path)[1] -+ (parent_path, basename) = os.path.split(path) -+ -+ # Xcode uses .lproj directories for localized resources. Add a special -+ # case to maintain the localization directory component if present. -+ if parent_path != '': -+ parent_basename = os.path.basename(parent_path) -+ (parent_root, parent_ext) = os.path.splitext(parent_basename) -+ if parent_ext == '.lproj': -+ basename = os.path.join(parent_basename, basename) -+ - src = self.GypPathToNinja(path, env) - dst = self.GypPathToNinja(os.path.join(copy['destination'], basename), - env) diff --git a/cef1/patch/patches/message_loop_443.patch b/cef1/patch/patches/message_loop_443.patch deleted file mode 100644 index 0e62394e1..000000000 --- a/cef1/patch/patches/message_loop_443.patch +++ /dev/null @@ -1,13 +0,0 @@ -Index: message_loop.cc -=================================================================== ---- message_loop.cc (revision 194165) -+++ message_loop.cc (working copy) -@@ -191,7 +191,7 @@ - MessageLoop::~MessageLoop() { - DCHECK_EQ(this, current()); - -- DCHECK(!run_loop_); -+ //DCHECK(!run_loop_); - - // Clean up any unprocessed tasks, but take care: deleting a task could - // result in the addition of more tasks (e.g., via DeleteSoon). We set a diff --git a/cef1/patch/patches/spi_webcore_364.patch b/cef1/patch/patches/spi_webcore_364.patch deleted file mode 100644 index e3eefc582..000000000 --- a/cef1/patch/patches/spi_webcore_364.patch +++ /dev/null @@ -1,39 +0,0 @@ -Index: page/FrameView.cpp -=================================================================== ---- page/FrameView.cpp (revision 148366) -+++ page/FrameView.cpp (working copy) -@@ -198,10 +198,12 @@ - if (!page) - return; - -+#if 0 - if (m_frame == page->mainFrame()) { - ScrollableArea::setVerticalScrollElasticity(ScrollElasticityAllowed); - ScrollableArea::setHorizontalScrollElasticity(ScrollElasticityAllowed); - } -+#endif - } - - PassRefPtr FrameView::create(Frame* frame) -Index: platform/mac/NSScrollerImpDetails.mm -=================================================================== ---- platform/mac/NSScrollerImpDetails.mm (revision 148366) -+++ platform/mac/NSScrollerImpDetails.mm (working copy) -@@ -33,6 +33,7 @@ - - bool isScrollbarOverlayAPIAvailable() - { -+#if 0 - static bool apiAvailable; - static bool shouldInitialize = true; - if (shouldInitialize) { -@@ -43,6 +44,9 @@ - && [scrollerImpPairClass instancesRespondToSelector:@selector(scrollerStyle)]; - } - return apiAvailable; -+#else -+ return false; -+#endif - } - - NSScrollerStyle recommendedScrollerStyle() { diff --git a/cef1/patch/patches/webkit_933.patch b/cef1/patch/patches/webkit_933.patch deleted file mode 100644 index dc39bd7ba..000000000 --- a/cef1/patch/patches/webkit_933.patch +++ /dev/null @@ -1,13 +0,0 @@ -Index: WebNode.cpp -=================================================================== ---- WebNode.cpp (revision 146842) -+++ WebNode.cpp (working copy) -@@ -181,7 +181,7 @@ - void WebNode::addEventListener(const WebString& eventType, WebDOMEventListener* listener, bool useCapture) - { - // Please do not add more eventTypes to this list without an API review. -- RELEASE_ASSERT(eventType == "mousedown"); -+ //RELEASE_ASSERT(eventType == "mousedown"); - - EventListenerWrapper* listenerWrapper = listener->createEventListenerWrapper(eventType, useCapture, m_private.get()); - // The listenerWrapper is only referenced by the actual Node. Once it goes diff --git a/cef1/patch/patches/zlib.patch b/cef1/patch/patches/zlib.patch deleted file mode 100644 index 0e40c4f0d..000000000 --- a/cef1/patch/patches/zlib.patch +++ /dev/null @@ -1,13 +0,0 @@ -Index: contrib/minizip/unzip.c -=================================================================== ---- contrib/minizip/unzip.c (revision 176706) -+++ contrib/minizip/unzip.c (working copy) -@@ -69,7 +69,7 @@ - #include - - #ifndef NOUNCRYPT -- #define NOUNCRYPT -+// #define NOUNCRYPT - #endif - - #include "third_party/zlib/zlib.h" diff --git a/cef1/tests/cefclient/binding_test.cpp b/cef1/tests/cefclient/binding_test.cpp deleted file mode 100644 index 79490a1b2..000000000 --- a/cef1/tests/cefclient/binding_test.cpp +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) 2008-2009 The Chromium Embedded Framework 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 "cefclient/binding_test.h" -#include -#include -#include -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "include/cef_v8.h" - -namespace binding_test { - -namespace { - -// Implementation of the V8 handler class for the "window.cef_test.Dump" -// function. -class ClientV8FunctionHandler : public CefV8Handler { - public: - ClientV8FunctionHandler() {} - virtual ~ClientV8FunctionHandler() {} - - // Execute with the specified argument list and return value. Return true if - // the method was handled. - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - if (name == "Dump") { - // The "Dump" function will return a human-readable dump of the input - // arguments. - std::stringstream stream; - size_t i; - - for (i = 0; i < arguments.size(); ++i) { - stream << "arg[" << i << "] = "; - PrintValue(arguments[i], stream, 0); - stream << "\n"; - } - - retval = CefV8Value::CreateString(stream.str()); - return true; - } else if (name == "Call") { - // The "Call" function will execute a function to get an object and then - // return the result of calling a function belonging to that object. The - // first arument is the function that will return an object and the second - // argument is the function that will be called on that returned object. - int argSize = arguments.size(); - if (argSize < 2 || !arguments[0]->IsFunction() - || !arguments[1]->IsString()) - return false; - - CefV8ValueList argList; - - // Execute the function stored in the first argument to retrieve an - // object. - CefRefPtr objectPtr = - arguments[0]->ExecuteFunction(object, argList); - if (arguments[0]->HasException()) - exception = arguments[0]->GetException()->GetMessage(); - - // Verify that the returned value is an object. - if (!objectPtr.get() || !objectPtr->IsObject()) - return false; - - // Retrieve the member function specified by name in the second argument - // from the object. - CefRefPtr funcPtr = - objectPtr->GetValue(arguments[1]->GetStringValue()); - // Verify that the returned value is a function. - if (!funcPtr.get() || !funcPtr->IsFunction()) - return false; - - // Pass any additional arguments on to the member function. - for (int i = 2; i < argSize; ++i) - argList.push_back(arguments[i]); - - // Execute the member function. - funcPtr->ExecuteFunction(arguments[0], argList); - if (funcPtr->HasException()) - exception = funcPtr->GetException()->GetMessage(); - return true; - } - return false; - } - - // Simple function for formatted output of a V8 value. - void PrintValue(CefRefPtr value, std::stringstream &stream, - int indent) { - std::stringstream indent_stream; - for (int i = 0; i < indent; ++i) - indent_stream << " "; - std::string indent_str = indent_stream.str(); - - if (value->IsUndefined()) - stream << "(undefined)"; - else if (value->IsNull()) - stream << "(null)"; - else if (value->IsBool()) - stream << "(bool) " << (value->GetBoolValue() ? "true" : "false"); - else if (value->IsInt()) - stream << "(int) " << value->GetIntValue(); - else if (value->IsDouble()) - stream << "(double) " << value->GetDoubleValue(); - else if (value->IsString()) - stream << "(string) " << std::string(value->GetStringValue()); - else if (value->IsFunction()) - stream << "(function) " << std::string(value->GetFunctionName()); - else if (value->IsArray()) { - stream << "(array) ["; - int len = value->GetArrayLength(); - for (int i = 0; i < len; ++i) { - stream << "\n " << indent_str.c_str() << i << " = "; - PrintValue(value->GetValue(i), stream, indent+1); - } - stream << "\n" << indent_str.c_str() << "]"; - } else if (value->IsObject()) { - stream << "(object) ["; - std::vector keys; - if (value->GetKeys(keys)) { - for (size_t i = 0; i < keys.size(); ++i) { - stream << "\n " << indent_str.c_str() << keys[i].c_str() << " = "; - PrintValue(value->GetValue(keys[i]), stream, indent+1); - } - } - stream << "\n" << indent_str.c_str() << "]"; - } - } - - IMPLEMENT_REFCOUNTING(ClientV8FunctionHandler); -}; - -} // namespace - -void InitTest(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr object) { - // Create the new V8 object. - CefRefPtr testObjPtr = CefV8Value::CreateObject(NULL); - // Add the new V8 object to the global window object with the name - // "cef_test". - object->SetValue("cef_test", testObjPtr, V8_PROPERTY_ATTRIBUTE_NONE); - - // Create an instance of ClientV8FunctionHandler as the V8 handler. - CefRefPtr handlerPtr = new ClientV8FunctionHandler(); - - // Add a new V8 function to the cef_test object with the name "Dump". - testObjPtr->SetValue("Dump", - CefV8Value::CreateFunction("Dump", handlerPtr), - V8_PROPERTY_ATTRIBUTE_NONE); - // Add a new V8 function to the cef_test object with the name "Call". - testObjPtr->SetValue("Call", - CefV8Value::CreateFunction("Call", handlerPtr), - V8_PROPERTY_ATTRIBUTE_NONE); -} - -} // namespace binding_test diff --git a/cef1/tests/cefclient/binding_test.h b/cef1/tests/cefclient/binding_test.h deleted file mode 100644 index 23a626a49..000000000 --- a/cef1/tests/cefclient/binding_test.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_BINDING_TEST_H_ -#define CEF_TESTS_CEFCLIENT_BINDING_TEST_H_ -#pragma once - -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "include/cef_v8.h" - -namespace binding_test { - -// Add the V8 bindings. -void InitTest(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr object); - -} // namespace binding_test - -#endif // CEF_TESTS_CEFCLIENT_BINDING_TEST_H_ diff --git a/cef1/tests/cefclient/cefclient.cpp b/cef1/tests/cefclient/cefclient.cpp deleted file mode 100644 index c8c3b7e6b..000000000 --- a/cef1/tests/cefclient/cefclient.cpp +++ /dev/null @@ -1,633 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "cefclient/cefclient.h" -#include -#include -#include -#include -#include "include/cef_app.h" -#include "include/cef_browser.h" -#include "include/cef_command_line.h" -#include "include/cef_frame.h" -#include "include/cef_runnable.h" -#include "include/cef_web_plugin.h" -#include "include/cef_web_urlrequest.h" -#include "cefclient/cefclient_switches.h" -#include "cefclient/client_handler.h" -#include "cefclient/binding_test.h" -#include "cefclient/scheme_test.h" -#include "cefclient/string_util.h" -#include "cefclient/util.h" - -namespace { - -void UIT_InvokeScript(CefRefPtr browser) { - REQUIRE_UI_THREAD(); - - CefRefPtr frame = browser->GetMainFrame(); - CefRefPtr v8Context = frame->GetV8Context(); - CefString url = frame->GetURL(); - - if (!v8Context.get()) { - frame->ExecuteJavaScript("alert('Failed to get V8 context!');", url, 0); - } else if (v8Context->Enter()) { - CefRefPtr globalObj = v8Context->GetGlobal(); - CefRefPtr evalFunc = globalObj->GetValue("eval"); - - CefRefPtr arg0 = CefV8Value::CreateString("1+2"); - - CefV8ValueList args; - args.push_back(arg0); - - CefRefPtr retVal = - evalFunc->ExecuteFunctionWithContext(v8Context, globalObj, args); - if (!evalFunc->HasException()) { - if (retVal.get()) { - frame->ExecuteJavaScript( - std::string("alert('InvokeScript returns ") + - retVal->GetStringValue().ToString() + "!');", - url, 0); - } else { - frame->ExecuteJavaScript( - std::string("alert('InvokeScript returned no value!"), url, 0); - } - } else { - frame->ExecuteJavaScript( - std::string("alert('InvokeScript returns exception: ") + - evalFunc->GetException()->GetMessage().ToString() + "!');", - url, 0); - } - - v8Context->Exit(); - } else { - frame->ExecuteJavaScript("alert('Failed to enter into V8 context!');", - url, 0); - } -} - -void UIT_RunPluginInfoTest(CefRefPtr browser) { - std::string html = "Plugin Info Test"; - - // Find the flash plugin first to test that get by name works. - std::string flash_name; - CefRefPtr info = CefGetWebPluginInfo("Shockwave Flash"); - if (info.get()) { - flash_name = info->GetName(); - html += "\nFlash is installed!" - "
Name: " + flash_name + - "\n
Description: " + info->GetDescription().ToString() + - "\n
Version: " + info->GetVersion().ToString() + - "\n
Path: " + info->GetPath().ToString(); - } - - if (!flash_name.empty()) { - html += "\n

Other installed plugins:"; - } else { - html += "\nInstalled plugins:"; - } - - // Display all other plugins. - size_t count = CefGetWebPluginCount(); - for (size_t i = 0; i < count; ++i) { - CefRefPtr info = CefGetWebPluginInfo(i); - ASSERT(info.get()); - if (!flash_name.empty() && info->GetName() == flash_name) - continue; - - html += "\n

Name: " + info->GetName().ToString() + - "\n
Description: " + info->GetDescription().ToString() + - "\n
Version: " + info->GetVersion().ToString() + - "\n
Path: " + info->GetPath().ToString(); - } - - html += ""; - - browser->GetMainFrame()->LoadString(html, "http://tests/plugin_info"); -} - -// Return the int representation of the specified string. -int GetIntValue(const CefString& str) { - if (str.empty()) - return 0; - - std::string stdStr = str; - return atoi(stdStr.c_str()); -} - - -// ClientApp implementation. -class ClientApp : public CefApp, - public CefProxyHandler { - public: - ClientApp(cef_proxy_type_t proxy_type, const CefString& proxy_config) - : proxy_type_(proxy_type), - proxy_config_(proxy_config) { - } - - virtual void OnRegisterCustomSchemes( - CefRefPtr registrar) OVERRIDE { - scheme_test::AddSchemes(registrar); - } - - // CefApp methods - virtual CefRefPtr GetProxyHandler() OVERRIDE { return this; } - - // CefProxyHandler methods - virtual void GetProxyForUrl(const CefString& url, - CefProxyInfo& proxy_info) OVERRIDE { - proxy_info.proxyType = proxy_type_; - if (!proxy_config_.empty()) - CefString(&proxy_info.proxyList) = proxy_config_; - } - - protected: - cef_proxy_type_t proxy_type_; - CefString proxy_config_; - - IMPLEMENT_REFCOUNTING(ClientApp); -}; - -} // namespace - -CefRefPtr g_handler; -CefRefPtr g_command_line; - -CefRefPtr AppGetBrowser() { - if (!g_handler.get()) - return NULL; - return g_handler->GetBrowser(); -} - -CefWindowHandle AppGetMainHwnd() { - if (!g_handler.get()) - return NULL; - return g_handler->GetMainHwnd(); -} - -void AppInitCommandLine(int argc, const char* const* argv) { - g_command_line = CefCommandLine::CreateCommandLine(); -#if defined(OS_WIN) - g_command_line->InitFromString(::GetCommandLineW()); -#else - g_command_line->InitFromArgv(argc, argv); -#endif -} - -// Returns the application command line object. -CefRefPtr AppGetCommandLine() { - return g_command_line; -} - -// Returns the application settings based on command line arguments. -void AppGetSettings(CefSettings& settings, CefRefPtr& app) { - ASSERT(g_command_line.get()); - if (!g_command_line.get()) - return; - - CefString str; - -#if defined(OS_WIN) - settings.multi_threaded_message_loop = - g_command_line->HasSwitch(cefclient::kMultiThreadedMessageLoop); -#endif - - CefString(&settings.cache_path) = - g_command_line->GetSwitchValue(cefclient::kCachePath); - CefString(&settings.user_agent) = - g_command_line->GetSwitchValue(cefclient::kUserAgent); - CefString(&settings.product_version) = - g_command_line->GetSwitchValue(cefclient::kProductVersion); - CefString(&settings.locale) = - g_command_line->GetSwitchValue(cefclient::kLocale); - CefString(&settings.log_file) = - g_command_line->GetSwitchValue(cefclient::kLogFile); - - { - std::string str = g_command_line->GetSwitchValue(cefclient::kLogSeverity); - bool invalid = false; - if (!str.empty()) { - if (str == cefclient::kLogSeverity_Verbose) - settings.log_severity = LOGSEVERITY_VERBOSE; - else if (str == cefclient::kLogSeverity_Info) - settings.log_severity = LOGSEVERITY_INFO; - else if (str == cefclient::kLogSeverity_Warning) - settings.log_severity = LOGSEVERITY_WARNING; - else if (str == cefclient::kLogSeverity_Error) - settings.log_severity = LOGSEVERITY_ERROR; - else if (str == cefclient::kLogSeverity_ErrorReport) - settings.log_severity = LOGSEVERITY_ERROR_REPORT; - else if (str == cefclient::kLogSeverity_Disable) - settings.log_severity = LOGSEVERITY_DISABLE; - else - invalid = true; - } - if (str.empty() || invalid) { -#ifdef NDEBUG - // Only log error messages and higher in release build. - settings.log_severity = LOGSEVERITY_ERROR; -#endif - } - } - - settings.release_dcheck_enabled = - g_command_line->HasSwitch(cefclient::kReleaseDcheckEnabled); - - { - std::string str = g_command_line->GetSwitchValue(cefclient::kGraphicsImpl); - if (!str.empty()) { -#if defined(OS_WIN) - if (str == cefclient::kGraphicsImpl_Angle) - settings.graphics_implementation = ANGLE_IN_PROCESS; - else if (str == cefclient::kGraphicsImpl_AngleCmdBuffer) - settings.graphics_implementation = ANGLE_IN_PROCESS_COMMAND_BUFFER; - else -#endif - if (str == cefclient::kGraphicsImpl_Desktop) - settings.graphics_implementation = DESKTOP_IN_PROCESS; - else if (str == cefclient::kGraphicsImpl_DesktopCmdBuffer) - settings.graphics_implementation = DESKTOP_IN_PROCESS_COMMAND_BUFFER; - } - } - - settings.local_storage_quota = GetIntValue( - g_command_line->GetSwitchValue(cefclient::kLocalStorageQuota)); - settings.session_storage_quota = GetIntValue( - g_command_line->GetSwitchValue(cefclient::kSessionStorageQuota)); - - CefString(&settings.javascript_flags) = - g_command_line->GetSwitchValue(cefclient::kJavascriptFlags); - - CefString(&settings.resources_dir_path) = - g_command_line->GetSwitchValue(cefclient::kResourcesDirPath); - CefString(&settings.locales_dir_path) = - g_command_line->GetSwitchValue(cefclient::kLocalesDirPath); - - settings.pack_loading_disabled = - g_command_line->HasSwitch(cefclient::kPackLoadingDisabled); - settings.uncaught_exception_stack_size = GetIntValue( - g_command_line->GetSwitchValue(cefclient::kUncaughtExceptionStackSize)); - settings.context_safety_implementation = GetIntValue( - g_command_line->GetSwitchValue(cefclient::kContextSafetyImplementation)); - - // Retrieve command-line proxy configuration, if any. - bool has_proxy = false; - cef_proxy_type_t proxy_type = CEF_PROXY_TYPE_DIRECT; - CefString proxy_config; - - if (g_command_line->HasSwitch(cefclient::kProxyType)) { - std::string str = g_command_line->GetSwitchValue(cefclient::kProxyType); - if (str == cefclient::kProxyType_Direct) { - has_proxy = true; - proxy_type = CEF_PROXY_TYPE_DIRECT; - } else if (str == cefclient::kProxyType_Named || - str == cefclient::kProxyType_Pac) { - proxy_config = g_command_line->GetSwitchValue(cefclient::kProxyConfig); - if (!proxy_config.empty()) { - has_proxy = true; - proxy_type = (str == cefclient::kProxyType_Named? - CEF_PROXY_TYPE_NAMED:CEF_PROXY_TYPE_PAC_STRING); - } - } - } - - if (has_proxy) { - // Provide a ClientApp instance to handle proxy resolution. - app = new ClientApp(proxy_type, proxy_config); - } -} - -// Returns the application browser settings based on command line arguments. -void AppGetBrowserSettings(CefBrowserSettings& settings) { - ASSERT(g_command_line.get()); - if (!g_command_line.get()) - return; - - settings.drag_drop_disabled = - g_command_line->HasSwitch(cefclient::kDragDropDisabled); - settings.load_drops_disabled = - g_command_line->HasSwitch(cefclient::kLoadDropsDisabled); - settings.history_disabled = - g_command_line->HasSwitch(cefclient::kHistoryDisabled); - - settings.animation_frame_rate = GetIntValue( - g_command_line->GetSwitchValue(cefclient::kAnimationFrameRate)); - - settings.remote_fonts_disabled = - g_command_line->HasSwitch(cefclient::kRemoteFontsDisabled); - - CefString(&settings.default_encoding) = - g_command_line->GetSwitchValue(cefclient::kDefaultEncoding); - - settings.encoding_detector_enabled = - g_command_line->HasSwitch(cefclient::kEncodingDetectorEnabled); - settings.javascript_disabled = - g_command_line->HasSwitch(cefclient::kJavascriptDisabled); - settings.javascript_open_windows_disallowed = - g_command_line->HasSwitch(cefclient::kJavascriptOpenWindowsDisallowed); - settings.javascript_close_windows_disallowed = - g_command_line->HasSwitch(cefclient::kJavascriptCloseWindowsDisallowed); - settings.javascript_access_clipboard_disallowed = - g_command_line->HasSwitch( - cefclient::kJavascriptAccessClipboardDisallowed); - settings.dom_paste_disabled = - g_command_line->HasSwitch(cefclient::kDomPasteDisabled); - settings.caret_browsing_enabled = - g_command_line->HasSwitch(cefclient::kCaretBrowsingDisabled); - settings.java_disabled = - g_command_line->HasSwitch(cefclient::kJavaDisabled); - settings.plugins_disabled = - g_command_line->HasSwitch(cefclient::kPluginsDisabled); - settings.universal_access_from_file_urls_allowed = - g_command_line->HasSwitch(cefclient::kUniversalAccessFromFileUrlsAllowed); - settings.file_access_from_file_urls_allowed = - g_command_line->HasSwitch(cefclient::kFileAccessFromFileUrlsAllowed); - settings.web_security_disabled = - g_command_line->HasSwitch(cefclient::kWebSecurityDisabled); - settings.xss_auditor_enabled = - g_command_line->HasSwitch(cefclient::kXssAuditorEnabled); - settings.image_load_disabled = - g_command_line->HasSwitch(cefclient::kImageLoadingDisabled); - settings.shrink_standalone_images_to_fit = - g_command_line->HasSwitch(cefclient::kShrinkStandaloneImagesToFit); - settings.site_specific_quirks_disabled = - g_command_line->HasSwitch(cefclient::kSiteSpecificQuirksDisabled); - settings.text_area_resize_disabled = - g_command_line->HasSwitch(cefclient::kTextAreaResizeDisabled); - settings.page_cache_disabled = - g_command_line->HasSwitch(cefclient::kPageCacheDisabled); - settings.tab_to_links_disabled = - g_command_line->HasSwitch(cefclient::kTabToLinksDisabled); - settings.hyperlink_auditing_disabled = - g_command_line->HasSwitch(cefclient::kHyperlinkAuditingDisabled); - settings.user_style_sheet_enabled = - g_command_line->HasSwitch(cefclient::kUserStyleSheetEnabled); - - CefString(&settings.user_style_sheet_location) = - g_command_line->GetSwitchValue(cefclient::kUserStyleSheetLocation); - - settings.author_and_user_styles_disabled = - g_command_line->HasSwitch(cefclient::kAuthorAndUserStylesDisabled); - settings.local_storage_disabled = - g_command_line->HasSwitch(cefclient::kLocalStorageDisabled); - settings.databases_disabled = - g_command_line->HasSwitch(cefclient::kDatabasesDisabled); - settings.application_cache_disabled = - g_command_line->HasSwitch(cefclient::kApplicationCacheDisabled); - settings.webgl_disabled = - g_command_line->HasSwitch(cefclient::kWebglDisabled); - settings.accelerated_compositing_enabled = - g_command_line->HasSwitch(cefclient::kAcceleratedCompositingEnabled); - settings.accelerated_layers_disabled = - g_command_line->HasSwitch(cefclient::kAcceleratedLayersDisabled); - settings.accelerated_video_disabled = - g_command_line->HasSwitch(cefclient::kAcceleratedVideoDisabled); - settings.accelerated_2d_canvas_disabled = - g_command_line->HasSwitch(cefclient::kAcceledated2dCanvasDisabled); - settings.accelerated_filters_disabled = - g_command_line->HasSwitch(cefclient::kAcceleratedFiltersDisabled); - settings.accelerated_plugins_disabled = - g_command_line->HasSwitch(cefclient::kAcceleratedPluginsDisabled); - settings.fullscreen_enabled = - g_command_line->HasSwitch(cefclient::kFullscreenEnabled); -} - -static void ExecuteGetSource(CefRefPtr frame) { - // Retrieve the current page source and display. - std::string source = frame->GetSource(); - source = StringReplace(source, "<", "<"); - source = StringReplace(source, ">", ">"); - std::stringstream ss; - ss << "Source:
" << source << "
"; - frame->LoadString(ss.str(), "http://tests/getsource"); -} - -void RunGetSourceTest(CefRefPtr browser) { - // Execute the GetSource() call on the UI thread. - CefPostTask(TID_UI, - NewCefRunnableFunction(&ExecuteGetSource, browser->GetMainFrame())); -} - -static void ExecuteGetText(CefRefPtr frame) { - std::string text = frame->GetText(); - text = StringReplace(text, "<", "<"); - text = StringReplace(text, ">", ">"); - std::stringstream ss; - ss << "Text:
" << text << "
"; - frame->LoadString(ss.str(), "http://tests/gettext"); -} - -void RunGetTextTest(CefRefPtr browser) { - // Execute the GetText() call on the UI thread. - CefPostTask(TID_UI, - NewCefRunnableFunction(&ExecuteGetText, browser->GetMainFrame())); -} - -void RunRequestTest(CefRefPtr browser) { - // Create a new request - CefRefPtr request(CefRequest::CreateRequest()); - - // Set the request URL - request->SetURL("http://tests/request"); - - // Add post data to the request. The correct method and content- - // type headers will be set by CEF. - CefRefPtr postDataElement( - CefPostDataElement::CreatePostDataElement()); - std::string data = "arg1=val1&arg2=val2"; - postDataElement->SetToBytes(data.length(), data.c_str()); - CefRefPtr postData(CefPostData::CreatePostData()); - postData->AddElement(postDataElement); - request->SetPostData(postData); - - // Add a custom header - CefRequest::HeaderMap headerMap; - headerMap.insert( - std::make_pair("X-My-Header", "My Header Value")); - request->SetHeaderMap(headerMap); - - // Load the request - browser->GetMainFrame()->LoadRequest(request); -} - -void RunJavaScriptExecuteTest(CefRefPtr browser) { - browser->GetMainFrame()->ExecuteJavaScript( - "alert('JavaScript execute works!');", "about:blank", 0); -} - -void RunJavaScriptInvokeTest(CefRefPtr browser) { - if (CefCurrentlyOn(TID_UI)) { - UIT_InvokeScript(browser); - } else { - // Execute on the UI thread. - CefPostTask(TID_UI, NewCefRunnableFunction(&UIT_InvokeScript, browser)); - } -} - -void RunPopupTest(CefRefPtr browser) { - browser->GetMainFrame()->ExecuteJavaScript( - "window.open('http://www.google.com');", "about:blank", 0); -} - -void RunWebURLRequestTest(CefRefPtr browser) { - class RequestClient : public CefWebURLRequestClient { - public: - explicit RequestClient(CefRefPtr browser) : browser_(browser) {} - - virtual void OnStateChange(CefRefPtr requester, - RequestState state) { - REQUIRE_UI_THREAD(); - if (state == WUR_STATE_DONE) { - buffer_ = StringReplace(buffer_, "<", "<"); - buffer_ = StringReplace(buffer_, ">", ">"); - std::stringstream ss; - ss << "Source:
" << buffer_ << "
"; - - browser_->GetMainFrame()->LoadString(ss.str(), - "http://tests/weburlrequest"); - } - } - - virtual void OnRedirect(CefRefPtr requester, - CefRefPtr request, - CefRefPtr response) { - REQUIRE_UI_THREAD(); - } - - virtual void OnHeadersReceived(CefRefPtr requester, - CefRefPtr response) { - REQUIRE_UI_THREAD(); - } - - virtual void OnProgress(CefRefPtr requester, - uint64 bytesSent, uint64 totalBytesToBeSent) { - REQUIRE_UI_THREAD(); - } - - virtual void OnData(CefRefPtr requester, - const void* data, int dataLength) { - REQUIRE_UI_THREAD(); - buffer_.append(static_cast(data), dataLength); - } - - virtual void OnError(CefRefPtr requester, - ErrorCode errorCode) { - REQUIRE_UI_THREAD(); - std::stringstream ss; - ss << "Load failed with error code " << errorCode; - browser_->GetMainFrame()->LoadString(ss.str(), - "http://tests/weburlrequest"); - } - - protected: - CefRefPtr browser_; - std::string buffer_; - - IMPLEMENT_REFCOUNTING(CefWebURLRequestClient); - }; - - CefRefPtr request(CefRequest::CreateRequest()); - request->SetURL("http://www.google.com"); - - CefRefPtr client(new RequestClient(browser)); - CefRefPtr requester( - CefWebURLRequest::CreateWebURLRequest(request, client)); -} - -void RunDOMAccessTest(CefRefPtr browser) { - class Listener : public CefDOMEventListener { - public: - Listener() {} - virtual void HandleEvent(CefRefPtr event) { - CefRefPtr document = event->GetDocument(); - ASSERT(document.get()); - - std::stringstream ss; - - CefRefPtr button = event->GetTarget(); - ASSERT(button.get()); - std::string buttonValue = button->GetElementAttribute("value"); - ss << "You clicked the " << buttonValue.c_str() << " button. "; - - if (document->HasSelection()) { - std::string startName, endName; - - // Determine the start name by first trying to locate the "id" attribute - // and then defaulting to the tag name. - { - CefRefPtr node = document->GetSelectionStartNode(); - if (!node->IsElement()) - node = node->GetParent(); - if (node->IsElement() && node->HasElementAttribute("id")) - startName = node->GetElementAttribute("id"); - else - startName = node->GetName(); - } - - // Determine the end name by first trying to locate the "id" attribute - // and then defaulting to the tag name. - { - CefRefPtr node = document->GetSelectionEndNode(); - if (!node->IsElement()) - node = node->GetParent(); - if (node->IsElement() && node->HasElementAttribute("id")) - endName = node->GetElementAttribute("id"); - else - endName = node->GetName(); - } - - ss << "The selection is from " << - startName.c_str() << ":" << document->GetSelectionStartOffset() << - " to " << - endName.c_str() << ":" << document->GetSelectionEndOffset(); - } else { - ss << "Nothing is selected."; - } - - // Update the description. - CefRefPtr desc = document->GetElementById("description"); - ASSERT(desc.get()); - CefRefPtr text = desc->GetFirstChild(); - ASSERT(text.get()); - ASSERT(text->IsText()); - text->SetValue(ss.str()); - } - - IMPLEMENT_REFCOUNTING(Listener); - }; - - class Visitor : public CefDOMVisitor { - public: - Visitor() {} - virtual void Visit(CefRefPtr document) { - // Register an click listener for the button. - CefRefPtr button = document->GetElementById("button"); - ASSERT(button.get()); - button->AddEventListener("click", new Listener(), false); - } - - IMPLEMENT_REFCOUNTING(Visitor); - }; - - // The DOM visitor will be called after the path is loaded. - CefRefPtr client = browser->GetClient(); - static_cast(client.get())->AddDOMVisitor( - "http://tests/domaccess", new Visitor()); - - browser->GetMainFrame()->LoadURL("http://tests/domaccess"); -} - -void RunPluginInfoTest(CefRefPtr browser) { - if (CefCurrentlyOn(TID_UI)) { - UIT_RunPluginInfoTest(browser); - } else { - // Execute on the UI thread. - CefPostTask(TID_UI, - NewCefRunnableFunction(&UIT_RunPluginInfoTest, browser)); - } -} - -void RunOtherTests(CefRefPtr browser) { - browser->GetMainFrame()->LoadURL("http://tests/other_tests"); -} diff --git a/cef1/tests/cefclient/cefclient.h b/cef1/tests/cefclient/cefclient.h deleted file mode 100644 index 504e365ce..000000000 --- a/cef1/tests/cefclient/cefclient.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_CEFCLIENT_H_ -#define CEF_TESTS_CEFCLIENT_CEFCLIENT_H_ -#pragma once - -#include -#include "include/cef_base.h" - -class CefApp; -class CefBrowser; -class CefCommandLine; - -// Returns the main browser window instance. -CefRefPtr AppGetBrowser(); - -// Returns the main application window handle. -CefWindowHandle AppGetMainHwnd(); - -// Returns the application working directory. -std::string AppGetWorkingDirectory(); - -// Initialize the application command line. -void AppInitCommandLine(int argc, const char* const* argv); - -// Returns the application command line object. -CefRefPtr AppGetCommandLine(); - -// Returns the application settings based on command line arguments. -void AppGetSettings(CefSettings& settings, CefRefPtr& app); - -// Returns the application browser settings based on command line arguments. -void AppGetBrowserSettings(CefBrowserSettings& settings); - -// Implementations for various tests. -void RunGetSourceTest(CefRefPtr browser); -void RunGetTextTest(CefRefPtr browser); -void RunRequestTest(CefRefPtr browser); -void RunJavaScriptExecuteTest(CefRefPtr browser); -void RunJavaScriptInvokeTest(CefRefPtr browser); -void RunPopupTest(CefRefPtr browser); -void RunWebURLRequestTest(CefRefPtr browser); -void RunDOMAccessTest(CefRefPtr browser); -void RunPluginInfoTest(CefRefPtr browser); -void RunOtherTests(CefRefPtr browser); - -#if defined(OS_WIN) -void RunTransparentPopupTest(CefRefPtr browser); -void RunGetImageTest(CefRefPtr browser); -#endif - -#endif // CEF_TESTS_CEFCLIENT_CEFCLIENT_H_ diff --git a/cef1/tests/cefclient/cefclient.rc b/cef1/tests/cefclient/cefclient.rc deleted file mode 100644 index 31bc1dda4..000000000 --- a/cef1/tests/cefclient/cefclient.rc +++ /dev/null @@ -1,184 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Binary -// - -IDS_BINDING BINARY "res\\binding.html" -IDS_DIALOGS BINARY "res\\dialogs.html" -IDS_DOMACCESS BINARY "res\\domaccess.html" -IDS_EXTENSION BINARY "res\\extension.html" -IDS_LOCALSTORAGE BINARY "res\\localstorage.html" -IDS_LOGO BINARY "res\\logo.png" -IDS_LOGOBALL BINARY "res\\logoball.png" -IDS_MODALDIALOG BINARY "res\\modaldialog.html" -IDS_MODALMAIN BINARY "res\\modalmain.html" -IDS_OSRPLUGIN BINARY "res\\osrplugin.html" -IDS_OTHER_TESTS BINARY "res\\other_tests.html" -IDS_PERFORMANCE BINARY "res\\performance.html" -IDS_PLUGIN BINARY "res\\plugin.html" -IDS_TRANSPARENCY BINARY "res\\transparency.html" -IDS_UIPLUGIN BINARY "res\\uiplugin.html" -IDS_XMLHTTPREQUEST BINARY "res\\xmlhttprequest.html" - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_CEFCLIENT ICON "res\cefclient.ico" -IDI_SMALL ICON "res\small.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDC_CEFCLIENT MENU -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&Find...", ID_FIND - MENUITEM SEPARATOR - MENUITEM "&Print...", ID_PRINT - MENUITEM SEPARATOR - MENUITEM "E&xit", IDM_EXIT - END - POPUP "&Help" - BEGIN - MENUITEM "&About ...", IDM_ABOUT - END - POPUP "Tests" - BEGIN - MENUITEM "Get Source", ID_TESTS_GETSOURCE - MENUITEM "Get Text", ID_TESTS_GETTEXT - MENUITEM "Popup Window", ID_TESTS_POPUP - MENUITEM "Transparent Popup Window", ID_TESTS_TRANSPARENT_POPUP - MENUITEM "Request", ID_TESTS_REQUEST - MENUITEM "JavaScript Execute", ID_TESTS_JAVASCRIPT_EXECUTE - MENUITEM "JavaScript Invoke", ID_TESTS_JAVASCRIPT_INVOKE - MENUITEM "Plugin Info", ID_TESTS_PLUGIN_INFO - MENUITEM "WebURLRequest", ID_TESTS_WEBURLREQUEST - MENUITEM "DOM Access", ID_TESTS_DOMACCESS - MENUITEM "Zoom In", ID_TESTS_ZOOM_IN - MENUITEM "Zoom Out", ID_TESTS_ZOOM_OUT - MENUITEM "Zoom Reset", ID_TESTS_ZOOM_RESET - MENUITEM "Show Developer Tools", ID_TESTS_DEVTOOLS_SHOW - MENUITEM "Close Developer Tools", ID_TESTS_DEVTOOLS_CLOSE - MENUITEM "Off-Screen Rendering Example",ID_TESTS_OSRAPP - MENUITEM "Transparent Off-Screen Rendering Example",ID_TESTS_TRANSPARENT_OSRAPP - MENUITEM "Get Image", ID_TESTS_GETIMAGE - MENUITEM "Other Tests", ID_TESTS_OTHER_TESTS - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -IDC_CEFCLIENT ACCELERATORS -BEGIN - "?", IDM_ABOUT, ASCII, ALT - "/", IDM_ABOUT, ASCII, ALT -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOG 22, 17, 230, 75 -STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "About" -FONT 8, "System" -BEGIN - ICON IDI_CEFCLIENT,IDC_MYICON,14,9,16,16 - LTEXT "cefclient Version 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX - LTEXT "Copyright (C) 2008",IDC_STATIC,49,20,119,8 - DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""windows.h""\r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_APP_TITLE "cefclient" - IDC_CEFCLIENT "CEFCLIENT" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/cef1/tests/cefclient/cefclient_gtk.cpp b/cef1/tests/cefclient/cefclient_gtk.cpp deleted file mode 100644 index 3dc3da96b..000000000 --- a/cef1/tests/cefclient/cefclient_gtk.cpp +++ /dev/null @@ -1,375 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 -#include -#include -#include -#include "cefclient/cefclient.h" -#include "include/cef_app.h" -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "include/cef_runnable.h" -#include "cefclient/client_handler.h" -#include "cefclient/extension_test.h" -#include "cefclient/scheme_test.h" -#include "cefclient/string_util.h" - -char szWorkingDir[512]; // The current working directory - -// The global ClientHandler reference. -extern CefRefPtr g_handler; - -void destroy(void) { - CefQuitMessageLoop(); -} - -void TerminationSignalHandler(int signatl) { - destroy(); -} - -// Callback for Tests > Get Source... menu item. -gboolean GetSourceActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunGetSourceTest(g_handler->GetBrowser()); - - return FALSE; // Don't stop this message. -} - -// Callback for Tests > Get Source... menu item. -gboolean GetTextActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunGetTextTest(g_handler->GetBrowser()); - - return FALSE; // Don't stop this message. -} - -// Callback for Tests > Popup Window... menu item. -gboolean PopupWindowActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunPopupTest(g_handler->GetBrowser()); - - return FALSE; // Don't stop this message. -} - -// Callback for Tests > Request... menu item. -gboolean RequestActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunRequestTest(g_handler->GetBrowser()); - - return FALSE; // Don't stop this message. -} - -// Callback for Tests > JavaScript Execute... menu item. -gboolean JSExecuteActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunJavaScriptExecuteTest(g_handler->GetBrowser()); - - return FALSE; // Don't stop this message. -} - -// Callback for Tests > JavaScript Invoke... menu item. -gboolean JSInvokeActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunJavaScriptInvokeTest(g_handler->GetBrowser()); - - return FALSE; // Don't stop this message. -} - -// Callback for Tests > Plugin Info... menu item. -gboolean PluginInfoActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunPluginInfoTest(g_handler->GetBrowser()); - - return FALSE; // Don't stop this message. -} - -// Callback for Tests > WebURLRequest... menu item. -gboolean WebURLRequestActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunWebURLRequestTest(g_handler->GetBrowser()); - - return FALSE; // Don't stop this message. -} - -// Callback for Tests > DOM Access... menu item. -gboolean DOMAccessActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunDOMAccessTest(g_handler->GetBrowser()); - - return FALSE; // Don't stop this message. -} - -// Callback for Tests > Zoom In... menu item. -gboolean ZoomInActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - CefRefPtr browser = g_handler->GetBrowser(); - browser->SetZoomLevel(browser->GetZoomLevel() + 0.5); - } - - return FALSE; // Don't stop this message. -} - -// Callback for Tests > Zoom Out... menu item. -gboolean ZoomOutActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - CefRefPtr browser = g_handler->GetBrowser(); - browser->SetZoomLevel(browser->GetZoomLevel() - 0.5); - } - - return FALSE; // Don't stop this message. -} - -// Callback for Tests > Zoom Reset... menu item. -gboolean ZoomResetActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - CefRefPtr browser = g_handler->GetBrowser(); - browser->SetZoomLevel(0.0); - } - - return FALSE; // Don't stop this message. -} - -gboolean ShowDevtoolsActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - CefRefPtr browser = g_handler->GetBrowser(); - browser->ShowDevTools(); - } - - return FALSE; // Don't stop this message. -} - -gboolean CloseDevtoolsActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - CefRefPtr browser = g_handler->GetBrowser(); - browser->CloseDevTools(); - } - - return FALSE; // Don't stop this message. -} - -// Callback for Tests > Other Tests... menu item. -gboolean OtherTestsActivated(GtkWidget* widget) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunOtherTests(g_handler->GetBrowser()); - - return FALSE; // Don't stop this message. -} - -// Callback for when you click the back button. -void BackButtonClicked(GtkButton* button) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - g_handler->GetBrowser()->GoBack(); -} - -// Callback for when you click the forward button. -void ForwardButtonClicked(GtkButton* button) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - g_handler->GetBrowser()->GoForward(); -} - -// Callback for when you click the stop button. -void StopButtonClicked(GtkButton* button) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - g_handler->GetBrowser()->StopLoad(); -} - -// Callback for when you click the reload button. -void ReloadButtonClicked(GtkButton* button) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - g_handler->GetBrowser()->Reload(); -} - -// Callback for when you press enter in the URL box. -void URLEntryActivate(GtkEntry* entry) { - if (!g_handler.get() || !g_handler->GetBrowserHwnd()) - return; - - const gchar* url = gtk_entry_get_text(entry); - g_handler->GetBrowser()->GetMainFrame()->LoadURL(std::string(url).c_str()); -} - -// GTK utility functions ---------------------------------------------- - -GtkWidget* AddMenuEntry(GtkWidget* menu_widget, const char* text, - GCallback callback) { - GtkWidget* entry = gtk_menu_item_new_with_label(text); - g_signal_connect(entry, "activate", callback, NULL); - gtk_menu_shell_append(GTK_MENU_SHELL(menu_widget), entry); - return entry; -} - -GtkWidget* CreateMenu(GtkWidget* menu_bar, const char* text) { - GtkWidget* menu_widget = gtk_menu_new(); - GtkWidget* menu_header = gtk_menu_item_new_with_label(text); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_header), menu_widget); - gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), menu_header); - return menu_widget; -} - -GtkWidget* CreateMenuBar() { - GtkWidget* menu_bar = gtk_menu_bar_new(); - GtkWidget* debug_menu = CreateMenu(menu_bar, "Tests"); - - AddMenuEntry(debug_menu, "Get Source", - G_CALLBACK(GetSourceActivated)); - AddMenuEntry(debug_menu, "Get Text", - G_CALLBACK(GetTextActivated)); - AddMenuEntry(debug_menu, "Popup Window", - G_CALLBACK(PopupWindowActivated)); - AddMenuEntry(debug_menu, "Request", - G_CALLBACK(RequestActivated)); - AddMenuEntry(debug_menu, "JavaScript Execute", - G_CALLBACK(JSExecuteActivated)); - AddMenuEntry(debug_menu, "JavaScript Invoke", - G_CALLBACK(JSInvokeActivated)); - AddMenuEntry(debug_menu, "Plugin Info", - G_CALLBACK(PluginInfoActivated)); - AddMenuEntry(debug_menu, "WebURLRequest", - G_CALLBACK(WebURLRequestActivated)); - AddMenuEntry(debug_menu, "DOM Access", - G_CALLBACK(DOMAccessActivated)); - AddMenuEntry(debug_menu, "Zoom In", - G_CALLBACK(ZoomInActivated)); - AddMenuEntry(debug_menu, "Zoom Out", - G_CALLBACK(ZoomOutActivated)); - AddMenuEntry(debug_menu, "Zoom Reset", - G_CALLBACK(ZoomResetActivated)); - AddMenuEntry(debug_menu, "Show Developer Tools", - G_CALLBACK(ShowDevtoolsActivated)); - AddMenuEntry(debug_menu, "Close Developer Tools", - G_CALLBACK(CloseDevtoolsActivated)); - AddMenuEntry(debug_menu, "Other Tests", - G_CALLBACK(OtherTestsActivated)); - - return menu_bar; -} - -// WebViewDelegate::TakeFocus in the test webview delegate. -static gboolean HandleFocus(GtkWidget* widget, - GdkEventFocus* focus) { - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - // Give focus to the browser window. - g_handler->GetBrowser()->SetFocus(true); - } - - return TRUE; -} - -int main(int argc, char *argv[]) { - if (!getcwd(szWorkingDir, sizeof (szWorkingDir))) - return -1; - - GtkWidget* window; - - gtk_init(&argc, &argv); - - // Parse command line arguments. - AppInitCommandLine(argc, argv); - - CefSettings settings; - CefRefPtr app; - - // Populate the settings based on command line arguments. - AppGetSettings(settings, app); - - // Initialize CEF. - CefInitialize(settings, app); - - // Register the V8 extension handler. - extension_test::InitTest(); - - // Register the scheme handler. - scheme_test::InitTest(); - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); - - g_signal_connect(window, "focus", G_CALLBACK(&HandleFocus), NULL); - - GtkWidget* vbox = gtk_vbox_new(FALSE, 0); - - GtkWidget* menu_bar = CreateMenuBar(); - - gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 0); - - GtkWidget* toolbar = gtk_toolbar_new(); - // Turn off the labels on the toolbar buttons. - gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS); - - GtkToolItem* back = gtk_tool_button_new_from_stock(GTK_STOCK_GO_BACK); - g_signal_connect(back, "clicked", - G_CALLBACK(BackButtonClicked), NULL); - gtk_toolbar_insert(GTK_TOOLBAR(toolbar), back, -1 /* append */); - - GtkToolItem* forward = gtk_tool_button_new_from_stock(GTK_STOCK_GO_FORWARD); - g_signal_connect(forward, "clicked", - G_CALLBACK(ForwardButtonClicked), NULL); - gtk_toolbar_insert(GTK_TOOLBAR(toolbar), forward, -1 /* append */); - - GtkToolItem* reload = gtk_tool_button_new_from_stock(GTK_STOCK_REFRESH); - g_signal_connect(reload, "clicked", - G_CALLBACK(ReloadButtonClicked), NULL); - gtk_toolbar_insert(GTK_TOOLBAR(toolbar), reload, -1 /* append */); - - GtkToolItem* stop = gtk_tool_button_new_from_stock(GTK_STOCK_STOP); - g_signal_connect(stop, "clicked", - G_CALLBACK(StopButtonClicked), NULL); - gtk_toolbar_insert(GTK_TOOLBAR(toolbar), stop, -1 /* append */); - - GtkWidget* m_editWnd = gtk_entry_new(); - g_signal_connect(G_OBJECT(m_editWnd), "activate", - G_CALLBACK(URLEntryActivate), NULL); - - GtkToolItem* tool_item = gtk_tool_item_new(); - gtk_container_add(GTK_CONTAINER(tool_item), m_editWnd); - gtk_tool_item_set_expand(tool_item, TRUE); - gtk_toolbar_insert(GTK_TOOLBAR(toolbar), tool_item, -1); // append - - gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); - - g_signal_connect(G_OBJECT(window), "destroy", - G_CALLBACK(gtk_widget_destroyed), &window); - g_signal_connect(G_OBJECT(window), "destroy", - G_CALLBACK(destroy), NULL); - - // Create the handler. - g_handler = new ClientHandler(); - g_handler->SetMainHwnd(vbox); - g_handler->SetEditHwnd(m_editWnd); - g_handler->SetButtonHwnds(GTK_WIDGET(back), GTK_WIDGET(forward), - GTK_WIDGET(reload), GTK_WIDGET(stop)); - - // Create the browser view. - CefWindowInfo window_info; - CefBrowserSettings browserSettings; - - // Populate the settings based on command line arguments. - AppGetBrowserSettings(browserSettings); - - window_info.SetAsChild(vbox); - - CefBrowser::CreateBrowserSync(window_info, - static_cast >(g_handler), - g_handler->GetStartupURL(), browserSettings); - - gtk_container_add(GTK_CONTAINER(window), vbox); - gtk_widget_show_all(GTK_WIDGET(window)); - - // Install an signal handler so we clean up after ourselves. - signal(SIGINT, TerminationSignalHandler); - signal(SIGTERM, TerminationSignalHandler); - - CefRunMessageLoop(); - - CefShutdown(); - - return 0; -} - -// Global functions - -std::string AppGetWorkingDirectory() { - return szWorkingDir; -} diff --git a/cef1/tests/cefclient/cefclient_mac.mm b/cef1/tests/cefclient/cefclient_mac.mm deleted file mode 100644 index f6fa2e71d..000000000 --- a/cef1/tests/cefclient/cefclient_mac.mm +++ /dev/null @@ -1,525 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. -// Portions 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 -#include -#include "cefclient/cefclient.h" -#include "include/cef_app.h" -#import "include/cef_application_mac.h" -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "include/cef_runnable.h" -#include "cefclient/client_handler.h" -#include "cefclient/extension_test.h" -#include "cefclient/osrtest_mac.h" -#include "cefclient/resource_util.h" -#include "cefclient/scheme_test.h" -#include "cefclient/string_util.h" - -// The global ClientHandler reference. -extern CefRefPtr g_handler; - -char szWorkingDir[512]; // The current working directory - -// Sizes for URL bar layout -#define BUTTON_HEIGHT 22 -#define BUTTON_WIDTH 72 -#define BUTTON_MARGIN 8 -#define URLBAR_HEIGHT 32 - -// Content area size for newly created windows. -const int kWindowWidth = 800; -const int kWindowHeight = 600; - -// Memory AutoRelease pool. -static NSAutoreleasePool* g_autopool = nil; - -// Provide the CefAppProtocol implementation required by CEF. -@interface ClientApplication : NSApplication { -@private - BOOL handlingSendEvent_; -} -@end - -@implementation ClientApplication -- (BOOL)isHandlingSendEvent { - return handlingSendEvent_; -} - -- (void)setHandlingSendEvent:(BOOL)handlingSendEvent { - handlingSendEvent_ = handlingSendEvent; -} - -- (void)sendEvent:(NSEvent*)event { - CefScopedSendingEvent sendingEventScoper; - [super sendEvent:event]; -} -@end - - -// Receives notifications from controls and the browser window. Will delete -// itself when done. -@interface ClientWindowDelegate : NSObject -- (IBAction)goBack:(id)sender; -- (IBAction)goForward:(id)sender; -- (IBAction)reload:(id)sender; -- (IBAction)stopLoading:(id)sender; -- (IBAction)takeURLStringValueFrom:(NSTextField *)sender; -- (void)alert:(NSString*)title withMessage:(NSString*)message; -- (void)notifyConsoleMessage:(id)object; -- (void)notifyDownloadComplete:(id)object; -- (void)notifyDownloadError:(id)object; -@end - -@implementation ClientWindowDelegate - -- (IBAction)goBack:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - g_handler->GetBrowser()->GoBack(); -} - -- (IBAction)goForward:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - g_handler->GetBrowser()->GoForward(); -} - -- (IBAction)reload:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - g_handler->GetBrowser()->Reload(); -} - -- (IBAction)stopLoading:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - g_handler->GetBrowser()->StopLoad(); -} - -- (IBAction)takeURLStringValueFrom:(NSTextField *)sender { - if (!g_handler.get() || !g_handler->GetBrowserHwnd()) - return; - - NSString *url = [sender stringValue]; - - // if it doesn't already have a prefix, add http. If we can't parse it, - // just don't bother rather than making things worse. - NSURL* tempUrl = [NSURL URLWithString:url]; - if (tempUrl && ![tempUrl scheme]) - url = [@"http://" stringByAppendingString:url]; - - std::string urlStr = [url UTF8String]; - g_handler->GetBrowser()->GetMainFrame()->LoadURL(urlStr); -} - -- (void)alert:(NSString*)title withMessage:(NSString*)message { - NSAlert *alert = [NSAlert alertWithMessageText:title - defaultButton:@"OK" - alternateButton:nil - otherButton:nil - informativeTextWithFormat:message]; - [alert runModal]; -} - -- (void)notifyConsoleMessage:(id)object { - std::stringstream ss; - ss << "Console messages will be written to " << g_handler->GetLogFile(); - NSString* str = [NSString stringWithUTF8String:(ss.str().c_str())]; - [self alert:@"Console Messages" withMessage:str]; -} - -- (void)notifyDownloadComplete:(id)object { - std::stringstream ss; - ss << "File \"" << g_handler->GetLastDownloadFile() << - "\" downloaded successfully."; - NSString* str = [NSString stringWithUTF8String:(ss.str().c_str())]; - [self alert:@"File Download" withMessage:str]; -} - -- (void)notifyDownloadError:(id)object { - std::stringstream ss; - ss << "File \"" << g_handler->GetLastDownloadFile() << - "\" failed to download."; - NSString* str = [NSString stringWithUTF8String:(ss.str().c_str())]; - [self alert:@"File Download" withMessage:str]; -} - -- (void)windowDidBecomeKey:(NSNotification*)notification { - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - // Give focus to the browser window. - g_handler->GetBrowser()->SetFocus(true); - } -} - -- (void)windowDidResignKey:(NSNotification*)notification { - [(NSWindow*)[notification object] makeFirstResponder:nil]; -} - -// Called when the window is about to close. Perform the self-destruction -// sequence by getting rid of the window. By returning YES, we allow the window -// to be removed from the screen. -- (BOOL)windowShouldClose:(id)window { - // Try to make the window go away. - [window autorelease]; - - // Clean ourselves up after clearing the stack of anything that might have the - // window on it. - [self performSelectorOnMainThread:@selector(cleanup:) - withObject:window - waitUntilDone:NO]; - - return YES; -} - -// Deletes itself. -- (void)cleanup:(id)window { - [self release]; -} - -@end - - -NSButton* MakeButton(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; -} - -// Receives notifications from the application. Will delete itself when done. -@interface ClientAppDelegate : NSObject -- (void)createApp:(id)object; -- (IBAction)testGetSource:(id)sender; -- (IBAction)testGetText:(id)sender; -- (IBAction)testPopupWindow:(id)sender; -- (IBAction)testRequest:(id)sender; -- (IBAction)testJSExecute:(id)sender; -- (IBAction)testJSInvoke:(id)sender; -- (IBAction)testPluginInfo:(id)sender; -- (IBAction)testWebURLRequest:(id)sender; -- (IBAction)testDOMAccess:(id)sender; -- (IBAction)testZoomIn:(id)sender; -- (IBAction)testZoomOut:(id)sender; -- (IBAction)testZoomReset:(id)sender; -- (IBAction)testDevToolsShow:(id)sender; -- (IBAction)testDevToolsClose:(id)sender; -- (IBAction)testOffscreenRendering:(id)sender; -- (IBAction)testTransparentOffscreenRendering:(id)sender; -- (IBAction)testOtherTests:(id)sender; -@end - -@implementation ClientAppDelegate - -// Create the application on the UI thread. -- (void)createApp:(id)object { - [NSApplication sharedApplication]; - [NSBundle loadNibNamed:@"MainMenu" owner:NSApp]; - - // Set the delegate for application events. - [NSApp setDelegate:self]; - - // Add the Tests menu. - NSMenu* menubar = [NSApp mainMenu]; - NSMenuItem *testItem = [[[NSMenuItem alloc] initWithTitle:@"Tests" - action:nil - keyEquivalent:@""] autorelease]; - NSMenu *testMenu = [[[NSMenu alloc] initWithTitle:@"Tests"] autorelease]; - [testMenu addItemWithTitle:@"Get Source" - action:@selector(testGetSource:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"Get Text" - action:@selector(testGetText:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"Popup Window" - action:@selector(testPopupWindow:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"Request" - action:@selector(testRequest:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"JavaScript Execute" - action:@selector(testJSExecute:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"JavaScript Invoke" - action:@selector(testJSInvoke:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"Plugin Info" - action:@selector(testPluginInfo:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"WebURLRequest" - action:@selector(testWebURLRequest:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"DOM Access" - action:@selector(testDOMAccess:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"Zoom In" - action:@selector(testZoomIn:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"Zoom Out" - action:@selector(testZoomOut:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"Zoom Reset" - action:@selector(testZoomReset:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"Show Developer Tools" - action:@selector(testDevToolsShow:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"Close Developer Tools" - action:@selector(testDevToolsClose:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"Offscreen Rendering" - action:@selector(testOffscreenRendering:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"Transparent Offscreen Rendering" - action:@selector(testTransparentOffscreenRendering:) - keyEquivalent:@""]; - [testMenu addItemWithTitle:@"Other Tests" - action:@selector(testOtherTests:) - keyEquivalent:@""]; - [testItem setSubmenu:testMenu]; - [menubar addItem:testItem]; - - // Create the delegate for control and browser window events. - ClientWindowDelegate* delegate = [[ClientWindowDelegate alloc] init]; - - // Create the main application window. - NSRect screen_rect = [[NSScreen mainScreen] visibleFrame]; - NSRect window_rect = { {0, screen_rect.size.height - kWindowHeight}, - {kWindowWidth, kWindowHeight} }; - NSWindow* mainWnd = [[NSWindow alloc] - initWithContentRect:window_rect - styleMask:(NSTitledWindowMask | - NSClosableWindowMask | - NSMiniaturizableWindowMask | - NSResizableWindowMask ) - backing:NSBackingStoreBuffered - defer:NO]; - [mainWnd setTitle:@"cefclient"]; - [mainWnd setDelegate:delegate]; - - // 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 window isn't on the stack - // during cleanup (ie, a window close from javascript). - [mainWnd setReleasedWhenClosed:NO]; - - NSView* contentView = [mainWnd contentView]; - - // Create the buttons. - NSRect button_rect = [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; - - NSButton* button = MakeButton(&button_rect, @"Back", contentView); - [button setTarget:delegate]; - [button setAction:@selector(goBack:)]; - - button = MakeButton(&button_rect, @"Forward", contentView); - [button setTarget:delegate]; - [button setAction:@selector(goForward:)]; - - button = MakeButton(&button_rect, @"Reload", contentView); - [button setTarget:delegate]; - [button setAction:@selector(reload:)]; - - button = MakeButton(&button_rect, @"Stop", contentView); - [button setTarget:delegate]; - [button setAction:@selector(stopLoading:)]; - - // Create the URL text field. - button_rect.origin.x += BUTTON_MARGIN; - button_rect.size.width = [contentView bounds].size.width - - button_rect.origin.x - BUTTON_MARGIN; - NSTextField* editWnd = [[NSTextField alloc] initWithFrame:button_rect]; - [contentView addSubview:editWnd]; - [editWnd setAutoresizingMask:(NSViewWidthSizable | NSViewMinYMargin)]; - [editWnd setTarget:delegate]; - [editWnd setAction:@selector(takeURLStringValueFrom:)]; - [[editWnd cell] setWraps:NO]; - [[editWnd cell] setScrollable:YES]; - - // Create the handler. - g_handler = new ClientHandler(); - g_handler->SetMainHwnd(contentView); - g_handler->SetEditHwnd(editWnd); - - // Create the browser view. - CefWindowInfo window_info; - CefBrowserSettings settings; - - // Populate the settings based on command line arguments. - AppGetBrowserSettings(settings); - - window_info.SetAsChild(contentView, 0, 0, kWindowWidth, kWindowHeight); - CefBrowser::CreateBrowser(window_info, g_handler.get(), - g_handler->GetStartupURL(), settings); - - // Show the window. - [mainWnd makeKeyAndOrderFront: nil]; - - // Size the window. - NSRect r = [mainWnd contentRectForFrameRect:[mainWnd frame]]; - r.size.width = kWindowWidth; - r.size.height = kWindowHeight + URLBAR_HEIGHT; - [mainWnd setFrame:[mainWnd frameRectForContentRect:r] display:YES]; -} - -- (IBAction)testGetSource:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunGetSourceTest(g_handler->GetBrowser()); -} - -- (IBAction)testGetText:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunGetTextTest(g_handler->GetBrowser()); -} - -- (IBAction)testPopupWindow:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunPopupTest(g_handler->GetBrowser()); -} - -- (IBAction)testRequest:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunRequestTest(g_handler->GetBrowser()); -} - -- (IBAction)testJSExecute:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunJavaScriptExecuteTest(g_handler->GetBrowser()); -} - -- (IBAction)testJSInvoke:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunJavaScriptInvokeTest(g_handler->GetBrowser()); -} - -- (IBAction)testPluginInfo:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunPluginInfoTest(g_handler->GetBrowser()); -} - -- (IBAction)testWebURLRequest:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunWebURLRequestTest(g_handler->GetBrowser()); -} - -- (IBAction)testDOMAccess:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunDOMAccessTest(g_handler->GetBrowser()); -} - -- (IBAction)testZoomIn:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - CefRefPtr browser = g_handler->GetBrowser(); - browser->SetZoomLevel(browser->GetZoomLevel() + 0.5); - } -} - -- (IBAction)testZoomOut:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - CefRefPtr browser = g_handler->GetBrowser(); - browser->SetZoomLevel(browser->GetZoomLevel() - 0.5); - } -} - -- (IBAction)testZoomReset:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - CefRefPtr browser = g_handler->GetBrowser(); - browser->SetZoomLevel(0.0); - } -} - -- (IBAction)testDevToolsShow:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - CefRefPtr browser = g_handler->GetBrowser(); - browser->ShowDevTools(); - } -} - -- (IBAction)testDevToolsClose:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - CefRefPtr browser = g_handler->GetBrowser(); - browser->CloseDevTools(); - } -} - -- (IBAction)testOffscreenRendering:(id)sender { - osrtest::RunTest(false); -} - -- (IBAction)testTransparentOffscreenRendering:(id)sender { - osrtest::RunTest(true); -} - -- (IBAction)testOtherTests:(id)sender { - if (g_handler.get() && g_handler->GetBrowserHwnd()) - RunOtherTests(g_handler->GetBrowser()); -} - -// Sent by the default notification center immediately before the application -// terminates. -- (void)applicationWillTerminate:(NSNotification *)aNotification { - // Shut down CEF. - g_handler = NULL; - CefShutdown(); - - [self release]; - - // Release the AutoRelease pool. - [g_autopool release]; -} - -@end - - -int main(int argc, char* argv[]) { - // Retrieve the current working directory. - getcwd(szWorkingDir, sizeof(szWorkingDir)); - - // Initialize the AutoRelease pool. - g_autopool = [[NSAutoreleasePool alloc] init]; - - // Initialize the ClientApplication instance. - [ClientApplication sharedApplication]; - - // Parse command line arguments. - AppInitCommandLine(argc, argv); - - CefSettings settings; - CefRefPtr app; - - // Populate the settings based on command line arguments. - AppGetSettings(settings, app); - - // Initialize CEF. - CefInitialize(settings, app); - - // Register the V8 extension handler. - extension_test::InitTest(); - - // Register the scheme handler. - scheme_test::InitTest(); - - // Create the application delegate and window. - NSObject* delegate = [[ClientAppDelegate alloc] init]; - [delegate performSelectorOnMainThread:@selector(createApp:) withObject:nil - waitUntilDone:NO]; - - // Run the application message loop. - CefRunMessageLoop(); - - // Don't put anything below this line because it won't be executed. - return 0; -} - - -// Global functions - -std::string AppGetWorkingDirectory() { - return szWorkingDir; -} diff --git a/cef1/tests/cefclient/cefclient_switches.cpp b/cef1/tests/cefclient/cefclient_switches.cpp deleted file mode 100644 index 738f841f8..000000000 --- a/cef1/tests/cefclient/cefclient_switches.cpp +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -// This file is shared by cefclient and cef_unittests so don't include using -// a qualified path. -#include "cefclient_switches.h" // NOLINT(build/include) - -namespace cefclient { - -const char kUrl[] = "url"; - -// CefSettings attributes. -const char kMultiThreadedMessageLoop[] = "multi-threaded-message-loop"; -const char kCachePath[] = "cache-path"; -const char kUserAgent[] = "user-agent"; -const char kProductVersion[] = "product-version"; -const char kLocale[] = "locale"; -const char kLogFile[] = "log-file"; -const char kLogSeverity[] = "log-severity"; -const char kLogSeverity_Verbose[] = "verbose"; -const char kLogSeverity_Info[] = "info"; -const char kLogSeverity_Warning[] = "warning"; -const char kLogSeverity_Error[] = "error"; -const char kLogSeverity_ErrorReport[] = "error-report"; -const char kLogSeverity_Disable[] = "disable"; -const char kReleaseDcheckEnabled[] = "release-dcheck-enabled"; -const char kGraphicsImpl[] = "graphics-implementation"; -const char kGraphicsImpl_Angle[] = "angle"; -const char kGraphicsImpl_AngleCmdBuffer[] = "angle-command-buffer"; -const char kGraphicsImpl_Desktop[] = "desktop"; -const char kGraphicsImpl_DesktopCmdBuffer[] = "desktop-command-buffer"; -const char kLocalStorageQuota[] = "local-storage-quota"; -const char kSessionStorageQuota[] = "session-storage-quota"; -const char kJavascriptFlags[] = "javascript-flags"; -const char kResourcesDirPath[] = "resources-dir-path"; -const char kLocalesDirPath[] = "locales-dir-path"; -const char kPackLoadingDisabled[] = "pack-loading-disabled"; -const char kUncaughtExceptionStackSize[] = "uncaught-exception-stack-size"; -const char kContextSafetyImplementation[] = "context-safety-implementation"; - -// CefBrowserSettings attributes. -const char kDragDropDisabled[] = "drag-drop-disabled"; -const char kLoadDropsDisabled[] = "load-drops-disabled"; -const char kHistoryDisabled[] = "history-disabled"; -const char kAnimationFrameRate[] = "animation-frame-rate"; -const char kRemoteFontsDisabled[] = "remote-fonts-disabled"; -const char kDefaultEncoding[] = "default-encoding"; -const char kEncodingDetectorEnabled[] = "encoding-detector-enabled"; -const char kJavascriptDisabled[] = "javascript-disabled"; -const char kJavascriptOpenWindowsDisallowed[] = - "javascript-open-windows-disallowed"; -const char kJavascriptCloseWindowsDisallowed[] = - "javascript-close-windows-disallowed"; -const char kJavascriptAccessClipboardDisallowed[] = - "javascript-access-clipboard-disallowed"; -const char kDomPasteDisabled[] = "dom-paste-disabled"; -const char kCaretBrowsingDisabled[] = "caret-browsing-enabled"; -const char kJavaDisabled[] = "java-disabled"; -const char kPluginsDisabled[] = "plugins-disabled"; -const char kUniversalAccessFromFileUrlsAllowed[] = - "universal-access-from-file-urls-allowed"; -const char kFileAccessFromFileUrlsAllowed[] = - "file-access-from-file-urls-allowed"; -const char kWebSecurityDisabled[] = "web-security-disabled"; -const char kXssAuditorEnabled[] = "xss-auditor-enabled"; -const char kImageLoadingDisabled[] = "image-load-disabled"; -const char kShrinkStandaloneImagesToFit[] = "shrink-standalone-images-to-fit"; -const char kSiteSpecificQuirksDisabled[] = "site-specific-quirks-disabled"; -const char kTextAreaResizeDisabled[] = "text-area-resize-disabled"; -const char kPageCacheDisabled[] = "page-cache-disabled"; -const char kTabToLinksDisabled[] = "tab-to-links-disabled"; -const char kHyperlinkAuditingDisabled[] = "hyperlink-auditing-disabled"; -const char kUserStyleSheetEnabled[] = "user-style-sheet-enabled"; -const char kUserStyleSheetLocation[] = "user-style-sheet-location"; -const char kAuthorAndUserStylesDisabled[] = "author-and-user-styles-disabled"; -const char kLocalStorageDisabled[] = "local-storage-disabled"; -const char kDatabasesDisabled[] = "databases-disabled"; -const char kApplicationCacheDisabled[] = "application-cache-disabled"; -const char kWebglDisabled[] = "webgl-disabled"; -const char kAcceleratedCompositingEnabled[] = "accelerated-compositing-enabled"; -const char kAcceleratedLayersDisabled[] = "accelerated-layers-disabled"; -const char kAcceleratedVideoDisabled[] = "accelerated-video-disabled"; -const char kAcceledated2dCanvasDisabled[] = "accelerated-2d-canvas-disabled"; -const char kAcceleratedFiltersDisabled[] = "accelerated-filters-disabled"; -const char kAcceleratedPluginsDisabled[] = "accelerated-plugins-disabled"; -const char kFullscreenEnabled[] = "fullscreen-enabled"; - -// Other attributes. -const char kProxyType[] = "proxy-type"; -const char kProxyType_Direct[] = "direct"; -const char kProxyType_Named[] = "named"; -const char kProxyType_Pac[] = "pac"; -const char kProxyConfig[] = "proxy-config"; - -} // namespace cefclient diff --git a/cef1/tests/cefclient/cefclient_switches.h b/cef1/tests/cefclient/cefclient_switches.h deleted file mode 100644 index 0226ba4e2..000000000 --- a/cef1/tests/cefclient/cefclient_switches.h +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -// Defines all of the command line switches used by cefclient. - -#ifndef CEF_TESTS_CEFCLIENT_CEFCLIENT_SWITCHES_H_ -#define CEF_TESTS_CEFCLIENT_CEFCLIENT_SWITCHES_H_ -#pragma once - -namespace cefclient { - -extern const char kUrl[]; - -// CefSettings attributes. -extern const char kMultiThreadedMessageLoop[]; -extern const char kCachePath[]; -extern const char kUserAgent[]; -extern const char kProductVersion[]; -extern const char kLocale[]; -extern const char kLogFile[]; -extern const char kLogSeverity[]; -extern const char kLogSeverity_Verbose[]; -extern const char kLogSeverity_Info[]; -extern const char kLogSeverity_Warning[]; -extern const char kLogSeverity_Error[]; -extern const char kLogSeverity_ErrorReport[]; -extern const char kLogSeverity_Disable[]; -extern const char kReleaseDcheckEnabled[]; -extern const char kGraphicsImpl[]; -extern const char kGraphicsImpl_Angle[]; -extern const char kGraphicsImpl_AngleCmdBuffer[]; -extern const char kGraphicsImpl_Desktop[]; -extern const char kGraphicsImpl_DesktopCmdBuffer[]; -extern const char kLocalStorageQuota[]; -extern const char kSessionStorageQuota[]; -extern const char kJavascriptFlags[]; -extern const char kResourcesDirPath[]; -extern const char kLocalesDirPath[]; -extern const char kPackLoadingDisabled[]; -extern const char kUncaughtExceptionStackSize[]; -extern const char kContextSafetyImplementation[]; - -// CefBrowserSettings attributes. -extern const char kDragDropDisabled[]; -extern const char kLoadDropsDisabled[]; -extern const char kHistoryDisabled[]; -extern const char kAnimationFrameRate[]; -extern const char kRemoteFontsDisabled[]; -extern const char kDefaultEncoding[]; -extern const char kEncodingDetectorEnabled[]; -extern const char kJavascriptDisabled[]; -extern const char kJavascriptOpenWindowsDisallowed[]; -extern const char kJavascriptCloseWindowsDisallowed[]; -extern const char kJavascriptAccessClipboardDisallowed[]; -extern const char kDomPasteDisabled[]; -extern const char kCaretBrowsingDisabled[]; -extern const char kJavaDisabled[]; -extern const char kPluginsDisabled[]; -extern const char kUniversalAccessFromFileUrlsAllowed[]; -extern const char kFileAccessFromFileUrlsAllowed[]; -extern const char kWebSecurityDisabled[]; -extern const char kXssAuditorEnabled[]; -extern const char kImageLoadingDisabled[]; -extern const char kShrinkStandaloneImagesToFit[]; -extern const char kSiteSpecificQuirksDisabled[]; -extern const char kTextAreaResizeDisabled[]; -extern const char kPageCacheDisabled[]; -extern const char kTabToLinksDisabled[]; -extern const char kHyperlinkAuditingDisabled[]; -extern const char kUserStyleSheetEnabled[]; -extern const char kUserStyleSheetLocation[]; -extern const char kAuthorAndUserStylesDisabled[]; -extern const char kLocalStorageDisabled[]; -extern const char kDatabasesDisabled[]; -extern const char kApplicationCacheDisabled[]; -extern const char kWebglDisabled[]; -extern const char kAcceleratedCompositingEnabled[]; -extern const char kAcceleratedLayersDisabled[]; -extern const char kAcceleratedVideoDisabled[]; -extern const char kAcceledated2dCanvasDisabled[]; -extern const char kAcceleratedFiltersDisabled[]; -extern const char kAcceleratedPluginsDisabled[]; -extern const char kFullscreenEnabled[]; - -// Other attributes. -extern const char kProxyType[]; -extern const char kProxyType_Direct[]; -extern const char kProxyType_Named[]; -extern const char kProxyType_Pac[]; -extern const char kProxyConfig[]; - -} // namespace cefclient - -#endif // CEF_TESTS_CEFCLIENT_CEFCLIENT_SWITCHES_H_ diff --git a/cef1/tests/cefclient/cefclient_win.cpp b/cef1/tests/cefclient/cefclient_win.cpp deleted file mode 100644 index bf8549c7e..000000000 --- a/cef1/tests/cefclient/cefclient_win.cpp +++ /dev/null @@ -1,732 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "cefclient/cefclient.h" -#include -#include -#include -#include -#include -#include -#include "include/cef_app.h" -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "include/cef_runnable.h" -#include "cefclient/client_handler.h" -#include "cefclient/extension_test.h" -#include "cefclient/osrplugin_test.h" -#include "cefclient/plugin_test.h" -#include "cefclient/resource.h" -#include "cefclient/scheme_test.h" -#include "cefclient/string_util.h" -#include "cefclient/uiplugin_test.h" - -#define MAX_LOADSTRING 100 -#define MAX_URL_LENGTH 255 -#define BUTTON_WIDTH 72 -#define URLBAR_HEIGHT 24 - -// Global Variables: -HINSTANCE hInst; // current instance -TCHAR szTitle[MAX_LOADSTRING]; // The title bar text -TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name -char szWorkingDir[MAX_PATH]; // The current working directory -UINT uFindMsg; // Message identifier for find events. -HWND hFindDlg = NULL; // Handle for the find dialog. - -// Forward declarations of functions included in this code module: -ATOM MyRegisterClass(HINSTANCE hInstance); -BOOL InitInstance(HINSTANCE, int); -LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); -INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); - -// The global ClientHandler reference. -extern CefRefPtr g_handler; - -#if defined(OS_WIN) -// Add Common Controls to the application manifest because it's required to -// support the default tooltip implementation. -#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) -#endif - -// Program entry point function. -int APIENTRY wWinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPTSTR lpCmdLine, - int nCmdShow) { - UNREFERENCED_PARAMETER(hPrevInstance); - UNREFERENCED_PARAMETER(lpCmdLine); - - // Retrieve the current working directory. - if (_getcwd(szWorkingDir, MAX_PATH) == NULL) - szWorkingDir[0] = 0; - - // Parse command line arguments. The passed in values are ignored on Windows. - AppInitCommandLine(0, NULL); - - CefSettings settings; - CefRefPtr app; - - // Populate the settings based on command line arguments. - AppGetSettings(settings, app); - - // Initialize CEF. - CefInitialize(settings, app); - - // Register the internal client plugin. - plugin_test::InitTest(); - - // Register the internal UI client plugin. - uiplugin_test::InitTest(); - - // Register the internal OSR client plugin. - osrplugin_test::InitTest(); - - // Register the V8 extension handler. - extension_test::InitTest(); - - // Register the scheme handler. - scheme_test::InitTest(); - - HACCEL hAccelTable; - - // Initialize global strings - LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); - LoadString(hInstance, IDC_CEFCLIENT, szWindowClass, MAX_LOADSTRING); - MyRegisterClass(hInstance); - - // Perform application initialization - if (!InitInstance (hInstance, nCmdShow)) - return FALSE; - - hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CEFCLIENT)); - - // Register the find event message. - uFindMsg = RegisterWindowMessage(FINDMSGSTRING); - - int result = 0; - - if (!settings.multi_threaded_message_loop) { - // Run the CEF message loop. This function will block until the application - // recieves a WM_QUIT message. - CefRunMessageLoop(); - } else { - MSG msg; - - // Run the application message loop. - while (GetMessage(&msg, NULL, 0, 0)) { - // Allow processing of find dialog messages. - if (hFindDlg && IsDialogMessage(hFindDlg, &msg)) - continue; - - if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - - result = static_cast(msg.wParam); - } - - // Shut down CEF. - CefShutdown(); - - return result; -} - -// -// FUNCTION: MyRegisterClass() -// -// PURPOSE: Registers the window class. -// -// COMMENTS: -// -// This function and its usage are only necessary if you want this code -// to be compatible with Win32 systems prior to the 'RegisterClassEx' -// function that was added to Windows 95. It is important to call this -// function so that the application will get 'well formed' small icons -// associated with it. -// -ATOM MyRegisterClass(HINSTANCE hInstance) { - WNDCLASSEX wcex; - - wcex.cbSize = sizeof(WNDCLASSEX); - - wcex.style = CS_HREDRAW | CS_VREDRAW; - wcex.lpfnWndProc = WndProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = hInstance; - wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CEFCLIENT)); - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); - wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CEFCLIENT); - wcex.lpszClassName = szWindowClass; - wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); - - return RegisterClassEx(&wcex); -} - -// -// FUNCTION: InitInstance(HINSTANCE, int) -// -// PURPOSE: Saves instance handle and creates main window -// -// COMMENTS: -// -// In this function, we save the instance handle in a global variable and -// create and display the main program window. -// -BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { - HWND hWnd; - - hInst = hInstance; // Store instance handle in our global variable - - hWnd = CreateWindow(szWindowClass, szTitle, - WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, 0, - CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); - - if (!hWnd) - return FALSE; - - ShowWindow(hWnd, nCmdShow); - UpdateWindow(hWnd); - - return TRUE; -} - -// -// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) -// -// PURPOSE: Processes messages for the main window. -// -LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, - LPARAM lParam) { - static HWND backWnd = NULL, forwardWnd = NULL, reloadWnd = NULL, - stopWnd = NULL, editWnd = NULL; - static WNDPROC editWndOldProc = NULL; - - // Static members used for the find dialog. - static FINDREPLACE fr; - static WCHAR szFindWhat[80] = {0}; - static WCHAR szLastFindWhat[80] = {0}; - static bool findNext = false; - static bool lastMatchCase = false; - - int wmId, wmEvent; - PAINTSTRUCT ps; - HDC hdc; - - if (hWnd == editWnd) { - // Callback for the edit window - switch (message) { - case WM_CHAR: - if (wParam == VK_RETURN && g_handler.get()) { - // When the user hits the enter key load the URL - CefRefPtr browser = g_handler->GetBrowser(); - wchar_t strPtr[MAX_URL_LENGTH+1] = {0}; - *((LPWORD)strPtr) = MAX_URL_LENGTH; - LRESULT strLen = SendMessage(hWnd, EM_GETLINE, 0, (LPARAM)strPtr); - if (strLen > 0) { - strPtr[strLen] = 0; - browser->GetMainFrame()->LoadURL(strPtr); - } - - return 0; - } - } - - return (LRESULT)CallWindowProc(editWndOldProc, hWnd, message, wParam, - lParam); - } else if (message == uFindMsg) { - // Find event. - LPFINDREPLACE lpfr = (LPFINDREPLACE)lParam; - - if (lpfr->Flags & FR_DIALOGTERM) { - // The find dialog box has been dismissed so invalidate the handle and - // reset the search results. - hFindDlg = NULL; - if (g_handler.get()) { - g_handler->GetBrowser()->StopFinding(true); - szLastFindWhat[0] = 0; - findNext = false; - } - return 0; - } - - if ((lpfr->Flags & FR_FINDNEXT) && g_handler.get()) { - // Search for the requested string. - bool matchCase = (lpfr->Flags & FR_MATCHCASE?true:false); - if (matchCase != lastMatchCase || - (matchCase && wcsncmp(szFindWhat, szLastFindWhat, - sizeof(szLastFindWhat)/sizeof(WCHAR)) != 0) || - (!matchCase && _wcsnicmp(szFindWhat, szLastFindWhat, - sizeof(szLastFindWhat)/sizeof(WCHAR)) != 0)) { - // The search string has changed, so reset the search results. - if (szLastFindWhat[0] != 0) { - g_handler->GetBrowser()->StopFinding(true); - findNext = false; - } - lastMatchCase = matchCase; - wcscpy_s(szLastFindWhat, sizeof(szLastFindWhat)/sizeof(WCHAR), - szFindWhat); - } - - g_handler->GetBrowser()->Find(0, lpfr->lpstrFindWhat, - (lpfr->Flags & FR_DOWN)?true:false, matchCase, findNext); - if (!findNext) - findNext = true; - } - - return 0; - } else { - // Callback for the main window - switch (message) { - case WM_CREATE: { - // Create the single static handler class instance - g_handler = new ClientHandler(); - g_handler->SetMainHwnd(hWnd); - - // Create the child windows used for navigation - RECT rect; - int x = 0; - - GetClientRect(hWnd, &rect); - - backWnd = CreateWindow(L"BUTTON", L"Back", - WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON - | WS_DISABLED, x, 0, BUTTON_WIDTH, URLBAR_HEIGHT, - hWnd, (HMENU) IDC_NAV_BACK, hInst, 0); - x += BUTTON_WIDTH; - - forwardWnd = CreateWindow(L"BUTTON", L"Forward", - WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON - | WS_DISABLED, x, 0, BUTTON_WIDTH, - URLBAR_HEIGHT, hWnd, (HMENU) IDC_NAV_FORWARD, - hInst, 0); - x += BUTTON_WIDTH; - - reloadWnd = CreateWindow(L"BUTTON", L"Reload", - WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON - | WS_DISABLED, x, 0, BUTTON_WIDTH, - URLBAR_HEIGHT, hWnd, (HMENU) IDC_NAV_RELOAD, - hInst, 0); - x += BUTTON_WIDTH; - - stopWnd = CreateWindow(L"BUTTON", L"Stop", - WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON - | WS_DISABLED, x, 0, BUTTON_WIDTH, URLBAR_HEIGHT, - hWnd, (HMENU) IDC_NAV_STOP, hInst, 0); - x += BUTTON_WIDTH; - - editWnd = CreateWindow(L"EDIT", 0, - WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | - ES_AUTOVSCROLL | ES_AUTOHSCROLL| WS_DISABLED, - x, 0, rect.right - BUTTON_WIDTH * 4, - URLBAR_HEIGHT, hWnd, 0, hInst, 0); - - // Assign the edit window's WNDPROC to this function so that we can - // capture the enter key - editWndOldProc = - reinterpret_cast(GetWindowLongPtr(editWnd, GWLP_WNDPROC)); - SetWindowLongPtr(editWnd, GWLP_WNDPROC, - reinterpret_cast(WndProc)); - g_handler->SetEditHwnd(editWnd); - g_handler->SetButtonHwnds(backWnd, forwardWnd, reloadWnd, stopWnd); - - rect.top += URLBAR_HEIGHT; - - CefWindowInfo info; - CefBrowserSettings settings; - - // Populate the settings based on command line arguments. - AppGetBrowserSettings(settings); - - // Initialize window info to the defaults for a child window - info.SetAsChild(hWnd, rect); - - // Creat the new child browser window - CefBrowser::CreateBrowser(info, - static_cast >(g_handler), - g_handler->GetStartupURL(), settings); - - return 0; - } - - case WM_COMMAND: { - CefRefPtr browser; - if (g_handler.get()) - browser = g_handler->GetBrowser(); - - wmId = LOWORD(wParam); - wmEvent = HIWORD(wParam); - // Parse the menu selections: - switch (wmId) { - case IDM_ABOUT: - DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); - return 0; - case IDM_EXIT: - DestroyWindow(hWnd); - return 0; - case ID_WARN_CONSOLEMESSAGE: - if (g_handler.get()) { - std::wstringstream ss; - ss << L"Console messages will be written to " - << std::wstring(CefString(g_handler->GetLogFile())); - MessageBox(hWnd, ss.str().c_str(), L"Console Messages", - MB_OK | MB_ICONINFORMATION); - } - return 0; - case ID_WARN_DOWNLOADCOMPLETE: - case ID_WARN_DOWNLOADERROR: - if (g_handler.get()) { - std::wstringstream ss; - ss << L"File \"" << - std::wstring(CefString(g_handler->GetLastDownloadFile())) << - L"\" "; - - if (wmId == ID_WARN_DOWNLOADCOMPLETE) - ss << L"downloaded successfully."; - else - ss << L"failed to download."; - - MessageBox(hWnd, ss.str().c_str(), L"File Download", - MB_OK | MB_ICONINFORMATION); - } - return 0; - case ID_FIND: - if (!hFindDlg) { - // Create the find dialog. - ZeroMemory(&fr, sizeof(fr)); - fr.lStructSize = sizeof(fr); - fr.hwndOwner = hWnd; - fr.lpstrFindWhat = szFindWhat; - fr.wFindWhatLen = sizeof(szFindWhat); - fr.Flags = FR_HIDEWHOLEWORD | FR_DOWN; - - hFindDlg = FindText(&fr); - } else { - // Give focus to the existing find dialog. - ::SetFocus(hFindDlg); - } - return 0; - case ID_PRINT: - if (browser.get()) - browser->GetMainFrame()->Print(); - return 0; - case IDC_NAV_BACK: // Back button - if (browser.get()) - browser->GoBack(); - return 0; - case IDC_NAV_FORWARD: // Forward button - if (browser.get()) - browser->GoForward(); - return 0; - case IDC_NAV_RELOAD: // Reload button - if (browser.get()) - browser->Reload(); - return 0; - case IDC_NAV_STOP: // Stop button - if (browser.get()) - browser->StopLoad(); - return 0; - case ID_TESTS_GETSOURCE: // Test the GetSource function - if (browser.get()) - RunGetSourceTest(browser); - return 0; - case ID_TESTS_GETTEXT: // Test the GetText function - if (browser.get()) - RunGetTextTest(browser); - return 0; - case ID_TESTS_POPUP: // Test a popup window - if (browser.get()) - RunPopupTest(browser); - return 0; - case ID_TESTS_TRANSPARENT_POPUP: // Test a transparent popup window - if (browser.get()) - RunTransparentPopupTest(browser); - return 0; - case ID_TESTS_REQUEST: // Test a request - if (browser.get()) - RunRequestTest(browser); - return 0; - case ID_TESTS_JAVASCRIPT_EXECUTE: // Test execution of javascript - if (browser.get()) - RunJavaScriptExecuteTest(browser); - return 0; - case ID_TESTS_JAVASCRIPT_INVOKE: - if (browser.get()) - RunJavaScriptInvokeTest(browser); - return 0; - case ID_TESTS_PLUGIN_INFO: // Test plugin info - if (browser.get()) - RunPluginInfoTest(browser); - return 0; - case ID_TESTS_WEBURLREQUEST: - if (browser.get()) - RunWebURLRequestTest(browser); - return 0; - case ID_TESTS_DOMACCESS: // Test DOM access - if (browser.get()) - RunDOMAccessTest(browser); - return 0; - case ID_TESTS_ZOOM_IN: - if (browser.get()) - browser->SetZoomLevel(browser->GetZoomLevel() + 0.5); - return 0; - case ID_TESTS_ZOOM_OUT: - if (browser.get()) - browser->SetZoomLevel(browser->GetZoomLevel() - 0.5); - return 0; - case ID_TESTS_ZOOM_RESET: - if (browser.get()) - browser->SetZoomLevel(0.0); - return 0; - case ID_TESTS_DEVTOOLS_SHOW: - if (browser.get()) - browser->ShowDevTools(); - return 0; - case ID_TESTS_DEVTOOLS_CLOSE: - if (browser.get()) - browser->CloseDevTools(); - return 0; - case ID_TESTS_OSRAPP: // Test the OSR app - if (browser.get()) - osrplugin_test::RunTest(browser, false); - return 0; - case ID_TESTS_TRANSPARENT_OSRAPP: // Test the OSR app with transparency - if (browser.get()) - osrplugin_test::RunTest(browser, true); - return 0; - case ID_TESTS_GETIMAGE: - if (browser.get()) - RunGetImageTest(browser); - return 0; - case ID_TESTS_OTHER_TESTS: - if (browser.get()) - RunOtherTests(browser); - return 0; - } - break; - } - - case WM_PAINT: - hdc = BeginPaint(hWnd, &ps); - EndPaint(hWnd, &ps); - return 0; - - case WM_SETFOCUS: - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - // Pass focus to the browser window - PostMessage(g_handler->GetBrowserHwnd(), WM_SETFOCUS, wParam, NULL); - } - return 0; - - case WM_SIZE: - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - // Resize the browser window and address bar to match the new frame - // window size - RECT rect; - GetClientRect(hWnd, &rect); - rect.top += URLBAR_HEIGHT; - - int urloffset = rect.left + BUTTON_WIDTH * 4; - - HDWP hdwp = BeginDeferWindowPos(1); - hdwp = DeferWindowPos(hdwp, editWnd, NULL, urloffset, - 0, rect.right - urloffset, URLBAR_HEIGHT, SWP_NOZORDER); - hdwp = DeferWindowPos(hdwp, g_handler->GetBrowserHwnd(), NULL, - rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, - SWP_NOZORDER); - EndDeferWindowPos(hdwp); - } - break; - - case WM_ERASEBKGND: - if (g_handler.get() && g_handler->GetBrowserHwnd()) { - // Dont erase the background if the browser window has been loaded - // (this avoids flashing) - return 0; - } - break; - - case WM_ENTERMENULOOP: - if (!wParam) { - // Entering the menu loop for the application menu. - CefSetOSModalLoop(true); - } - break; - - case WM_EXITMENULOOP: - if (!wParam) { - // Exiting the menu loop for the application menu. - CefSetOSModalLoop(false); - } - break; - - case WM_CLOSE: - if (g_handler.get()) { - CefRefPtr browser = g_handler->GetBrowser(); - if (browser.get()) { - // Let the browser window know we are about to destroy it. - browser->ParentWindowWillClose(); - } - } - break; - - case WM_DESTROY: - // The frame window has exited - PostQuitMessage(0); - return 0; - } - - return DefWindowProc(hWnd, message, wParam, lParam); - } -} - -// Message handler for about box. -INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - UNREFERENCED_PARAMETER(lParam); - switch (message) { - case WM_INITDIALOG: - return (INT_PTR)TRUE; - - case WM_COMMAND: - if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { - EndDialog(hDlg, LOWORD(wParam)); - return (INT_PTR)TRUE; - } - break; - } - return (INT_PTR)FALSE; -} - - -// Global functions - -std::string AppGetWorkingDirectory() { - return szWorkingDir; -} - -void RunTransparentPopupTest(CefRefPtr browser) { - CefWindowInfo info; - CefBrowserSettings settings; - - // Initialize window info to the defaults for a popup window - info.SetAsPopup(NULL, "TransparentPopup"); - info.SetTransparentPainting(TRUE); - info.m_nWidth = 500; - info.m_nHeight = 500; - - // Creat the popup browser window - CefBrowser::CreateBrowser(info, - static_cast >(g_handler), - "http://tests/transparency", settings); -} - -namespace { - -// Determine a temporary path for the bitmap file. -bool GetBitmapTempPath(LPWSTR szTempName) { - DWORD dwRetVal; - DWORD dwBufSize = 512; - TCHAR lpPathBuffer[512]; - UINT uRetVal; - - dwRetVal = GetTempPath(dwBufSize, // length of the buffer - lpPathBuffer); // buffer for path - if (dwRetVal > dwBufSize || (dwRetVal == 0)) - return false; - - // Create a temporary file. - uRetVal = GetTempFileName(lpPathBuffer, // directory for tmp files - L"image", // temp file name prefix - 0, // create unique name - szTempName); // buffer for name - if (uRetVal == 0) - return false; - - size_t len = wcslen(szTempName); - wcscpy(szTempName + len - 3, L"bmp"); - return true; -} - -void UIT_RunGetImageTest(CefRefPtr browser) { - REQUIRE_UI_THREAD(); - - int width, height; - bool success = false; - - // Retrieve the image size. - if (browser->GetSize(PET_VIEW, width, height)) { - void* bits; - - // Populate the bitmap info header. - BITMAPINFOHEADER info; - info.biSize = sizeof(BITMAPINFOHEADER); - info.biWidth = width; - info.biHeight = -height; // minus means top-down bitmap - info.biPlanes = 1; - info.biBitCount = 32; - info.biCompression = BI_RGB; // no compression - info.biSizeImage = 0; - info.biXPelsPerMeter = 1; - info.biYPelsPerMeter = 1; - info.biClrUsed = 0; - info.biClrImportant = 0; - - // Create the bitmap and retrieve the bit buffer. - HDC screen_dc = GetDC(NULL); - HBITMAP bitmap = - CreateDIBSection(screen_dc, reinterpret_cast(&info), - DIB_RGB_COLORS, &bits, NULL, 0); - ReleaseDC(NULL, screen_dc); - - // Read the image into the bit buffer. - if (bitmap && browser->GetImage(PET_VIEW, width, height, bits)) { - // Populate the bitmap file header. - BITMAPFILEHEADER file; - file.bfType = 0x4d42; - file.bfSize = sizeof(BITMAPFILEHEADER); - file.bfReserved1 = 0; - file.bfReserved2 = 0; - file.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); - - TCHAR temp_path[512]; - if (GetBitmapTempPath(temp_path)) { - // Write the bitmap to file. - HANDLE file_handle = - CreateFile(temp_path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, 0); - if (file_handle != INVALID_HANDLE_VALUE) { - DWORD bytes_written = 0; - WriteFile(file_handle, &file, sizeof(file), &bytes_written, 0); - WriteFile(file_handle, &info, sizeof(info), &bytes_written, 0); - WriteFile(file_handle, bits, width * height * 4, &bytes_written, 0); - - CloseHandle(file_handle); - - // Open the bitmap in the default viewer. - ShellExecute(NULL, L"open", temp_path, NULL, NULL, SW_SHOWNORMAL); - success = true; - } - } - } - - DeleteObject(bitmap); - } - - if (!success) { - browser->GetMainFrame()->ExecuteJavaScript( - "alert('Failed to create image!');", - browser->GetMainFrame()->GetURL(), 0); - } -} - -} // namespace - -void RunGetImageTest(CefRefPtr browser) { - // Execute the test function on the UI thread. - CefPostTask(TID_UI, NewCefRunnableFunction(UIT_RunGetImageTest, browser)); -} diff --git a/cef1/tests/cefclient/client_handler.cpp b/cef1/tests/cefclient/client_handler.cpp deleted file mode 100644 index 573227c42..000000000 --- a/cef1/tests/cefclient/client_handler.cpp +++ /dev/null @@ -1,472 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "cefclient/client_handler.h" -#include -#include -#include -#include "include/cef_browser.h" -#include "include/cef_command_line.h" -#include "include/cef_frame.h" -#include "include/cef_url.h" -#include "cefclient/binding_test.h" -#include "cefclient/cefclient.h" -#include "cefclient/cefclient_switches.h" -#include "cefclient/download_handler.h" -#include "cefclient/performance_test.h" -#include "cefclient/resource_util.h" -#include "cefclient/string_util.h" - -#if defined(OS_WIN) -#include "cefclient/plugin_test.h" -#endif - -namespace { - -const char kTestOrigin[] = "http://tests/"; - -// Retrieve the file name and mime type based on the specified url. -bool ParseTestUrl(const std::string& url, - std::string* file_name, - std::string* mime_type) { - // Retrieve the path component. - CefURLParts parts; - CefParseURL(url, parts); - std::string file = CefString(&parts.path); - if (file.size() < 2) - return false; - - // Remove the leading slash. - file = file.substr(1); - - // Verify that the file name is valid. - for(size_t i = 0; i < file.size(); ++i) { - const char c = file[i]; - if (!isalpha(c) && !isdigit(c) && c != '_' && c != '.') - return false; - } - - // Determine the mime type based on the file extension, if any. - size_t pos = file.rfind("."); - if (pos != std::string::npos) { - std::string ext = file.substr(pos + 1); - if (ext == "html") - *mime_type = "text/html"; - else if (ext == "png") - *mime_type = "image/png"; - else - return false; - } else { - // Default to an html extension if none is specified. - *mime_type = "text/html"; - file += ".html"; - } - - *file_name = file; - return true; -} - -} // namespace - -ClientHandler::ClientHandler() - : m_MainHwnd(NULL), - m_BrowserHwnd(NULL), - m_EditHwnd(NULL), - m_BackHwnd(NULL), - m_ForwardHwnd(NULL), - m_StopHwnd(NULL), - m_ReloadHwnd(NULL), - m_bFormElementHasFocus(false) { - CefRefPtr commandLine = AppGetCommandLine(); - if (commandLine.get()) { - if (commandLine->HasSwitch(cefclient::kUrl)) - m_StartupURL = commandLine->GetSwitchValue(cefclient::kUrl); - else - m_StartupURL = "http://www.google.com/"; - } -} - -ClientHandler::~ClientHandler() { -} - - -void ClientHandler::OnAfterCreated(CefRefPtr browser) { - REQUIRE_UI_THREAD(); - - AutoLock lock_scope(this); - if (!m_Browser.get()) { - // We need to keep the main child window, but not popup windows - m_Browser = browser; - m_BrowserHwnd = browser->GetWindowHandle(); - } -} - -bool ClientHandler::DoClose(CefRefPtr browser) { - REQUIRE_UI_THREAD(); - - if (m_BrowserHwnd == browser->GetWindowHandle()) { - // Since the main window contains the browser window, we need to close - // the parent window instead of the browser window. - CloseMainWindow(); - - // Return true here so that we can skip closing the browser window - // in this pass. (It will be destroyed due to the call to close - // the parent above.) - return true; - } - - // A popup browser window is not contained in another window, so we can let - // these windows close by themselves. - return false; -} - -void ClientHandler::OnBeforeClose(CefRefPtr browser) { - REQUIRE_UI_THREAD(); - - if (m_BrowserHwnd == browser->GetWindowHandle()) { - // Free the browser pointer so that the browser can be destroyed - m_Browser = NULL; - } -} - -void ClientHandler::OnLoadStart(CefRefPtr browser, - CefRefPtr frame) { - REQUIRE_UI_THREAD(); - - if (m_BrowserHwnd == browser->GetWindowHandle() && frame->IsMain()) { - // We've just started loading a page - SetLoading(true); - } -} - -void ClientHandler::OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) { - REQUIRE_UI_THREAD(); - - if (m_BrowserHwnd == browser->GetWindowHandle() && frame->IsMain()) { - // We've just finished loading a page - SetLoading(false); - - CefRefPtr visitor = GetDOMVisitor(frame->GetURL()); - if (visitor.get()) - frame->VisitDOM(visitor); - } -} - -bool ClientHandler::OnLoadError(CefRefPtr browser, - CefRefPtr frame, - ErrorCode errorCode, - const CefString& failedUrl, - CefString& errorText) { - REQUIRE_UI_THREAD(); - - if (errorCode == ERR_CACHE_MISS) { - // Usually caused by navigating to a page with POST data via back or - // forward buttons. - errorText = "Expired Form Data" - "

Expired Form Data

" - "

Your form request has expired. " - "Click reload to re-submit the form data.

" - ""; - } else { - // All other messages. - std::stringstream ss; - ss << "Load Failed" - "

Load Failed

" - "

Load of URL " << std::string(failedUrl) << - " failed with error code " << static_cast(errorCode) << - ".

" - ""; - errorText = ss.str(); - } - - return false; -} - -bool ClientHandler::OnBeforeResourceLoad( - CefRefPtr browser, - CefRefPtr request, - CefString& redirectUrl, - CefRefPtr& resourceStream, - CefRefPtr response, - int loadFlags) { - std::string url = request->GetURL(); - if (url.find(kTestOrigin) == 0) { - // Handle URLs in the test origin. - std::string file_name, mime_type; - if (ParseTestUrl(url, &file_name, &mime_type)) { - if (file_name == "request.html") { - // Show the request contents. - std::string dump; - DumpRequestContents(request, dump); - resourceStream = CefStreamReader::CreateForData( - static_cast(const_cast(dump.c_str())), - dump.size()); - response->SetMimeType("text/plain"); - response->SetStatus(200); - } else { - // Load the resource from file. - resourceStream = - GetBinaryResourceReader(file_name.c_str()); - if (resourceStream.get()) { - response->SetMimeType(mime_type); - response->SetStatus(200); - } - } - } - } - - return false; -} - -bool ClientHandler::GetDownloadHandler(CefRefPtr browser, - const CefString& mimeType, - const CefString& fileName, - int64 contentLength, - CefRefPtr& handler) { - REQUIRE_UI_THREAD(); - - // Create the handler for the file download. - handler = CreateDownloadHandler(this, fileName); - - // Close the browser window if it is a popup with no other document contents. - if (browser->IsPopup() && !browser->HasDocument()) - browser->CloseBrowser(); - - return true; -} - -void ClientHandler::OnNavStateChange(CefRefPtr browser, - bool canGoBack, - bool canGoForward) { - REQUIRE_UI_THREAD(); - - SetNavState(canGoBack, canGoForward); -} - -bool ClientHandler::OnConsoleMessage(CefRefPtr browser, - const CefString& message, - const CefString& source, - int line) { - REQUIRE_UI_THREAD(); - - bool first_message; - std::string logFile; - - { - AutoLock lock_scope(this); - - first_message = m_LogFile.empty(); - if (first_message) { - std::stringstream ss; - ss << AppGetWorkingDirectory(); -#if defined(OS_WIN) - ss << "\\"; -#else - ss << "/"; -#endif - ss << "console.log"; - m_LogFile = ss.str(); - } - logFile = m_LogFile; - } - - FILE* file = fopen(logFile.c_str(), "a"); - if (file) { - std::stringstream ss; - ss << "Message: " << std::string(message) << "\r\nSource: " << - std::string(source) << "\r\nLine: " << line << - "\r\n-----------------------\r\n"; - fputs(ss.str().c_str(), file); - fclose(file); - - if (first_message) - SendNotification(NOTIFY_CONSOLE_MESSAGE); - } - - return false; -} - -void ClientHandler::OnFocusedNodeChanged(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr node) { - REQUIRE_UI_THREAD(); - - // Set to true if a form element has focus. - m_bFormElementHasFocus = (node.get() && node->IsFormControlElement()); -} - -bool ClientHandler::OnKeyEvent(CefRefPtr browser, - KeyEventType type, - int code, - int modifiers, - bool isSystemKey, - bool isAfterJavaScript) { - REQUIRE_UI_THREAD(); - - if (isAfterJavaScript && !m_bFormElementHasFocus && code == 0x20) { - // Special handling for the space character if a form element does not have - // focus. - if (type == KEYEVENT_RAWKEYDOWN) { - browser->GetMainFrame()->ExecuteJavaScript( - "alert('You pressed the space bar!');", "", 0); - } - return true; - } - - return false; -} - -bool ClientHandler::GetPrintHeaderFooter(CefRefPtr browser, - CefRefPtr frame, - const CefPrintInfo& printInfo, - const CefString& url, - const CefString& title, - int currentPage, - int maxPages, - CefString& topLeft, - CefString& topCenter, - CefString& topRight, - CefString& bottomLeft, - CefString& bottomCenter, - CefString& bottomRight) { - REQUIRE_UI_THREAD(); - - // Place the page title at top left - topLeft = title; - // Place the page URL at top right - topRight = url; - - // Place "Page X of Y" at bottom center - std::stringstream strstream; - strstream << "Page " << currentPage << " of " << maxPages; - bottomCenter = strstream.str(); - - return false; -} - -void ClientHandler::OnContextCreated(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr context) { - REQUIRE_UI_THREAD(); - - CefRefPtr object = context->GetGlobal(); - - // Add the V8 bindings. - binding_test::InitTest(browser, frame, object); - - std::string url = frame->GetURL(); - if (url == performance_test::kTestUrl) - performance_test::InitTest(browser, frame, object); -} - -bool ClientHandler::OnDragStart(CefRefPtr browser, - CefRefPtr dragData, - DragOperationsMask mask) { - REQUIRE_UI_THREAD(); - - // Forbid dragging of image files. - if (dragData->IsFile()) { - std::string fileName = dragData->GetFileName(); - if (fileName.find(".png") != std::string::npos || - fileName.find(".jpg") != std::string::npos || - fileName.find(".gif") != std::string::npos) - return true; - } - - return false; -} - -bool ClientHandler::OnDragEnter(CefRefPtr browser, - CefRefPtr dragData, - DragOperationsMask mask) { - REQUIRE_UI_THREAD(); - - // Forbid dragging of link URLs. - if (dragData->IsLink()) - return true; - - return false; -} - -bool ClientHandler::OnBeforeScriptExtensionLoad( - CefRefPtr browser, - CefRefPtr frame, - const CefString& extensionName) { - return false; -} - -void ClientHandler::OnRequestGeolocationPermission( - CefRefPtr browser, - const CefString& requesting_url, - int request_id, - CefRefPtr callback) { - // Allow geolocation access from all websites. - callback->Continue(true); -} - -void ClientHandler::NotifyDownloadComplete(const CefString& fileName) { - SetLastDownloadFile(fileName); - SendNotification(NOTIFY_DOWNLOAD_COMPLETE); -} - -void ClientHandler::NotifyDownloadError(const CefString& fileName) { - SetLastDownloadFile(fileName); - SendNotification(NOTIFY_DOWNLOAD_ERROR); -} - -void ClientHandler::SetMainHwnd(CefWindowHandle hwnd) { - AutoLock lock_scope(this); - m_MainHwnd = hwnd; -} - -void ClientHandler::SetEditHwnd(CefWindowHandle hwnd) { - AutoLock lock_scope(this); - m_EditHwnd = hwnd; -} - -void ClientHandler::SetButtonHwnds(CefWindowHandle backHwnd, - CefWindowHandle forwardHwnd, - CefWindowHandle reloadHwnd, - CefWindowHandle stopHwnd) { - AutoLock lock_scope(this); - m_BackHwnd = backHwnd; - m_ForwardHwnd = forwardHwnd; - m_ReloadHwnd = reloadHwnd; - m_StopHwnd = stopHwnd; -} - -std::string ClientHandler::GetLogFile() { - AutoLock lock_scope(this); - return m_LogFile; -} - -void ClientHandler::SetLastDownloadFile(const std::string& fileName) { - AutoLock lock_scope(this); - m_LastDownloadFile = fileName; -} - -std::string ClientHandler::GetLastDownloadFile() { - AutoLock lock_scope(this); - return m_LastDownloadFile; -} - -void ClientHandler::AddDOMVisitor(const std::string& path, - CefRefPtr visitor) { - AutoLock lock_scope(this); - DOMVisitorMap::iterator it = m_DOMVisitors.find(path); - if (it == m_DOMVisitors.end()) - m_DOMVisitors.insert(std::make_pair(path, visitor)); - else - it->second = visitor; -} - -CefRefPtr ClientHandler::GetDOMVisitor(const std::string& path) { - AutoLock lock_scope(this); - DOMVisitorMap::iterator it = m_DOMVisitors.find(path); - if (it != m_DOMVisitors.end()) - return it->second; - return NULL; -} diff --git a/cef1/tests/cefclient/client_handler.h b/cef1/tests/cefclient/client_handler.h deleted file mode 100644 index 4ee2fa269..000000000 --- a/cef1/tests/cefclient/client_handler.h +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_CLIENT_HANDLER_H_ -#define CEF_TESTS_CEFCLIENT_CLIENT_HANDLER_H_ -#pragma once - -#include -#include -#include -#include "include/cef_client.h" -#include "cefclient/download_handler.h" -#include "cefclient/util.h" - - -// Define this value to redirect all popup URLs to the main application browser -// window. -// #define TEST_REDIRECT_POPUP_URLS - - -// ClientHandler implementation. -class ClientHandler : public CefClient, - public CefLifeSpanHandler, - public CefLoadHandler, - public CefRequestHandler, - public CefDisplayHandler, - public CefFocusHandler, - public CefKeyboardHandler, - public CefPrintHandler, - public CefV8ContextHandler, - public CefDragHandler, - public CefPermissionHandler, - public CefGeolocationHandler, - public DownloadListener { - public: - ClientHandler(); - virtual ~ClientHandler(); - - // CefClient methods - virtual CefRefPtr GetLifeSpanHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetLoadHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetRequestHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetDisplayHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetFocusHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetKeyboardHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetPrintHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetV8ContextHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetDragHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetPermissionHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetGeolocationHandler() OVERRIDE { - return this; - } - - // CefLifeSpanHandler methods - virtual bool OnBeforePopup(CefRefPtr parentBrowser, - const CefPopupFeatures& popupFeatures, - CefWindowInfo& windowInfo, - const CefString& url, - CefRefPtr& client, - CefBrowserSettings& settings) OVERRIDE; - virtual void OnAfterCreated(CefRefPtr browser) OVERRIDE; - virtual bool DoClose(CefRefPtr browser) OVERRIDE; - virtual void OnBeforeClose(CefRefPtr browser) OVERRIDE; - - // CefLoadHandler methods - virtual void OnLoadStart(CefRefPtr browser, - CefRefPtr frame) OVERRIDE; - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE; - virtual bool OnLoadError(CefRefPtr browser, - CefRefPtr frame, - ErrorCode errorCode, - const CefString& failedUrl, - CefString& errorText) OVERRIDE; - - // CefRequestHandler methods - virtual bool OnBeforeResourceLoad(CefRefPtr browser, - CefRefPtr request, - CefString& redirectUrl, - CefRefPtr& resourceStream, - CefRefPtr response, - int loadFlags) OVERRIDE; - virtual bool GetDownloadHandler(CefRefPtr browser, - const CefString& mimeType, - const CefString& fileName, - int64 contentLength, - CefRefPtr& handler) - OVERRIDE; - - // CefDisplayHandler methods - virtual void OnNavStateChange(CefRefPtr browser, - bool canGoBack, - bool canGoForward) OVERRIDE; - virtual void OnAddressChange(CefRefPtr browser, - CefRefPtr frame, - const CefString& url) OVERRIDE; - virtual void OnTitleChange(CefRefPtr browser, - const CefString& title) OVERRIDE; - virtual bool OnConsoleMessage(CefRefPtr browser, - const CefString& message, - const CefString& source, - int line) OVERRIDE; - - // CefFocusHandler methods. - virtual void OnFocusedNodeChanged(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr node) OVERRIDE; - - // CefKeyboardHandler methods. - virtual bool OnKeyEvent(CefRefPtr browser, - KeyEventType type, - int code, - int modifiers, - bool isSystemKey, - bool isAfterJavaScript) OVERRIDE; - - // CefPrintHandler methods. - virtual bool GetPrintHeaderFooter(CefRefPtr browser, - CefRefPtr frame, - const CefPrintInfo& printInfo, - const CefString& url, - const CefString& title, - int currentPage, - int maxPages, - CefString& topLeft, - CefString& topCenter, - CefString& topRight, - CefString& bottomLeft, - CefString& bottomCenter, - CefString& bottomRight) OVERRIDE; - - // CefV8ContextHandler methods - virtual void OnContextCreated(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr context) OVERRIDE; - - // CefDragHandler methods. - virtual bool OnDragStart(CefRefPtr browser, - CefRefPtr dragData, - DragOperationsMask mask) OVERRIDE; - virtual bool OnDragEnter(CefRefPtr browser, - CefRefPtr dragData, - DragOperationsMask mask) OVERRIDE; - - // CefPermissionHandler methods. - virtual bool OnBeforeScriptExtensionLoad(CefRefPtr browser, - CefRefPtr frame, - const CefString& extensionName) OVERRIDE; - - // CefGeolocationHandler methods. - virtual void OnRequestGeolocationPermission( - CefRefPtr browser, - const CefString& requesting_url, - int request_id, - CefRefPtr callback) OVERRIDE; - - // DownloadListener methods - virtual void NotifyDownloadComplete(const CefString& fileName) OVERRIDE; - virtual void NotifyDownloadError(const CefString& fileName) OVERRIDE; - - void SetMainHwnd(CefWindowHandle hwnd); - CefWindowHandle GetMainHwnd() { return m_MainHwnd; } - void SetEditHwnd(CefWindowHandle hwnd); - void SetButtonHwnds(CefWindowHandle backHwnd, - CefWindowHandle forwardHwnd, - CefWindowHandle reloadHwnd, - CefWindowHandle stopHwnd); - - CefRefPtr GetBrowser() { return m_Browser; } - CefWindowHandle GetBrowserHwnd() { return m_BrowserHwnd; } - - std::string GetLogFile(); - - std::string GetStartupURL() const { return m_StartupURL; } - - void SetLastDownloadFile(const std::string& fileName); - std::string GetLastDownloadFile(); - - // DOM visitors will be called after the associated path is loaded. - void AddDOMVisitor(const std::string& path, CefRefPtr visitor); - CefRefPtr GetDOMVisitor(const std::string& path); - - // Send a notification to the application. Notifications should not block the - // caller. - enum NotificationType { - NOTIFY_CONSOLE_MESSAGE, - NOTIFY_DOWNLOAD_COMPLETE, - NOTIFY_DOWNLOAD_ERROR, - }; - void SendNotification(NotificationType type); - void CloseMainWindow(); - - protected: - void SetLoading(bool isLoading); - void SetNavState(bool canGoBack, bool canGoForward); - - // The child browser window - CefRefPtr m_Browser; - - // The main frame window handle - CefWindowHandle m_MainHwnd; - - // The child browser window handle - CefWindowHandle m_BrowserHwnd; - - // The edit window handle - CefWindowHandle m_EditHwnd; - - // The button window handles - CefWindowHandle m_BackHwnd; - CefWindowHandle m_ForwardHwnd; - CefWindowHandle m_StopHwnd; - CefWindowHandle m_ReloadHwnd; - - // Support for logging. - std::string m_LogFile; - - // Support for downloading files. - std::string m_LastDownloadFile; - - // Support for DOM visitors. - typedef std::map > DOMVisitorMap; - DOMVisitorMap m_DOMVisitors; - - // True if a form element currently has focus - bool m_bFormElementHasFocus; - - // The URL to be loaded at application startup. - std::string m_StartupURL; - - // Include the default reference counting implementation. - IMPLEMENT_REFCOUNTING(ClientHandler); - // Include the default locking implementation. - IMPLEMENT_LOCKING(ClientHandler); -}; - -#endif // CEF_TESTS_CEFCLIENT_CLIENT_HANDLER_H_ diff --git a/cef1/tests/cefclient/client_handler_gtk.cpp b/cef1/tests/cefclient/client_handler_gtk.cpp deleted file mode 100644 index 4f6903b6a..000000000 --- a/cef1/tests/cefclient/client_handler_gtk.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 -#include -#include "cefclient/client_handler.h" -#include "include/cef_browser.h" -#include "include/cef_frame.h" - -// ClientHandler::ClientLifeSpanHandler implementation -bool ClientHandler::OnBeforePopup(CefRefPtr parentBrowser, - const CefPopupFeatures& popupFeatures, - CefWindowInfo& windowInfo, - const CefString& url, - CefRefPtr& client, - CefBrowserSettings& settings) { - REQUIRE_UI_THREAD(); - - return false; -} - -void ClientHandler::OnAddressChange(CefRefPtr browser, - CefRefPtr frame, - const CefString& url) { - REQUIRE_UI_THREAD(); - - if (m_BrowserHwnd == browser->GetWindowHandle() && frame->IsMain()) { - // Set the edit window text - std::string urlStr(url); - gtk_entry_set_text(GTK_ENTRY(m_EditHwnd), urlStr.c_str()); - } -} - -void ClientHandler::OnTitleChange(CefRefPtr browser, - const CefString& title) { - REQUIRE_UI_THREAD(); - - GtkWidget* window = - gtk_widget_get_ancestor(GTK_WIDGET(browser->GetWindowHandle()), - GTK_TYPE_WINDOW); - std::string titleStr(title); - gtk_window_set_title(GTK_WINDOW(window), titleStr.c_str()); -} - -void ClientHandler::SendNotification(NotificationType type) { - // TODO(port): Implement this method. -} - -void ClientHandler::SetLoading(bool isLoading) { - if (isLoading) - gtk_widget_set_sensitive(GTK_WIDGET(m_StopHwnd), true); - else - gtk_widget_set_sensitive(GTK_WIDGET(m_StopHwnd), false); -} - -void ClientHandler::SetNavState(bool canGoBack, bool canGoForward) { - if (canGoBack) - gtk_widget_set_sensitive(GTK_WIDGET(m_BackHwnd), true); - else - gtk_widget_set_sensitive(GTK_WIDGET(m_BackHwnd), false); - - if (canGoForward) - gtk_widget_set_sensitive(GTK_WIDGET(m_ForwardHwnd), true); - else - gtk_widget_set_sensitive(GTK_WIDGET(m_ForwardHwnd), false); -} - -void ClientHandler::CloseMainWindow() { - // TODO(port): Close main window. -} diff --git a/cef1/tests/cefclient/client_handler_mac.mm b/cef1/tests/cefclient/client_handler_mac.mm deleted file mode 100644 index e57c8f14e..000000000 --- a/cef1/tests/cefclient/client_handler_mac.mm +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 - -#include "cefclient/client_handler.h" -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "cefclient/cefclient.h" - -#ifdef TEST_REDIRECT_POPUP_URLS -#include "cefclient/client_popup_handler.h" -#endif - -// ClientHandler::ClientLifeSpanHandler implementation - -bool ClientHandler::OnBeforePopup(CefRefPtr parentBrowser, - const CefPopupFeatures& popupFeatures, - CefWindowInfo& windowInfo, - const CefString& url, - CefRefPtr& client, - CefBrowserSettings& settings) { - REQUIRE_UI_THREAD(); - -#ifdef TEST_REDIRECT_POPUP_URLS - std::string urlStr = url; - if (urlStr.find("chrome-devtools:") == std::string::npos) { - // Show all popup windows excluding DevTools in the current window. - windowInfo.m_bHidden = true; - client = new ClientPopupHandler(m_Browser); - } -#endif // TEST_REDIRECT_POPUP_URLS - - return false; -} - -void ClientHandler::OnAddressChange(CefRefPtr browser, - CefRefPtr frame, - const CefString& url) { - REQUIRE_UI_THREAD(); - - if (m_BrowserHwnd == browser->GetWindowHandle() && frame->IsMain()) { - // Set the edit window text - NSTextField* textField = (NSTextField*)m_EditHwnd; - std::string urlStr(url); - NSString* str = [NSString stringWithUTF8String:urlStr.c_str()]; - [textField setStringValue:str]; - } -} - -void ClientHandler::OnTitleChange(CefRefPtr browser, - const CefString& title) { - REQUIRE_UI_THREAD(); - - // Set the frame window title bar - NSView* view = (NSView*)browser->GetWindowHandle(); - NSWindow* window = [view window]; - std::string titleStr(title); - NSString* str = [NSString stringWithUTF8String:titleStr.c_str()]; - [window setTitle:str]; -} - -void ClientHandler::SendNotification(NotificationType type) { - SEL sel = nil; - switch(type) { - case NOTIFY_CONSOLE_MESSAGE: - sel = @selector(notifyConsoleMessage:); - break; - case NOTIFY_DOWNLOAD_COMPLETE: - sel = @selector(notifyDownloadComplete:); - break; - case NOTIFY_DOWNLOAD_ERROR: - sel = @selector(notifyDownloadError:); - break; - } - - if (sel == nil) - return; - - NSWindow* window = [AppGetMainHwnd() window]; - NSObject* delegate = [window delegate]; - [delegate performSelectorOnMainThread:sel withObject:nil waitUntilDone:NO]; -} - -void ClientHandler::SetLoading(bool isLoading) { - // TODO(port): Change button status. -} - -void ClientHandler::SetNavState(bool canGoBack, bool canGoForward) { - // TODO(port): Change button status. -} - -void ClientHandler::CloseMainWindow() { - // TODO(port): Close window -} diff --git a/cef1/tests/cefclient/client_handler_win.cpp b/cef1/tests/cefclient/client_handler_win.cpp deleted file mode 100644 index c9f93e4bb..000000000 --- a/cef1/tests/cefclient/client_handler_win.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "cefclient/client_handler.h" -#include -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "cefclient/performance_test.h" -#include "cefclient/resource.h" -#include "cefclient/resource_util.h" -#include "cefclient/string_util.h" - -#ifdef TEST_REDIRECT_POPUP_URLS -#include "cefclient/client_popup_handler.h" -#endif - -bool ClientHandler::OnBeforePopup(CefRefPtr parentBrowser, - const CefPopupFeatures& popupFeatures, - CefWindowInfo& windowInfo, - const CefString& url, - CefRefPtr& client, - CefBrowserSettings& settings) { - REQUIRE_UI_THREAD(); - -#ifdef TEST_REDIRECT_POPUP_URLS - std::string urlStr = url; - if (urlStr.find("chrome-devtools:") == std::string::npos) { - // Show all popup windows excluding DevTools in the current window. - windowInfo.m_dwStyle &= ~WS_VISIBLE; - client = new ClientPopupHandler(m_Browser); - } -#endif // TEST_REDIRECT_POPUP_URLS - - return false; -} - -void ClientHandler::OnAddressChange(CefRefPtr browser, - CefRefPtr frame, - const CefString& url) { - REQUIRE_UI_THREAD(); - - if (m_BrowserHwnd == browser->GetWindowHandle() && frame->IsMain()) { - // Set the edit window text - SetWindowText(m_EditHwnd, std::wstring(url).c_str()); - } -} - -void ClientHandler::OnTitleChange(CefRefPtr browser, - const CefString& title) { - REQUIRE_UI_THREAD(); - - // Set the frame window title bar - CefWindowHandle hwnd = browser->GetWindowHandle(); - if (m_BrowserHwnd == hwnd) { - // The frame window will be the parent of the browser window - hwnd = GetParent(hwnd); - } - SetWindowText(hwnd, std::wstring(title).c_str()); -} - -void ClientHandler::SendNotification(NotificationType type) { - UINT id; - switch (type) { - case NOTIFY_CONSOLE_MESSAGE: - id = ID_WARN_CONSOLEMESSAGE; - break; - case NOTIFY_DOWNLOAD_COMPLETE: - id = ID_WARN_DOWNLOADCOMPLETE; - break; - case NOTIFY_DOWNLOAD_ERROR: - id = ID_WARN_DOWNLOADERROR; - break; - default: - return; - } - PostMessage(m_MainHwnd, WM_COMMAND, id, 0); -} - -void ClientHandler::SetLoading(bool isLoading) { - ASSERT(m_EditHwnd != NULL && m_ReloadHwnd != NULL && m_StopHwnd != NULL); - EnableWindow(m_EditHwnd, TRUE); - EnableWindow(m_ReloadHwnd, !isLoading); - EnableWindow(m_StopHwnd, isLoading); -} - -void ClientHandler::SetNavState(bool canGoBack, bool canGoForward) { - ASSERT(m_BackHwnd != NULL && m_ForwardHwnd != NULL); - EnableWindow(m_BackHwnd, canGoBack); - EnableWindow(m_ForwardHwnd, canGoForward); -} - -void ClientHandler::CloseMainWindow() { - ::PostMessage(m_MainHwnd, WM_CLOSE, 0, 0); -} diff --git a/cef1/tests/cefclient/client_popup_handler.cpp b/cef1/tests/cefclient/client_popup_handler.cpp deleted file mode 100644 index dfb48fdb7..000000000 --- a/cef1/tests/cefclient/client_popup_handler.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "cefclient/client_popup_handler.h" -#include "include/cef_frame.h" -#include "cefclient/util.h" - -ClientPopupHandler::ClientPopupHandler(CefRefPtr parentBrowser) - : m_ParentBrowser(parentBrowser) { - ASSERT(m_ParentBrowser.get()); -} - -ClientPopupHandler::~ClientPopupHandler() { -} - -bool ClientPopupHandler::OnBeforeBrowse(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr request, - NavType navType, - bool isRedirect) { - REQUIRE_UI_THREAD(); - - // Load the request in the parent browser window. - m_ParentBrowser->GetMainFrame()->LoadRequest(request); - browser->CloseBrowser(); - m_ParentBrowser = NULL; - - return true; -} diff --git a/cef1/tests/cefclient/client_popup_handler.h b/cef1/tests/cefclient/client_popup_handler.h deleted file mode 100644 index 522609e7b..000000000 --- a/cef1/tests/cefclient/client_popup_handler.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_CLIENT_POPUP_HANDLER_H_ -#define CEF_TESTS_CEFCLIENT_CLIENT_POPUP_HANDLER_H_ -#pragma once - -#include "include/cef_browser.h" -#include "include/cef_client.h" -#include "include/cef_request_handler.h" - -// Handler for popup windows that loads the request in an existing browser -// window. -class ClientPopupHandler : public CefClient, - public CefRequestHandler { - public: - explicit ClientPopupHandler(CefRefPtr parentBrowser); - virtual ~ClientPopupHandler(); - - // CefClient methods - virtual CefRefPtr GetRequestHandler() OVERRIDE { - return this; - } - - // CefRequestHandler methods - virtual bool OnBeforeBrowse(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr request, - NavType navType, - bool isRedirect) OVERRIDE; - protected: - CefRefPtr m_ParentBrowser; - - // Include the default reference counting implementation. - IMPLEMENT_REFCOUNTING(ClientPopupHandler); -}; - -#endif // CEF_TESTS_CEFCLIENT_CLIENT_POPUP_HANDLER_H_ diff --git a/cef1/tests/cefclient/clientplugin.cpp b/cef1/tests/cefclient/clientplugin.cpp deleted file mode 100644 index ee9858dd3..000000000 --- a/cef1/tests/cefclient/clientplugin.cpp +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "cefclient/clientplugin.h" - -#if defined(OS_WIN) - -#include - -namespace { - -// Client plugin window implementation. -class ClientPlugin { - public: - ClientPlugin() - : hwnd_(NULL) { - } - - ~ClientPlugin() { - if (IsWindow(hwnd_)) - DestroyWindow(hwnd_); - } - - void Initialize(HWND parent_hwnd) { - if (hwnd_ != NULL) - return; - - HINSTANCE hInstance = GetModuleHandle(NULL); - - static bool class_registered = false; - if (!class_registered) { - // Register the window class. - WNDCLASS wc = {0}; - wc.style = CS_OWNDC; - wc.lpfnWndProc = PluginWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); - wc.lpszMenuName = NULL; - wc.lpszClassName = L"ClientPlugin"; - RegisterClass(&wc); - - class_registered = true; - } - - // Create the main window. - hwnd_ = CreateWindow(L"ClientPlugin", L"Client Plugin", - WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, 0, 0, parent_hwnd, - NULL, hInstance, NULL); - - SetWindowLongPtr(hwnd_, GWLP_USERDATA, reinterpret_cast(this)); - - // Size and display the plugin window. - RECT parent_rect; - GetClientRect(parent_hwnd, &parent_rect); - SetWindowPos(hwnd_, NULL, parent_rect.left, parent_rect.top, - parent_rect.right - parent_rect.left, - parent_rect.bottom - parent_rect.top, SWP_SHOWWINDOW); - } - - void EraseBackground(HDC hdc) { - RECT erase_rect; - GetClipBox(hdc, &erase_rect); - HBRUSH brush = CreateSolidBrush(RGB(0, 255, 0)); - FillRect(hdc, &erase_rect, brush); - DeleteObject(brush); - } - - void Paint(HDC hdc) { - static LPCWSTR text = L"Left click in the green area for a message box!"; - - RECT client_rect; - GetClientRect(hwnd_, &client_rect); - - int old_mode = SetBkMode(hdc, TRANSPARENT); - COLORREF old_color = SetTextColor(hdc, RGB(0, 0, 255)); - - RECT text_rect = client_rect; - DrawText(hdc, text, -1, &text_rect, DT_CENTER | DT_CALCRECT); - - client_rect.top = ((client_rect.bottom - client_rect.top) - - (text_rect.bottom - text_rect.top)) / 2; - DrawText(hdc, text, -1, &client_rect, DT_CENTER); - - SetBkMode(hdc, old_mode); - SetTextColor(hdc, old_color); - } - - HWND GetWindow() const { return hwnd_; } - - // Plugin window procedure. - static LRESULT CALLBACK PluginWndProc(HWND hwnd_, UINT message, WPARAM wParam, - LPARAM lParam) { - ClientPlugin* plugin = - reinterpret_cast(GetWindowLongPtr(hwnd_, GWLP_USERDATA)); - - switch (message) { - case WM_DESTROY: - return 0; - - case WM_LBUTTONDOWN: - MessageBox(plugin->GetWindow(), - L"You clicked on the client plugin!", L"Client Plugin", MB_OK); - return 0; - - case WM_PAINT: { - PAINTSTRUCT ps; - BeginPaint(hwnd_, &ps); - plugin->Paint(ps.hdc); - EndPaint(hwnd_, &ps); - return 0; - } - - case WM_PRINTCLIENT: - plugin->Paint(reinterpret_cast(wParam)); - return 0; - - case WM_ERASEBKGND: - plugin->EraseBackground(reinterpret_cast(wParam)); - return 1; - } - - return DefWindowProc(hwnd_, message, wParam, lParam); - } - - private: - HWND hwnd_; -}; - -NPError NPP_NewImpl(NPMIMEType plugin_type, NPP instance, uint16 mode, - int16 argc, char* argn[], char* argv[], - NPSavedData* saved) { - if (instance == NULL) - return NPERR_INVALID_INSTANCE_ERROR; - - ClientPlugin* plugin = new ClientPlugin(); - instance->pdata = reinterpret_cast(plugin); - - return NPERR_NO_ERROR; -} - -NPError NPP_DestroyImpl(NPP instance, NPSavedData** save) { - ClientPlugin* plugin = reinterpret_cast(instance->pdata); - if (plugin) - delete plugin; - - return NPERR_NO_ERROR; -} - -NPError NPP_SetWindowImpl(NPP instance, NPWindow* window_info) { - if (instance == NULL) - return NPERR_INVALID_INSTANCE_ERROR; - - if (window_info == NULL) - return NPERR_GENERIC_ERROR; - - ClientPlugin* plugin = reinterpret_cast(instance->pdata); - HWND parent_hwnd = reinterpret_cast(window_info->window); - plugin->Initialize(parent_hwnd); - - return NPERR_NO_ERROR; -} - -} // namespace - -NPError API_CALL NP_ClientGetEntryPoints(NPPluginFuncs* pFuncs) { - pFuncs->newp = NPP_NewImpl; - pFuncs->destroy = NPP_DestroyImpl; - pFuncs->setwindow = NPP_SetWindowImpl; - return NPERR_NO_ERROR; -} - -NPError API_CALL NP_ClientInitialize(NPNetscapeFuncs* pFuncs) { - return NPERR_NO_ERROR; -} - -NPError API_CALL NP_ClientShutdown(void) { - return NPERR_NO_ERROR; -} - -#endif // OS_WIN diff --git a/cef1/tests/cefclient/clientplugin.h b/cef1/tests/cefclient/clientplugin.h deleted file mode 100644 index 27b5de762..000000000 --- a/cef1/tests/cefclient/clientplugin.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_CLIENTPLUGIN_H_ -#define CEF_TESTS_CEFCLIENT_CLIENTPLUGIN_H_ -#pragma once - -#include "include/internal/cef_types.h" - -#if defined(OS_WIN) - -#include "include/cef_nplugin.h" - -NPError API_CALL NP_ClientGetEntryPoints(NPPluginFuncs* pFuncs); -NPError API_CALL NP_ClientInitialize(NPNetscapeFuncs* pFuncs); -NPError API_CALL NP_ClientShutdown(void); - -#endif // OS_WIN - -#endif // CEF_TESTS_CEFCLIENT_CLIENTPLUGIN_H_ diff --git a/cef1/tests/cefclient/download_handler.cpp b/cef1/tests/cefclient/download_handler.cpp deleted file mode 100644 index d7f02a43f..000000000 --- a/cef1/tests/cefclient/download_handler.cpp +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework 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 "cefclient/download_handler.h" -#include -#include -#include -#include "include/cef_download_handler.h" -#include "include/cef_runnable.h" -#include "cefclient/util.h" - -#if defined(OS_WIN) -#include // NOLINT(build/include_order) -#include // NOLINT(build/include_order) -#include // NOLINT(build/include_order) -#endif // OS_WIN - -// Implementation of the CefDownloadHandler interface. -class ClientDownloadHandler : public CefDownloadHandler { - public: - ClientDownloadHandler(CefRefPtr listener, - const CefString& fileName) - : listener_(listener), filename_(fileName), file_(NULL) { - } - - ~ClientDownloadHandler() { - ASSERT(pending_data_.empty()); - ASSERT(file_ == NULL); - - if (!pending_data_.empty()) { - // Delete remaining pending data. - std::vector*>::iterator it = pending_data_.begin(); - for (; it != pending_data_.end(); ++it) - delete (*it); - } - - if (file_) { - // Close the dangling file pointer on the FILE thread. - CefPostTask(TID_FILE, - NewCefRunnableFunction(&ClientDownloadHandler::CloseDanglingFile, - file_)); - - // Notify the listener that the download failed. - listener_->NotifyDownloadError(filename_); - } - } - - // -------------------------------------------------- - // The following methods are called on the UI thread. - // -------------------------------------------------- - - void Initialize() { - // Open the file on the FILE thread. - CefPostTask(TID_FILE, - NewCefRunnableMethod(this, &ClientDownloadHandler::OnOpen)); - } - - // A portion of the file contents have been received. This method will be - // called multiple times until the download is complete. Return |true| to - // continue receiving data and |false| to cancel. - virtual bool ReceivedData(void* data, int data_size) { - REQUIRE_UI_THREAD(); - - if (data_size == 0) - return true; - - // Create a new vector for the data. - std::vector* buffer = new std::vector(data_size); - memcpy(&(*buffer)[0], data, data_size); - - // Add the new data vector to the pending data queue. - { - AutoLock lock_scope(this); - pending_data_.push_back(buffer); - } - - // Write data to file on the FILE thread. - CefPostTask(TID_FILE, - NewCefRunnableMethod(this, &ClientDownloadHandler::OnReceivedData)); - return true; - } - - // The download is complete. - virtual void Complete() { - REQUIRE_UI_THREAD(); - - // Flush and close the file on the FILE thread. - CefPostTask(TID_FILE, - NewCefRunnableMethod(this, &ClientDownloadHandler::OnComplete)); - } - - // ---------------------------------------------------- - // The following methods are called on the FILE thread. - // ---------------------------------------------------- - - void OnOpen() { - REQUIRE_FILE_THREAD(); - - if (file_) - return; - -#if defined(OS_WIN) - TCHAR szFolderPath[MAX_PATH]; - - // Save the file in the user's "My Documents" folder. - if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL|CSIDL_FLAG_CREATE, - NULL, 0, szFolderPath))) { - std::wstring fileNameStr = filename_; - LPWSTR name = PathFindFileName(fileNameStr.c_str()); - LPWSTR ext = PathFindExtension(fileNameStr.c_str()); - int ct = 0; - std::wstringstream ss; - - if (ext) { - name[ext-name] = 0; - ext++; - } - - // Make sure the file name is unique. - do { - if (ct > 0) - ss.str(L""); - ss << szFolderPath << L"\\" << name; - if (ct > 0) - ss << L" (" << ct << L")"; - if (ext) - ss << L"." << ext; - ct++; - } while (PathFileExists(ss.str().c_str())); - - { - AutoLock lock_scope(this); - filename_ = ss.str(); - } - - file_ = _wfopen(ss.str().c_str(), L"wb"); - ASSERT(file_ != NULL); - } -#else - // TODO(port): Implement this. - ASSERT(false); // Not implemented -#endif - } - - void OnComplete() { - REQUIRE_FILE_THREAD(); - - if (!file_) - return; - - // Make sure any pending data is written. - OnReceivedData(); - - fclose(file_); - file_ = NULL; - - // Notify the listener that the download completed. - listener_->NotifyDownloadComplete(filename_); - } - - void OnReceivedData() { - REQUIRE_FILE_THREAD(); - - std::vector*> data; - - // Remove all data from the pending data queue. - { - AutoLock lock_scope(this); - if (!pending_data_.empty()) { - data = pending_data_; - pending_data_.clear(); - } - } - - if (data.empty()) - return; - - // Write all pending data to file. - std::vector*>::iterator it = data.begin(); - for (; it != data.end(); ++it) { - std::vector* buffer = *it; - if (file_) { - size_t total = 0; - do { - size_t write = - fwrite(&(*buffer)[total], 1, buffer->size() - total, file_); - if (write == 0) - break; - total += write; - } while (total < buffer->size()); - } - delete buffer; - } - data.clear(); - } - - static void CloseDanglingFile(FILE *file) { - fclose(file); - } - - private: - CefRefPtr listener_; - CefString filename_; - FILE* file_; - std::vector*> pending_data_; - - IMPLEMENT_REFCOUNTING(ClientDownloadHandler); - IMPLEMENT_LOCKING(ClientDownloadHandler); -}; - -CefRefPtr CreateDownloadHandler( - CefRefPtr listener, const CefString& fileName) { - CefRefPtr handler = - new ClientDownloadHandler(listener, fileName); - handler->Initialize(); - return handler.get(); -} diff --git a/cef1/tests/cefclient/download_handler.h b/cef1/tests/cefclient/download_handler.h deleted file mode 100644 index 40a627ea6..000000000 --- a/cef1/tests/cefclient/download_handler.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_DOWNLOAD_HANDLER_H_ -#define CEF_TESTS_CEFCLIENT_DOWNLOAD_HANDLER_H_ -#pragma once - -#include "include/cef_base.h" - -class CefDownloadHandler; - -// Implement this interface to receive download notifications. -class DownloadListener : public virtual CefBase { - public: - // Called when the download is complete. - virtual void NotifyDownloadComplete(const CefString& fileName) =0; - - // Called if the download fails. - virtual void NotifyDownloadError(const CefString& fileName) =0; -}; - -// Create a new download handler to manage download of a single file. -CefRefPtr CreateDownloadHandler( - CefRefPtr listener, const CefString& fileName); - -#endif // CEF_TESTS_CEFCLIENT_DOWNLOAD_HANDLER_H_ diff --git a/cef1/tests/cefclient/extension_test.cpp b/cef1/tests/cefclient/extension_test.cpp deleted file mode 100644 index 921be81a0..000000000 --- a/cef1/tests/cefclient/extension_test.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "cefclient/extension_test.h" -#include -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "include/cef_stream.h" -#include "include/cef_v8.h" - -namespace extension_test { - -namespace { - -// Implementation of the V8 handler class for the "cef.test" extension. -class ClientV8ExtensionHandler : public CefV8Handler { - public: - ClientV8ExtensionHandler() : test_param_("An initial string value.") {} - virtual ~ClientV8ExtensionHandler() {} - - // Execute with the specified argument list and return value. Return true if - // the method was handled. - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) { - if (name == "SetTestParam") { - // Handle the SetTestParam native function by saving the string argument - // into the local member. - if (arguments.size() != 1 || !arguments[0]->IsString()) - return false; - - test_param_ = arguments[0]->GetStringValue(); - return true; - } else if (name == "GetTestParam") { - // Handle the GetTestParam native function by returning the local member - // value. - retval = CefV8Value::CreateString(test_param_); - return true; - } else if (name == "GetTestObject") { - // Handle the GetTestObject native function by creating and returning a - // new V8 object. - retval = CefV8Value::CreateObject(NULL); - // Add a string parameter to the new V8 object. - retval->SetValue("param", CefV8Value::CreateString( - "Retrieving a parameter on a native object succeeded."), - V8_PROPERTY_ATTRIBUTE_NONE); - // Add a function to the new V8 object. - retval->SetValue("GetMessage", - CefV8Value::CreateFunction("GetMessage", this), - V8_PROPERTY_ATTRIBUTE_NONE); - return true; - } else if (name == "GetMessage") { - // Handle the GetMessage object function by returning a string. - retval = CefV8Value::CreateString( - "Calling a function on a native object succeeded."); - return true; - } - return false; - } - - private: - CefString test_param_; - - IMPLEMENT_REFCOUNTING(ClientV8ExtensionHandler); -}; - -} // namespace - -void InitTest() { - // Register a V8 extension with the below JavaScript code that calls native - // methods implemented in ClientV8ExtensionHandler. - std::string code = "var cef;" - "if (!cef)" - " cef = {};" - "if (!cef.test)" - " cef.test = {};" - "(function() {" - " cef.test.__defineGetter__('test_param', function() {" - " native function GetTestParam();" - " return GetTestParam();" - " });" - " cef.test.__defineSetter__('test_param', function(b) {" - " native function SetTestParam();" - " if (b) SetTestParam(b);" - " });" - " cef.test.test_object = function() {" - " native function GetTestObject();" - " return GetTestObject();" - " };" - "})();"; - CefRegisterExtension("v8/test", code, new ClientV8ExtensionHandler()); -} - -} // namespace extension_test diff --git a/cef1/tests/cefclient/extension_test.h b/cef1/tests/cefclient/extension_test.h deleted file mode 100644 index 9ddd734e2..000000000 --- a/cef1/tests/cefclient/extension_test.h +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_EXTENSION_TEST_H_ -#define CEF_TESTS_CEFCLIENT_EXTENSION_TEST_H_ -#pragma once - -namespace extension_test { - -// Register the V8 extension handler. -void InitTest(); - -} // namespace extension_test - -#endif // CEF_TESTS_CEFCLIENT_EXTENSION_TEST_H_ diff --git a/cef1/tests/cefclient/mac/English.lproj/InfoPlist.strings b/cef1/tests/cefclient/mac/English.lproj/InfoPlist.strings deleted file mode 100644 index fe2abe11b..000000000 --- a/cef1/tests/cefclient/mac/English.lproj/InfoPlist.strings +++ /dev/null @@ -1,3 +0,0 @@ -/* Localized versions of Info.plist keys */ - -NSHumanReadableCopyright = "© Chromium Embedded Framework Authors, 2010"; diff --git a/cef1/tests/cefclient/mac/English.lproj/MainMenu.xib b/cef1/tests/cefclient/mac/English.lproj/MainMenu.xib deleted file mode 100644 index e4f7c1fc3..000000000 --- a/cef1/tests/cefclient/mac/English.lproj/MainMenu.xib +++ /dev/null @@ -1,2880 +0,0 @@ - - - - 1050 - 10F569 - 820 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 820 - - - YES - - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - AMainMenu - - YES - - - cefclient - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - TestShell - - YES - - - About cefclient - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - YES - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide cefclient - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit cefclient - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - File - - YES - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - Open Recent - - YES - - - Clear Menu - - 1048576 - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - Edit - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Find - - 1048576 - 2147483647 - - - submenuAction: - - Find - - YES - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 1048576 - 2147483647 - - - submenuAction: - - Spelling and Grammar - - YES - - - Show Spelling… - : - 1048576 - 2147483647 - - - - - - Check Spelling - ; - 1048576 - 2147483647 - - - - - - Check Spelling While Typing - - 1048576 - 2147483647 - - - - - - Check Grammar With Spelling - - 1048576 - 2147483647 - - - - - - - - - Substitutions - - 1048576 - 2147483647 - - - submenuAction: - - Substitutions - - YES - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - Speech - - YES - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - - - - - - - - Format - - 1048576 - 2147483647 - - - submenuAction: - - Format - - YES - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Show Colors - C - 1179648 - 2147483647 - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - View - - YES - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - Window - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 1048576 - 2147483647 - - - submenuAction: - - Help - - YES - - - cefclient Help - ? - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - YES - - - - - YES - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - showHelp: - - - - 360 - - - - orderFrontColorPanel: - - - - 361 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - terminate: - - - - 369 - - - - unhideAllApplications: - - - - 370 - - - - newDocument: - - - - 373 - - - - openDocument: - - - - 374 - - - - - YES - - 0 - - YES - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - YES - - - - - - - - - - MainMenu - - - 19 - - - YES - - - - - - 56 - - - YES - - - - - - 103 - - - YES - - - - 1 - - - 217 - - - YES - - - - - - 83 - - - YES - - - - - - 81 - - - YES - - - - - - - - - - - - - - - - 75 - - - 3 - - - 80 - - - 8 - - - 78 - - - 6 - - - 72 - - - - - 82 - - - 9 - - - 124 - - - YES - - - - - - 77 - - - 5 - - - 73 - - - 1 - - - 79 - - - 7 - - - 112 - - - 10 - - - 74 - - - 2 - - - 125 - - - YES - - - - - - 126 - - - - - 205 - - - YES - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - YES - - - - - - 216 - - - YES - - - - - - 200 - - - YES - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - YES - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 106 - - - YES - - - - 2 - - - 111 - - - - - 57 - - - YES - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - 1111 - - - 144 - - - - - 129 - - - 121 - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - YES - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - YES - - - - - - 296 - - - YES - - - - - - - 297 - - - - - 298 - - - - - 299 - - - YES - - - - - - 300 - - - YES - - - - - - - 344 - - - - - 345 - - - - - 211 - - - YES - - - - - - 212 - - - YES - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - YES - - - - - - 349 - - - YES - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 389 - - - - - - - YES - - YES - -3.IBPluginDependency - 103.IBPluginDependency - 103.ImportedFromIB2 - 106.IBEditorWindowLastContentRect - 106.IBPluginDependency - 106.ImportedFromIB2 - 106.editorWindowContentRectSynchronizationRect - 111.IBPluginDependency - 111.ImportedFromIB2 - 112.IBPluginDependency - 112.ImportedFromIB2 - 124.IBPluginDependency - 124.ImportedFromIB2 - 125.IBPluginDependency - 125.ImportedFromIB2 - 125.editorWindowContentRectSynchronizationRect - 126.IBPluginDependency - 126.ImportedFromIB2 - 129.IBPluginDependency - 129.ImportedFromIB2 - 130.IBPluginDependency - 130.ImportedFromIB2 - 130.editorWindowContentRectSynchronizationRect - 131.IBPluginDependency - 131.ImportedFromIB2 - 134.IBPluginDependency - 134.ImportedFromIB2 - 136.IBPluginDependency - 136.ImportedFromIB2 - 143.IBPluginDependency - 143.ImportedFromIB2 - 144.IBPluginDependency - 144.ImportedFromIB2 - 145.IBPluginDependency - 145.ImportedFromIB2 - 149.IBPluginDependency - 149.ImportedFromIB2 - 150.IBPluginDependency - 150.ImportedFromIB2 - 19.IBPluginDependency - 19.ImportedFromIB2 - 195.IBPluginDependency - 195.ImportedFromIB2 - 196.IBPluginDependency - 196.ImportedFromIB2 - 197.IBPluginDependency - 197.ImportedFromIB2 - 198.IBPluginDependency - 198.ImportedFromIB2 - 199.IBPluginDependency - 199.ImportedFromIB2 - 200.IBEditorWindowLastContentRect - 200.IBPluginDependency - 200.ImportedFromIB2 - 200.editorWindowContentRectSynchronizationRect - 201.IBPluginDependency - 201.ImportedFromIB2 - 202.IBPluginDependency - 202.ImportedFromIB2 - 203.IBPluginDependency - 203.ImportedFromIB2 - 204.IBPluginDependency - 204.ImportedFromIB2 - 205.IBEditorWindowLastContentRect - 205.IBPluginDependency - 205.ImportedFromIB2 - 205.editorWindowContentRectSynchronizationRect - 206.IBPluginDependency - 206.ImportedFromIB2 - 207.IBPluginDependency - 207.ImportedFromIB2 - 208.IBPluginDependency - 208.ImportedFromIB2 - 209.IBPluginDependency - 209.ImportedFromIB2 - 210.IBPluginDependency - 210.ImportedFromIB2 - 211.IBPluginDependency - 211.ImportedFromIB2 - 212.IBEditorWindowLastContentRect - 212.IBPluginDependency - 212.ImportedFromIB2 - 212.editorWindowContentRectSynchronizationRect - 213.IBPluginDependency - 213.ImportedFromIB2 - 214.IBPluginDependency - 214.ImportedFromIB2 - 215.IBPluginDependency - 215.ImportedFromIB2 - 216.IBPluginDependency - 216.ImportedFromIB2 - 217.IBPluginDependency - 217.ImportedFromIB2 - 218.IBPluginDependency - 218.ImportedFromIB2 - 219.IBPluginDependency - 219.ImportedFromIB2 - 220.IBEditorWindowLastContentRect - 220.IBPluginDependency - 220.ImportedFromIB2 - 220.editorWindowContentRectSynchronizationRect - 221.IBPluginDependency - 221.ImportedFromIB2 - 23.IBPluginDependency - 23.ImportedFromIB2 - 236.IBPluginDependency - 236.ImportedFromIB2 - 239.IBPluginDependency - 239.ImportedFromIB2 - 24.IBEditorWindowLastContentRect - 24.IBPluginDependency - 24.ImportedFromIB2 - 24.editorWindowContentRectSynchronizationRect - 29.IBEditorWindowLastContentRect - 29.IBPluginDependency - 29.ImportedFromIB2 - 29.WindowOrigin - 29.editorWindowContentRectSynchronizationRect - 295.IBPluginDependency - 296.IBEditorWindowLastContentRect - 296.IBPluginDependency - 296.editorWindowContentRectSynchronizationRect - 297.IBPluginDependency - 298.IBPluginDependency - 299.IBPluginDependency - 300.IBEditorWindowLastContentRect - 300.IBPluginDependency - 300.editorWindowContentRectSynchronizationRect - 344.IBPluginDependency - 345.IBPluginDependency - 346.IBPluginDependency - 346.ImportedFromIB2 - 348.IBPluginDependency - 348.ImportedFromIB2 - 349.IBEditorWindowLastContentRect - 349.IBPluginDependency - 349.ImportedFromIB2 - 349.editorWindowContentRectSynchronizationRect - 350.IBPluginDependency - 350.ImportedFromIB2 - 351.IBPluginDependency - 351.ImportedFromIB2 - 354.IBPluginDependency - 354.ImportedFromIB2 - 389.IBPluginDependency - 5.IBPluginDependency - 5.ImportedFromIB2 - 56.IBPluginDependency - 56.ImportedFromIB2 - 57.IBEditorWindowLastContentRect - 57.IBPluginDependency - 57.ImportedFromIB2 - 57.editorWindowContentRectSynchronizationRect - 58.IBPluginDependency - 58.ImportedFromIB2 - 72.IBPluginDependency - 72.ImportedFromIB2 - 73.IBPluginDependency - 73.ImportedFromIB2 - 74.IBPluginDependency - 74.ImportedFromIB2 - 75.IBPluginDependency - 75.ImportedFromIB2 - 77.IBPluginDependency - 77.ImportedFromIB2 - 78.IBPluginDependency - 78.ImportedFromIB2 - 79.IBPluginDependency - 79.ImportedFromIB2 - 80.IBPluginDependency - 80.ImportedFromIB2 - 81.IBEditorWindowLastContentRect - 81.IBPluginDependency - 81.ImportedFromIB2 - 81.editorWindowContentRectSynchronizationRect - 82.IBPluginDependency - 82.ImportedFromIB2 - 83.IBPluginDependency - 83.ImportedFromIB2 - 92.IBPluginDependency - 92.ImportedFromIB2 - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - {{906, 713}, {164, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{375, 955}, {171, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{522, 812}, {146, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{436, 809}, {64, 6}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{915, 473}, {272, 83}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {275, 83}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{675, 493}, {240, 243}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{144, 735}, {243, 243}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{915, 473}, {164, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {167, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{915, 473}, {238, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {241, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{835, 663}, {194, 73}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{304, 905}, {197, 73}} - {{541, 736}, {426, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - - {74, 862} - {{6, 836}, {430, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - {{785, 693}, {231, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - {{254, 935}, {234, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{719, 693}, {173, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - {{188, 935}, {176, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{915, 473}, {212, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {215, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{553, 553}, {193, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{18, 653}, {200, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{633, 533}, {196, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{102, 775}, {199, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - YES - - - YES - - - - - YES - - - YES - - - - 439 - - - - YES - - NSApplication - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSApplication.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSApplicationScripting.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSColorPanel.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSHelpManager.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSPageLayout.h - - - - NSBrowser - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSBrowser.h - - - - NSControl - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSControl.h - - - - NSController - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSController.h - - - - NSDocument - NSObject - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - id - id - id - id - id - id - - - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - - printDocument: - id - - - revertDocumentToSaved: - id - - - runPageLayout: - id - - - saveDocument: - id - - - saveDocumentAs: - id - - - saveDocumentTo: - id - - - - - IBFrameworkSource - AppKit.framework/Headers/NSDocument.h - - - - NSDocument - - IBFrameworkSource - AppKit.framework/Headers/NSDocumentScripting.h - - - - NSDocumentController - NSObject - - YES - - YES - clearRecentDocuments: - newDocument: - openDocument: - saveAllDocuments: - - - YES - id - id - id - id - - - - YES - - YES - clearRecentDocuments: - newDocument: - openDocument: - saveAllDocuments: - - - YES - - clearRecentDocuments: - id - - - newDocument: - id - - - openDocument: - id - - - saveAllDocuments: - id - - - - - IBFrameworkSource - AppKit.framework/Headers/NSDocumentController.h - - - - NSFormatter - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFormatter.h - - - - NSMatrix - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSMatrix.h - - - - NSMenu - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenu.h - - - - NSMenuItem - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenuItem.h - - - - NSMovieView - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSMovieView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAccessibility.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAlert.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAnimation.h - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSComboBox.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSComboBoxCell.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDatePickerCell.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDictionaryController.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDragging.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDrawer.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontManager.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontPanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSImage.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSKeyValueBinding.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSNibLoading.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSOutlineView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSPasteboard.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSRuleEditor.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSavePanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSound.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSpeechRecognizer.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSpeechSynthesizer.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSplitView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTabView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTableView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSText.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTextStorage.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTextView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTokenField.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTokenFieldCell.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSToolbar.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSToolbarItem.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSWindow.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSMetadata.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSNetServices.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObjectScripting.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPort.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPortCoder.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptObjectSpecifiers.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptWhoseTests.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSSpellServer.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSStream.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLDownload.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSXMLParser.h - - - - NSObject - - IBFrameworkSource - Print.framework/Headers/PDEPluginInterface.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CIImageProvider.h - - - - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSInterfaceStyle.h - - - - NSResponder - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSResponder.h - - - - NSTableView - NSControl - - - - NSText - NSView - - - - NSUserDefaultsController - NSController - - IBFrameworkSource - AppKit.framework/Headers/NSUserDefaultsController.h - - - - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSClipView.h - - - - NSView - - - - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSRulerView.h - - - - NSView - NSResponder - - - - NSWindow - - - - NSWindow - NSResponder - - - - NSWindow - - IBFrameworkSource - AppKit.framework/Headers/NSWindowScripting.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - ../../../../cef.xcodeproj - 3 - - YES - - YES - NSMenuCheckmark - NSMenuMixedState - - - YES - {9, 8} - {7, 2} - - - - diff --git a/cef1/tests/cefclient/mac/Info.plist b/cef1/tests/cefclient/mac/Info.plist deleted file mode 100644 index 83c535e41..000000000 --- a/cef1/tests/cefclient/mac/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - cefclient.icns - CFBundleIdentifier - org.cef.cefclient - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/cef1/tests/cefclient/mac/cefclient.icns b/cef1/tests/cefclient/mac/cefclient.icns deleted file mode 100644 index f36742de2572421b1eaa5569f64ab34e450ddb67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55080 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%0Ac$%Pvh#VA!uK`rp4)7 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 OV{TRe000a^@Bjd~o7PtV diff --git a/cef1/tests/cefclient/osrenderer.cpp b/cef1/tests/cefclient/osrenderer.cpp deleted file mode 100644 index 3a414feb6..000000000 --- a/cef1/tests/cefclient/osrenderer.cpp +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 "cefclient/osrenderer.h" -#include "cefclient/util.h" - -#if defined(OS_WIN) -#include -#include -#elif defined(OS_MACOSX) -#include -#else -#error Platform is not supported. -#endif - -#ifndef GL_BGR -#define GL_BGR 0x80E0 -#endif -#ifndef GL_BGRA -#define GL_BGRA 0x80E1 -#endif -#ifndef GL_UNSIGNED_INT_8_8_8_8_REV -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#endif - - -ClientOSRenderer::ClientOSRenderer(bool transparent) - : transparent_(transparent), - initialized_(false), - texture_id_(0), - view_width_(0), - view_height_(0), - spin_x_(0), - spin_y_(0) { -} - -ClientOSRenderer::~ClientOSRenderer() { - Cleanup(); -} - -void ClientOSRenderer::Initialize() { - if (initialized_) - return; - - glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - - // Necessary for non-power-of-2 textures to render correctly. - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - - // Create the texture. - glGenTextures(1, &texture_id_); - ASSERT(texture_id_ != 0); - - glBindTexture(GL_TEXTURE_2D, texture_id_); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - initialized_ = true; -} - -void ClientOSRenderer::Cleanup() { - if (texture_id_ != 0) - glDeleteTextures(1, &texture_id_); -} - -void ClientOSRenderer::Render() { - if (view_width_ == 0 || view_height_ == 0) - return; - - ASSERT(initialized_); - - struct { - float tu, tv; - float x, y, z; - } static vertices[] = { - {0.0f, 1.0f, -1.0f, -1.0f, 0.0f}, - {1.0f, 1.0f, 1.0f, -1.0f, 0.0f}, - {1.0f, 0.0f, 1.0f, 1.0f, 0.0f}, - {0.0f, 0.0f, -1.0f, 1.0f, 0.0f} - }; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - // Match GL units to screen coordinates. - glViewport(0, 0, view_width_, view_height_); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0, 0, view_width_, view_height_, 0.1, 100.0); - - // Draw the background gradient. - glPushAttrib(GL_ALL_ATTRIB_BITS); - glBegin(GL_QUADS); - glColor4f(1.0, 0.0, 0.0, 1.0); // red - glVertex2f(-1.0, -1.0); - glVertex2f(1.0, -1.0); - glColor4f(0.0, 0.0, 1.0, 1.0); // blue - glVertex2f(1.0, 1.0); - glVertex2f(-1.0, 1.0); - glEnd(); - glPopAttrib(); - - // Rotate the view based on the mouse spin. - if (spin_x_ != 0) - glRotatef(-spin_x_, 1.0f, 0.0f, 0.0f); - if (spin_y_ != 0) - glRotatef(-spin_y_, 0.0f, 1.0f, 0.0f); - - if (transparent_) { - // Alpha blending style. Texture values have premultiplied alpha. - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - - // Enable alpha blending. - glEnable(GL_BLEND); - } - - // Enable 2D textures. - glEnable(GL_TEXTURE_2D); - - // Draw the facets with the texture. - ASSERT(texture_id_ != 0); - glBindTexture(GL_TEXTURE_2D, texture_id_); - glInterleavedArrays(GL_T2F_V3F, 0, vertices); - glDrawArrays(GL_QUADS, 0, 4); - - // Disable 2D textures. - glDisable(GL_TEXTURE_2D); - - if (transparent_) { - // Disable alpha blending. - glDisable(GL_BLEND); - } -} - -void ClientOSRenderer::OnPopupShow(CefRefPtr browser, - bool show) { - if (!show) { - // Invalidate the previous popup rectangle so that it will be repainted. - browser->Invalidate(popup_rect_); - - // Clear the popup rectangle. - popup_rect_.Set(0, 0, 0, 0); - } -} - -void ClientOSRenderer::OnPopupSize(CefRefPtr browser, - const CefRect& rect) { - if (rect.width > 0 && rect.height > 0) - popup_rect_ = rect; -} - -void ClientOSRenderer::OnPaint(CefRefPtr browser, - CefRenderHandler::PaintElementType type, - const CefRenderHandler::RectList& dirtyRects, - const void* buffer) { - if (!initialized_) - Initialize(); - - if (transparent_) { - // Enable alpha blending. - glEnable(GL_BLEND); - } - - // Enable 2D textures. - glEnable(GL_TEXTURE_2D); - - ASSERT(texture_id_ != 0); - glBindTexture(GL_TEXTURE_2D, texture_id_); - - if (type == PET_VIEW) { - int old_width = view_width_; - int old_height = view_height_; - - // Retrieve the current size of the browser view. - browser->GetSize(type, view_width_, view_height_); - - glPixelStorei(GL_UNPACK_ROW_LENGTH, view_width_); - - if (old_width != view_width_ || old_height != view_height_) { - // Update/resize the whole texture. - glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); - glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, view_width_, view_height_, 0, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buffer); - } else { - // Update just the dirty rectangles. - CefRenderHandler::RectList::const_iterator i = dirtyRects.begin(); - for (; i != dirtyRects.end(); ++i) { - const CefRect& rect = *i; - glPixelStorei(GL_UNPACK_SKIP_PIXELS, rect.x); - glPixelStorei(GL_UNPACK_SKIP_ROWS, rect.y); - glTexSubImage2D(GL_TEXTURE_2D, 0, rect.x, rect.y, rect.width, - rect.height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, - buffer); - } - } - } else if (type == PET_POPUP && popup_rect_.width > 0 && - popup_rect_.height > 0) { - int skip_pixels = 0, x = popup_rect_.x; - int skip_rows = 0, y = popup_rect_.y; - int width = popup_rect_.width; - int height = popup_rect_.height; - - // Adjust the popup to fit inside the view. - if (x < 0) { - skip_pixels = -x; - x = 0; - } - if (y < 0) { - skip_rows = -y; - y = 0; - } - if (x + width > view_width_) - width -= x + width - view_width_; - if (y + height > view_height_) - height -= y + height - view_height_; - - // Update the popup rectangle. - glPixelStorei(GL_UNPACK_ROW_LENGTH, popup_rect_.width); - glPixelStorei(GL_UNPACK_SKIP_PIXELS, skip_pixels); - glPixelStorei(GL_UNPACK_SKIP_ROWS, skip_rows); - glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL_BGRA, - GL_UNSIGNED_INT_8_8_8_8_REV, buffer); - } - - // Disable 2D textures. - glDisable(GL_TEXTURE_2D); - - if (transparent_) { - // Disable alpha blending. - glDisable(GL_BLEND); - } -} - -void ClientOSRenderer::SetSpin(float spinX, float spinY) { - spin_x_ = spinX; - spin_y_ = spinY; -} - -void ClientOSRenderer::IncrementSpin(float spinDX, float spinDY) { - spin_x_ -= spinDX; - spin_y_ -= spinDY; -} diff --git a/cef1/tests/cefclient/osrenderer.h b/cef1/tests/cefclient/osrenderer.h deleted file mode 100644 index 838a9c79f..000000000 --- a/cef1/tests/cefclient/osrenderer.h +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license -// that can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_OSRENDERER_H_ -#define CEF_TESTS_CEFCLIENT_OSRENDERER_H_ - -#include "include/cef_browser.h" -#include "include/cef_render_handler.h" - -class ClientOSRenderer { - public: - // The context must outlive this object. - explicit ClientOSRenderer(bool transparent); - virtual ~ClientOSRenderer(); - - // Initialize the OpenGL environment. - void Initialize(); - - // Clean up the OpenGL environment. - void Cleanup(); - - // Render to the screen. - void Render(); - - // Forwarded from CefRenderHandler callbacks. - void OnPopupShow(CefRefPtr browser, - bool show); - void OnPopupSize(CefRefPtr browser, - const CefRect& rect); - void OnPaint(CefRefPtr browser, - CefRenderHandler::PaintElementType type, - const CefRenderHandler::RectList& dirtyRects, - const void* buffer); - - // Apply spin. - void SetSpin(float spinX, float spinY); - void IncrementSpin(float spinDX, float spinDY); - - bool IsTransparent() { return transparent_; } - - int GetViewWidth() { return view_width_; } - int GetViewHeight() { return view_height_; } - - private: - bool transparent_; - bool initialized_; - unsigned int texture_id_; - int view_width_; - int view_height_; - CefRect popup_rect_; - float spin_x_; - float spin_y_; -}; - -#endif // CEF_TESTS_CEFCLIENT_OSR_RENDERER_H_ - diff --git a/cef1/tests/cefclient/osrplugin.cpp b/cef1/tests/cefclient/osrplugin.cpp deleted file mode 100644 index d1c4568e2..000000000 --- a/cef1/tests/cefclient/osrplugin.cpp +++ /dev/null @@ -1,703 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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 "cefclient/osrplugin.h" -#include "cefclient/osrenderer.h" - -#if defined(OS_WIN) - -#include -#define _USE_MATH_DEFINES -#include -#include -#include -#include -#include -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "cefclient/cefclient.h" -#include "cefclient/client_handler.h" -#include "cefclient/client_popup_handler.h" -#include "cefclient/resource.h" -#include "cefclient/resource_util.h" -#include "cefclient/string_util.h" -#include "cefclient/util.h" - -// Initialized in NP_Initialize. -NPNetscapeFuncs* g_osrbrowser = NULL; - -namespace { - -CefRefPtr g_offscreenBrowser; - -// If set to true alpha transparency will be used. -bool g_offscreenTransparent = false; - -// Class holding pointers for the client plugin window. -class ClientPlugin { - public: - ClientPlugin(bool transparent) - : renderer(transparent), - hWnd(NULL), - hDC(NULL), - hRC(NULL) { - } - - ClientOSRenderer renderer; - HWND hWnd; - HDC hDC; - HGLRC hRC; -}; - -// Handler for off-screen rendering windows. -class ClientOSRHandler : public CefClient, - public CefLifeSpanHandler, - public CefLoadHandler, - public CefRequestHandler, - public CefDisplayHandler, - public CefRenderHandler { - public: - explicit ClientOSRHandler(ClientPlugin* plugin) - : plugin_(plugin), - want_pixel_value_(false) { - } - ~ClientOSRHandler() { - } - - // Called immediately before the plugin is destroyed. - void Detach() { - plugin_ = NULL; - } - - // Retrieve the pixel value at the requested coordinate the next time that - // the view is painted. - void WantPixelValue(int x, int y) { - if (!want_pixel_value_) { - want_pixel_value_ = true; - - // Trigger a call to OnPaint. - if (g_offscreenBrowser.get()) - g_offscreenBrowser->Invalidate(CefRect(0,0,1,1)); - } - - coord_x_ = x; - coord_y_ = y; - } - - // CefClient methods - virtual CefRefPtr GetLifeSpanHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetLoadHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetRequestHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetDisplayHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetRenderHandler() OVERRIDE { - return this; - } - - // CefLifeSpanHandler methods - - virtual bool OnBeforePopup(CefRefPtr parentBrowser, - const CefPopupFeatures& popupFeatures, - CefWindowInfo& windowInfo, - const CefString& url, - CefRefPtr& client, - CefBrowserSettings& settings) OVERRIDE { - REQUIRE_UI_THREAD(); - - windowInfo.m_bWindowRenderingDisabled = TRUE; - client = new ClientPopupHandler(g_offscreenBrowser); - return false; - } - - virtual void OnAfterCreated(CefRefPtr browser) OVERRIDE { - REQUIRE_UI_THREAD(); - - g_offscreenBrowser = browser; - - // Set the off-screen browser size to match the plugin window size. - RECT clientRect; - ::GetClientRect(plugin_->hWnd, &clientRect); - g_offscreenBrowser->SetSize(PET_VIEW, clientRect.right, clientRect.bottom); - } - - virtual void OnBeforeClose(CefRefPtr browser) OVERRIDE { - g_offscreenBrowser = NULL; - } - - // CefLoadHandler methods - - virtual void OnLoadStart(CefRefPtr browser, - CefRefPtr frame) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!browser->IsPopup() && frame->IsMain()) { - // We've just started loading a page - SetLoading(true); - } - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!browser->IsPopup() && frame->IsMain()) { - // We've just finished loading a page - SetLoading(false); - } - } - - // CefRequestHandler methods - - virtual bool OnBeforeResourceLoad(CefRefPtr browser, - CefRefPtr request, - CefString& redirectUrl, - CefRefPtr& resourceStream, - CefRefPtr response, - int loadFlags) OVERRIDE { - REQUIRE_IO_THREAD(); - - // Proxy the request to the main ClientHandler. - CefRefPtr main_browser = AppGetBrowser(); - CefRefPtr handler = - static_cast(main_browser->GetClient().get()); - return handler->OnBeforeResourceLoad(browser, request, redirectUrl, - resourceStream, response, loadFlags); - } - - // CefDisplayHandler methods - - virtual void OnNavStateChange(CefRefPtr browser, - bool canGoBack, - bool canGoForward) OVERRIDE { - REQUIRE_UI_THREAD(); - - // Set the "back" and "forward" button state in the HTML. - std::stringstream ss; - ss << "document.getElementById('back').disabled = " - << (canGoBack?"false":"true") << ";"; - ss << "document.getElementById('forward').disabled = " - << (canGoForward?"false":"true") << ";"; - AppGetBrowser()->GetMainFrame()->ExecuteJavaScript(ss.str(), "", 0); - } - - virtual void OnAddressChange(CefRefPtr browser, - CefRefPtr frame, - const CefString& url) OVERRIDE { - REQUIRE_UI_THREAD(); - - // Set the "url" value in the HTML. - std::stringstream ss; - std::string urlStr = url; - StringReplace(urlStr, "'", "\\'"); - ss << "document.getElementById('url').value = '" << urlStr.c_str() << "'"; - AppGetBrowser()->GetMainFrame()->ExecuteJavaScript(ss.str(), "", 0); - } - - virtual void OnTitleChange(CefRefPtr browser, - const CefString& title) OVERRIDE { - REQUIRE_UI_THREAD(); - - // Set the "title" value in the HTML. - std::stringstream ss; - std::string titleStr = title; - StringReplace(titleStr, "'", "\\'"); - ss << "document.getElementById('title').innerHTML = '" << - titleStr.c_str() << "'"; - AppGetBrowser()->GetMainFrame()->ExecuteJavaScript(ss.str(), "", 0); - } - - // CefRenderHandler methods - - virtual bool GetViewRect(CefRefPtr browser, - CefRect& rect) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!plugin_) - return false; - - // The simulated screen and view rectangle are the same. This is necessary - // for popup menus to be located and sized inside the view. - RECT clientRect; - ::GetClientRect(plugin_->hWnd, &clientRect); - - rect.x = rect.y = 0; - rect.width = clientRect.right; - rect.height = clientRect.bottom; - return true; - } - - virtual bool GetScreenRect(CefRefPtr browser, - CefRect& rect) OVERRIDE { - return GetViewRect(browser, rect); - } - - virtual bool GetScreenPoint(CefRefPtr browser, - int viewX, - int viewY, - int& screenX, - int& screenY) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!plugin_) - return false; - - // Convert the point from view coordinates to actual screen coordinates. - POINT screen_pt = {viewX, viewY}; - MapWindowPoints(plugin_->hWnd, HWND_DESKTOP, &screen_pt, 1); - screenX = screen_pt.x; - screenY = screen_pt.y; - return true; - } - - virtual void OnPopupShow(CefRefPtr browser, - bool show) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!plugin_) - return; - - plugin_->renderer.OnPopupShow(browser, show); - } - - virtual void OnPopupSize(CefRefPtr browser, - const CefRect& rect) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!plugin_) - return; - - plugin_->renderer.OnPopupSize(browser, rect); - } - - virtual void OnPaint(CefRefPtr browser, - PaintElementType type, - const RectList& dirtyRects, - const void* buffer) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!plugin_) - return; - - wglMakeCurrent(plugin_->hDC, plugin_->hRC); - plugin_->renderer.OnPaint(browser, type, dirtyRects, buffer); - plugin_->renderer.Render(); - - SwapBuffers(plugin_->hDC); - - if (type == PET_VIEW && want_pixel_value_) { - // Retrieve the pixel value at the requested coordinate. - int width = plugin_->renderer.GetViewWidth(); - int height = plugin_->renderer.GetViewHeight(); - - if(coord_x_ >= 0 && coord_x_ < width && - coord_y_ >= 0 && coord_y_ < height) { - bool transparent = plugin_->renderer.IsTransparent(); - - int index = (width * coord_y_ * 4) + (coord_x_ * 4); - const unsigned char *pBuf = static_cast(buffer); - unsigned char r, g, b, a; - - b = pBuf[index]; - g = pBuf[index+1]; - r = pBuf[index+2]; - if (transparent) - a = pBuf[index+3]; - - std::stringstream ss; - ss << coord_x_ << "," << coord_y_ << " = R:" << static_cast(r) - << " G:" << static_cast(g) << " B:" << static_cast(b); - if (transparent) - ss << " A:" << static_cast(a); - - std::string js = - "document.getElementById('pixel').innerText = '" + ss.str() + "';"; - AppGetBrowser()->GetMainFrame()->ExecuteJavaScript(js, "", 0); - } - - want_pixel_value_ = false; - } - } - - virtual void OnCursorChange(CefRefPtr browser, - CefCursorHandle cursor) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!plugin_) - return; - - // Change the plugin window's cursor. - SetClassLong(plugin_->hWnd, GCL_HCURSOR, - static_cast(reinterpret_cast(cursor))); - SetCursor(cursor); - } - - private: - void SetLoading(bool isLoading) { - // Set the "stop" and "reload" button state in the HTML. - std::stringstream ss; - ss << "document.getElementById('stop').disabled = " - << (isLoading?"false":"true") << ";" - << "document.getElementById('reload').disabled = " - << (isLoading?"true":"false") << ";"; - AppGetBrowser()->GetMainFrame()->ExecuteJavaScript(ss.str(), "", 0); - } - - ClientPlugin* plugin_; - - // Used for retrieving the pixel value. - bool want_pixel_value_; - int coord_x_; - int coord_y_; - - // Include the default reference counting implementation. - IMPLEMENT_REFCOUNTING(ClientOSRPlugin); -}; - -// Forward declarations of functions included in this code module: -LRESULT CALLBACK PluginWndProc(HWND hWnd, UINT message, WPARAM wParam, - LPARAM lParam); - -// Enable GL. -void EnableGL(ClientPlugin* plugin) { - PIXELFORMATDESCRIPTOR pfd; - int format; - - // Get the device context. - plugin->hDC = GetDC(plugin->hWnd); - - // Set the pixel format for the DC. - ZeroMemory(&pfd, sizeof(pfd)); - pfd.nSize = sizeof(pfd); - pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; - pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = 24; - pfd.cDepthBits = 16; - pfd.iLayerType = PFD_MAIN_PLANE; - format = ChoosePixelFormat(plugin->hDC, &pfd); - SetPixelFormat(plugin->hDC, format, &pfd); - - // Create and enable the render context. - plugin->hRC = wglCreateContext(plugin->hDC); - wglMakeCurrent(plugin->hDC, plugin->hRC); - - plugin->renderer.Initialize(); -} - -// Disable GL. -void DisableGL(ClientPlugin* plugin) { - plugin->renderer.Cleanup(); - - wglMakeCurrent(NULL, NULL); - wglDeleteContext(plugin->hRC); - ReleaseDC(plugin->hWnd, plugin->hDC); -} - -// Size the GL view. -void SizeGL(ClientPlugin* plugin, int width, int height) { - if (g_offscreenBrowser.get()) - g_offscreenBrowser->SetSize(PET_VIEW, width, height); -} - -NPError NPP_NewImpl(NPMIMEType plugin_type, NPP instance, uint16 mode, - int16 argc, char* argn[], char* argv[], - NPSavedData* saved) { - if (instance == NULL) - return NPERR_INVALID_INSTANCE_ERROR; - - ClientPlugin* plugin = new ClientPlugin(g_offscreenTransparent); - instance->pdata = reinterpret_cast(plugin); - - return NPERR_NO_ERROR; -} - -NPError NPP_DestroyImpl(NPP instance, NPSavedData** save) { - ClientPlugin* plugin = reinterpret_cast(instance->pdata); - - if (plugin) { - if (g_offscreenBrowser.get()) { - CefRefPtr handler = - static_cast(g_offscreenBrowser->GetClient().get()); - handler->Detach(); - } - if (plugin->hWnd) { - DestroyWindow(plugin->hWnd); - DisableGL(plugin); - } - delete plugin; - } - - return NPERR_NO_ERROR; -} - -NPError NPP_SetWindowImpl(NPP instance, NPWindow* window_info) { - if (instance == NULL) - return NPERR_INVALID_INSTANCE_ERROR; - - if (window_info == NULL) - return NPERR_GENERIC_ERROR; - - ClientPlugin* plugin = reinterpret_cast(instance->pdata); - HWND parent_hwnd = reinterpret_cast(window_info->window); - - if (plugin->hWnd == NULL) { - WNDCLASS wc; - HINSTANCE hInstance = GetModuleHandle(NULL); - - // Register the window class. - wc.style = CS_OWNDC; - wc.lpfnWndProc = PluginWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); - wc.lpszMenuName = NULL; - wc.lpszClassName = L"ClientOSRPlugin"; - RegisterClass(&wc); - - // Create the main window. - plugin->hWnd = CreateWindow(L"ClientOSRPlugin", L"Client OSR Plugin", - WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, 0, 0, 0, 0, parent_hwnd, NULL, - hInstance, NULL); - - SetWindowLongPtr(plugin->hWnd, GWLP_USERDATA, - reinterpret_cast(plugin)); - - // Enable GL drawing for the window. - EnableGL(plugin); - - // Create the off-screen rendering window. - CefWindowInfo windowInfo; - windowInfo.SetAsOffScreen(plugin->hWnd); - if (g_offscreenTransparent) - windowInfo.SetTransparentPainting(TRUE); - - CefBrowserSettings settings; - AppGetBrowserSettings(settings); - - CefBrowser::CreateBrowser(windowInfo, new ClientOSRHandler(plugin), - "http://www.google.com", settings); - } - - // Position the plugin window and make sure it's visible. - RECT parent_rect; - GetClientRect(parent_hwnd, &parent_rect); - SetWindowPos(plugin->hWnd, NULL, parent_rect.left, parent_rect.top, - parent_rect.right - parent_rect.left, - parent_rect.bottom - parent_rect.top, SWP_SHOWWINDOW); - - UpdateWindow(plugin->hWnd); - ShowWindow(plugin->hWnd, SW_SHOW); - - return NPERR_NO_ERROR; -} - -// Plugin window procedure. -LRESULT CALLBACK PluginWndProc(HWND hWnd, UINT message, WPARAM wParam, - LPARAM lParam) { - static POINT lastMousePos, curMousePos; - static bool mouseRotation = false; - static bool mouseTracking = false; - - ClientPlugin* plugin = - reinterpret_cast(GetWindowLongPtr(hWnd, GWLP_USERDATA)); - - switch (message) { - case WM_DESTROY: - // Explicitly close the offscreen browser and release the reference. - g_offscreenBrowser->CloseBrowser(); - g_offscreenBrowser = NULL; - return 0; - - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - SetCapture(hWnd); - SetFocus(hWnd); - if (wParam & MK_SHIFT) { - // Start rotation effect. - lastMousePos.x = curMousePos.x = LOWORD(lParam); - lastMousePos.y = curMousePos.y = HIWORD(lParam); - mouseRotation = true; - } else if (wParam & MK_CONTROL) { - // Retrieve the pixel value. - int x = LOWORD(lParam); - int y = HIWORD(lParam); - CefRefPtr handler = - static_cast(g_offscreenBrowser->GetClient().get()); - handler->WantPixelValue(x, y); - } else { - if (g_offscreenBrowser.get()) { - g_offscreenBrowser->SendMouseClickEvent(LOWORD(lParam), HIWORD(lParam), - (message == WM_LBUTTONDOWN?MBT_LEFT:MBT_RIGHT), false, 1); - } - } - break; - - case WM_LBUTTONUP: - case WM_RBUTTONUP: - if (GetCapture() == hWnd) - ReleaseCapture(); - if (mouseRotation) { - // End rotation effect. - mouseRotation = false; - plugin->renderer.SetSpin(0, 0); - } else { - if (g_offscreenBrowser.get()) { - g_offscreenBrowser->SendMouseClickEvent(LOWORD(lParam), HIWORD(lParam), - (message == WM_LBUTTONUP?MBT_LEFT:MBT_RIGHT), true, 1); - } - } - break; - - case WM_MOUSEMOVE: - if (mouseRotation) { - // Apply rotation effect. - curMousePos.x = LOWORD(lParam); - curMousePos.y = HIWORD(lParam); - plugin->renderer.IncrementSpin((curMousePos.x - lastMousePos.x), - (curMousePos.y - lastMousePos.y)); - lastMousePos.x = curMousePos.x; - lastMousePos.y = curMousePos.y; - } else { - if (!mouseTracking) { - // Start tracking mouse leave. Required for the WM_MOUSELEAVE event to - // be generated. - TRACKMOUSEEVENT tme; - tme.cbSize = sizeof(TRACKMOUSEEVENT); - tme.dwFlags = TME_LEAVE; - tme.hwndTrack = hWnd; - TrackMouseEvent(&tme); - mouseTracking = true; - } - if (g_offscreenBrowser.get()) { - g_offscreenBrowser->SendMouseMoveEvent(LOWORD(lParam), HIWORD(lParam), - false); - } - } - break; - - case WM_MOUSELEAVE: - if (mouseTracking) { - // Stop tracking mouse leave. - TRACKMOUSEEVENT tme; - tme.cbSize = sizeof(TRACKMOUSEEVENT); - tme.dwFlags = TME_LEAVE & TME_CANCEL; - tme.hwndTrack = hWnd; - TrackMouseEvent(&tme); - mouseTracking = false; - } - if (g_offscreenBrowser.get()) - g_offscreenBrowser->SendMouseMoveEvent(0, 0, true); - break; - - case WM_MOUSEWHEEL: - if (g_offscreenBrowser.get()) { - g_offscreenBrowser->SendMouseWheelEvent(LOWORD(lParam), HIWORD(lParam), - 0, GET_WHEEL_DELTA_WPARAM(wParam)); - } - break; - - case WM_SIZE: { - int width = LOWORD(lParam); - int height = HIWORD(lParam); - if (width > 0 && height > 0) - SizeGL(plugin, width, height); - break; - } - - case WM_SETFOCUS: - case WM_KILLFOCUS: - if (g_offscreenBrowser.get()) - g_offscreenBrowser->SendFocusEvent(message == WM_SETFOCUS); - break; - - case WM_CAPTURECHANGED: - case WM_CANCELMODE: - if (!mouseRotation) { - if (g_offscreenBrowser.get()) - g_offscreenBrowser->SendCaptureLostEvent(); - } - break; - - case WM_KEYDOWN: - case WM_KEYUP: - case WM_SYSKEYDOWN: - case WM_SYSKEYUP: - case WM_CHAR: - case WM_SYSCHAR: - case WM_IME_CHAR: - if (g_offscreenBrowser.get()) { - CefBrowser::KeyType type = KT_CHAR; - CefKeyInfo keyInfo; - keyInfo.key = wParam; - - if (message == WM_KEYDOWN || message == WM_SYSKEYDOWN) - type = KT_KEYDOWN; - else if (message == WM_KEYUP || message == WM_SYSKEYUP) - type = KT_KEYUP; - - if (message == WM_SYSKEYDOWN || message == WM_SYSKEYUP || - message == WM_SYSCHAR) - keyInfo.sysChar = true; - - if (message == WM_IME_CHAR) - keyInfo.imeChar = true; - - g_offscreenBrowser->SendKeyEvent(type, keyInfo, lParam); - } - break; - - case WM_PAINT: { - PAINTSTRUCT ps; - BeginPaint(hWnd, &ps); - EndPaint(hWnd, &ps); - return 0; - } - - case WM_ERASEBKGND: - return 0; - } - - return DefWindowProc(hWnd, message, wParam, lParam); -} - -} // namespace - -NPError API_CALL NP_OSRGetEntryPoints(NPPluginFuncs* pFuncs) { - pFuncs->newp = NPP_NewImpl; - pFuncs->destroy = NPP_DestroyImpl; - pFuncs->setwindow = NPP_SetWindowImpl; - return NPERR_NO_ERROR; -} - -NPError API_CALL NP_OSRInitialize(NPNetscapeFuncs* pFuncs) { - g_osrbrowser = pFuncs; - return NPERR_NO_ERROR; -} - -NPError API_CALL NP_OSRShutdown(void) { - g_osrbrowser = NULL; - return NPERR_NO_ERROR; -} - -CefRefPtr GetOffScreenBrowser() { - return g_offscreenBrowser; -} - -void SetOffScreenTransparent(bool transparent) { - g_offscreenTransparent = transparent; -} - -#endif // OS_WIN diff --git a/cef1/tests/cefclient/osrplugin.h b/cef1/tests/cefclient/osrplugin.h deleted file mode 100644 index 737f089e9..000000000 --- a/cef1/tests/cefclient/osrplugin.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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. - -// Portions of this implementation are borrowed from webkit\default_plugin\ -// plugin_impl.h - -#ifndef CEF_TESTS_CEFCLIENT_OSRPLUGIN_H_ -#define CEF_TESTS_CEFCLIENT_OSRPLUGIN_H_ -#pragma once - -#include "include/cef_base.h" - -#if defined(OS_WIN) - -#include "include/cef_nplugin.h" - -class CefBrowser; - -extern NPNetscapeFuncs* g_osrbrowser; - -NPError API_CALL NP_OSRGetEntryPoints(NPPluginFuncs* pFuncs); -NPError API_CALL NP_OSRInitialize(NPNetscapeFuncs* pFuncs); -NPError API_CALL NP_OSRShutdown(void); - -CefRefPtr GetOffScreenBrowser(); - -void SetOffScreenTransparent(bool transparent); - -#endif // OS_WIN - -#endif // CEF_TESTS_CEFCLIENT_OSRPLUGIN_H_ diff --git a/cef1/tests/cefclient/osrplugin_test.cpp b/cef1/tests/cefclient/osrplugin_test.cpp deleted file mode 100644 index 0920a45d3..000000000 --- a/cef1/tests/cefclient/osrplugin_test.cpp +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "cefclient/osrplugin_test.h" -#include -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "cefclient/osrplugin.h" -#include "cefclient/cefclient.h" -#include "cefclient/client_handler.h" -#include "cefclient/plugin_test.h" - -namespace osrplugin_test { - -const char kTestUrl[] = "http://tests/osrplugin"; - -void InitTest() { - // Structure providing information about the client plugin. - CefPluginInfo plugin_info; - CefString(&plugin_info.display_name).FromASCII("Client OSR Plugin"); - CefString(&plugin_info.unique_name).FromASCII("client_osr_plugin"); - CefString(&plugin_info.description).FromASCII("My Example Client OSR Plugin"); - CefString(&plugin_info.mime_types).FromASCII( - "application/x-client-osr-plugin"); - - plugin_info.np_getentrypoints = NP_OSRGetEntryPoints; - plugin_info.np_initialize = NP_OSRInitialize; - plugin_info.np_shutdown = NP_OSRShutdown; - - // Register the internal client plugin - CefRegisterPlugin(plugin_info); -} - -void RunTest(CefRefPtr browser, bool transparent) { - class Listener : public CefDOMEventListener { - public: - Listener() {} - virtual void HandleEvent(CefRefPtr event) { - CefRefPtr browser = GetOffScreenBrowser(); - - CefRefPtr element = event->GetTarget(); - ASSERT(element.get()); - std::string elementId = element->GetElementAttribute("id"); - - if (elementId == "back") { - browser->GoBack(); - } else if (elementId == "forward") { - browser->GoForward(); - } else if (elementId == "stop") { - browser->Reload(); - } else if (elementId == "reload") { - browser->StopLoad(); - } else if (elementId == "go") { - // Retrieve the value of the "url" field and load it in the off-screen - // browser window. - CefRefPtr document = event->GetDocument(); - ASSERT(document.get()); - CefRefPtr url = document->GetElementById("url"); - ASSERT(url.get()); - CefString value = url->GetValue(); - if (!value.empty()) - browser->GetMainFrame()->LoadURL(value); - } else if (elementId == "testTransparency") { - // Transparency test. - browser->GetMainFrame()->LoadURL( - "http://tests/transparency"); - } else if(elementId == "testAnimation") { - // requestAnimationFrame test. - browser->GetMainFrame()->LoadURL( - "http://mrdoob.com/lab/javascript/requestanimationframe/"); - } else if (elementId == "testWindowlessPlugin") { - // Load flash, which is a windowless plugin. - browser->GetMainFrame()->LoadURL( - "http://www.adobe.com/software/flash/about/"); - } else if (elementId == "viewSource") { - // View the page source for the host browser window. - AppGetBrowser()->GetMainFrame()->ViewSource(); - } else { - // Not reached. - ASSERT(false); - } - } - - IMPLEMENT_REFCOUNTING(Listener); - }; - - class Visitor : public CefDOMVisitor { - public: - Visitor() {} - - void RegisterClickListener(CefRefPtr document, - CefRefPtr listener, - const std::string& elementId) { - CefRefPtr element = document->GetElementById(elementId); - ASSERT(element.get()); - element->AddEventListener("click", listener, false); - } - - virtual void Visit(CefRefPtr document) { - CefRefPtr listener(new Listener()); - - // Register click listeners for the various HTML elements. - RegisterClickListener(document, listener, "back"); - RegisterClickListener(document, listener, "forward"); - RegisterClickListener(document, listener, "stop"); - RegisterClickListener(document, listener, "reload"); - RegisterClickListener(document, listener, "go"); - RegisterClickListener(document, listener, "testTransparency"); - RegisterClickListener(document, listener, "testAnimation"); - RegisterClickListener(document, listener, "testWindowlessPlugin"); - RegisterClickListener(document, listener, "viewSource"); - } - - IMPLEMENT_REFCOUNTING(Visitor); - }; - - // Center the window on the screen. - int screenX = GetSystemMetrics(SM_CXFULLSCREEN); - int screenY = GetSystemMetrics(SM_CYFULLSCREEN); - int width = 1000, height = 780; - int x = (screenX - width) / 2; - int y = (screenY - height) / 2; - - SetWindowPos(AppGetMainHwnd(), NULL, x, y, width, height, - SWP_NOZORDER | SWP_SHOWWINDOW); - - // The DOM visitor will be called after the path is loaded. - CefRefPtr client = browser->GetClient(); - static_cast(client.get())->AddDOMVisitor( - kTestUrl, new Visitor()); - - SetOffScreenTransparent(transparent); - browser->GetMainFrame()->LoadURL(kTestUrl); -} - -} // namespace osrplugin_test diff --git a/cef1/tests/cefclient/osrplugin_test.h b/cef1/tests/cefclient/osrplugin_test.h deleted file mode 100644 index 3495b3662..000000000 --- a/cef1/tests/cefclient/osrplugin_test.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_OSRPLUGIN_TEST_H_ -#define CEF_TESTS_CEFCLIENT_OSRPLUGIN_TEST_H_ -#pragma once - -#include "include/cef_browser.h" - -namespace osrplugin_test { - -// Register the internal client plugin and V8 extension. -void InitTest(); - -// Run the test. -void RunTest(CefRefPtr browser, bool transparent); - -} // namespace osrplugin_test - -#endif // CEF_TESTS_CEFCLIENT_OSRPLUGIN_TEST_H_ diff --git a/cef1/tests/cefclient/osrtest_mac.h b/cef1/tests/cefclient/osrtest_mac.h deleted file mode 100644 index a6e1ee297..000000000 --- a/cef1/tests/cefclient/osrtest_mac.h +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license -// that can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_OSRTEST_MAC_H_ -#define CEF_TESTS_CEFCLIENT_OSRTEST_MAC_H_ - -namespace osrtest { - -void RunTest(bool transparent); - -} // namespace osrtest - -#endif // CEF_TESTS_CEFCLIENT_OSRTEST_MAC_H_ - diff --git a/cef1/tests/cefclient/osrtest_mac.mm b/cef1/tests/cefclient/osrtest_mac.mm deleted file mode 100644 index 9b2af4f7c..000000000 --- a/cef1/tests/cefclient/osrtest_mac.mm +++ /dev/null @@ -1,739 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 -#include - -#include "cefclient/osrtest_mac.h" -#include "include/cef_browser.h" -#include "cefclient/cefclient.h" -#include "cefclient/client_popup_handler.h" -#include "cefclient/osrenderer.h" -#include "cefclient/resource_util.h" -#include "cefclient/util.h" - -// The client OpenGL view. -@interface ClientOpenGLView : NSOpenGLView { - @public - NSTrackingArea* tracking_area_; - CefRefPtr browser_; - ClientOSRenderer* renderer_; - NSPoint last_mouse_pos_; - NSPoint cur_mouse_pos_; - bool rotating_; -} - -- (id)initWithFrame:(NSRect)frame andTransparency:(bool)transparency; -- (NSPoint)getClickPointForEvent:(NSEvent*)event; -- (void)getKeyInfo:(CefKeyInfo&)info forEvent:(NSEvent*)event; -- (int)getModifiersForEvent:(NSEvent*)event; -- (BOOL)isKeyUpEvent:(NSEvent*)event; -- (BOOL)isKeyPadEvent:(NSEvent*)event; -@end - - -namespace { - -// Handler for off-screen rendering windows. -class ClientOSRHandler : public CefClient, - public CefLifeSpanHandler, - public CefLoadHandler, - public CefRequestHandler, - public CefDisplayHandler, - public CefRenderHandler { - public: - explicit ClientOSRHandler(ClientOpenGLView* view) - : view_(view) { - } - ~ClientOSRHandler() { - } - - void Disconnect() { - view_ = nil; - } - - // CefClient methods - virtual CefRefPtr GetLifeSpanHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetLoadHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetRequestHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetDisplayHandler() OVERRIDE { - return this; - } - virtual CefRefPtr GetRenderHandler() OVERRIDE { - return this; - } - - // CefLifeSpanHandler methods - - virtual bool OnBeforePopup(CefRefPtr parentBrowser, - const CefPopupFeatures& popupFeatures, - CefWindowInfo& windowInfo, - const CefString& url, - CefRefPtr& client, - CefBrowserSettings& settings) OVERRIDE { - REQUIRE_UI_THREAD(); - - windowInfo.m_bWindowRenderingDisabled = TRUE; - client = new ClientPopupHandler(view_->browser_); - return false; - } - - virtual void OnAfterCreated(CefRefPtr browser) OVERRIDE { - REQUIRE_UI_THREAD(); - - // Set the view size to match the window size. - const NSRect bounds = [view_ bounds]; - browser->SetSize(PET_VIEW, bounds.size.width, bounds.size.height); - - view_->browser_ = browser; - } - - virtual void OnBeforeClose(CefRefPtr browser) OVERRIDE { - if (view_) - view_->browser_ = NULL; - } - - // CefLoadHandler methods - - virtual void OnLoadStart(CefRefPtr browser, - CefRefPtr frame) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!browser->IsPopup() && frame->IsMain()) { - // We've just started loading a page - SetLoading(true); - } - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!browser->IsPopup() && frame->IsMain()) { - // We've just finished loading a page - SetLoading(false); - } - } - - // CefRequestHandler methods - - virtual bool OnBeforeResourceLoad(CefRefPtr browser, - CefRefPtr request, - CefString& redirectUrl, - CefRefPtr& resourceStream, - CefRefPtr response, - int loadFlags) OVERRIDE { - REQUIRE_IO_THREAD(); - - std::string url = request->GetURL(); - if (url == "http://tests/osrtest") { - // Show the osrtest HTML contents - resourceStream = GetBinaryResourceReader("osrtest.html"); - response->SetMimeType("text/html"); - response->SetStatus(200); - } else if (url == "http://tests/transparency") { - // Show the osrtest HTML contents - resourceStream = GetBinaryResourceReader("transparency.html"); - response->SetMimeType("text/html"); - response->SetStatus(200); - } else if (strstr(url.c_str(), "/logoball.png") != NULL) { - // Load the "logoball.png" image resource. - resourceStream = GetBinaryResourceReader("logoball.png"); - response->SetMimeType("image/png"); - response->SetStatus(200); - } - - return false; - } - - // CefDisplayHandler methods - - virtual void OnNavStateChange(CefRefPtr browser, - bool canGoBack, - bool canGoForward) OVERRIDE { - REQUIRE_UI_THREAD(); - } - - virtual void OnAddressChange(CefRefPtr browser, - CefRefPtr frame, - const CefString& url) OVERRIDE { - REQUIRE_UI_THREAD(); - } - - virtual void OnTitleChange(CefRefPtr browser, - const CefString& title) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!view_) - return; - - // Set the frame window title bar - NSWindow* window = [view_ window]; - std::string titleStr(title); - NSString* str = [NSString stringWithUTF8String:titleStr.c_str()]; - [window setTitle:str]; - } - - // CefRenderHandler methods - - virtual bool GetViewRect(CefRefPtr browser, - CefRect& rect) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!view_) - return false; - - // The simulated screen and view rectangle are the same. This is necessary - // for popup menus to be located and sized inside the view. - const NSRect bounds = [view_ bounds]; - rect.x = rect.y = 0; - rect.width = bounds.size.width; - rect.height = bounds.size.height; - return true; - } - - virtual bool GetScreenRect(CefRefPtr browser, - CefRect& rect) OVERRIDE { - return GetViewRect(browser, rect); - } - - virtual bool GetScreenPoint(CefRefPtr browser, - int viewX, - int viewY, - int& screenX, - int& screenY) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!view_) - return false; - - // Convert the point from view coordinates to actual screen coordinates. - NSRect bounds = [view_ bounds]; - NSPoint view_pt = {viewX, bounds.size.height - viewY}; - NSPoint window_pt = [view_ convertPoint:view_pt toView:nil]; - NSPoint screen_pt = [[view_ window] convertBaseToScreen:window_pt]; - screenX = screen_pt.x; - screenY = screen_pt.y; - return true; - } - - virtual void OnPopupShow(CefRefPtr browser, - bool show) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!view_) - return; - - view_->renderer_->OnPopupShow(browser, show); - } - - virtual void OnPopupSize(CefRefPtr browser, - const CefRect& rect) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!view_) - return; - - view_->renderer_->OnPopupSize(browser, rect); - } - - virtual void OnPaint(CefRefPtr browser, - PaintElementType type, - const RectList& dirtyRects, - const void* buffer) OVERRIDE { - REQUIRE_UI_THREAD(); - - if (!view_) - return; - - NSOpenGLContext* context = [view_ openGLContext]; - [context makeCurrentContext]; - - view_->renderer_->OnPaint(browser, type, dirtyRects, buffer); - view_->renderer_->Render(); - - [context flushBuffer]; - } - - virtual void OnCursorChange(CefRefPtr browser, - CefCursorHandle cursor) OVERRIDE { - REQUIRE_UI_THREAD(); - [cursor set]; - } - - private: - void SetLoading(bool isLoading) { - } - - ClientOpenGLView* view_; - - // Include the default reference counting implementation. - IMPLEMENT_REFCOUNTING(ClientOSRPlugin); -}; - -} // namespace - - -@implementation ClientOpenGLView - -- (id)initWithFrame:(NSRect)frame andTransparency:(bool)transparency { - NSOpenGLPixelFormat * pixelFormat = - [[NSOpenGLPixelFormat alloc] - initWithAttributes:(NSOpenGLPixelFormatAttribute[]) { - NSOpenGLPFAWindow, - NSOpenGLPFADoubleBuffer, - NSOpenGLPFADepthSize, - 32, - 0}]; - [pixelFormat autorelease]; - - self = [super initWithFrame:frame pixelFormat:pixelFormat]; - if (self) { - renderer_ = new ClientOSRenderer(transparency); - rotating_ = false; - - tracking_area_ = - [[NSTrackingArea alloc] initWithRect:frame - options:NSTrackingMouseMoved | - NSTrackingMouseEnteredAndExited | - NSTrackingActiveInActiveApp | - NSTrackingInVisibleRect - owner:self - userInfo:nil]; - [self addTrackingArea:tracking_area_]; - } - return self; -} - -- (void)dealloc { - if (browser_) { - static_cast(browser_->GetClient().get())->Disconnect(); - browser_->CloseBrowser(); - browser_ = NULL; - } - if (renderer_) - delete renderer_; - - [super dealloc]; -} - -- (void)setFrame:(NSRect)frameRect { - [super setFrame:frameRect]; - - int width = frameRect.size.width; - int height = frameRect.size.height; - - if (browser_) - browser_->SetSize(PET_VIEW, width, height); -} - -- (void)mouseDown:(NSEvent *)event { - if (!browser_) - return; - - NSPoint point = [self getClickPointForEvent:event]; - int clickCount = [event clickCount]; - - browser_->SendMouseClickEvent(point.x, point.y, MBT_LEFT, false, clickCount); -} - -- (void)rightMouseDown:(NSEvent *)event { - if (!browser_) - return; - - NSPoint point = [self getClickPointForEvent:event]; - - if ([event modifierFlags] & NSShiftKeyMask) { - // Start rotation effect. - last_mouse_pos_ = cur_mouse_pos_ = point; - rotating_ = true; - return; - } - - int clickCount = [event clickCount]; - - browser_->SendMouseClickEvent(point.x, point.y, MBT_RIGHT, false, clickCount); -} - -- (void)otherMouseDown:(NSEvent *)event { - if (!browser_) - return; - - NSPoint point = [self getClickPointForEvent:event]; - int clickCount = [event clickCount]; - - browser_->SendMouseClickEvent(point.x, point.y, MBT_MIDDLE, false, - clickCount); -} - -- (void)mouseUp:(NSEvent *)event { - if (!browser_) - return; - - NSPoint point = [self getClickPointForEvent:event]; - int clickCount = [event clickCount]; - - browser_->SendMouseClickEvent(point.x, point.y, MBT_LEFT, true, clickCount); -} - -- (void)rightMouseUp:(NSEvent *)event { - if (!browser_) - return; - - if (rotating_) { - // End rotation effect. - renderer_->SetSpin(0, 0); - rotating_ = false; - [self setNeedsDisplay:YES]; - return; - } - - NSPoint point = [self getClickPointForEvent:event]; - int clickCount = [event clickCount]; - - browser_->SendMouseClickEvent(point.x, point.y, MBT_RIGHT, true, clickCount); -} - -- (void)otherMouseUp:(NSEvent *)event { - if (!browser_) - return; - - NSPoint point = [self getClickPointForEvent:event]; - int clickCount = [event clickCount]; - - browser_->SendMouseClickEvent(point.x, point.y, MBT_MIDDLE, true, clickCount); -} - -- (void)mouseMoved:(NSEvent *)event { - if (!browser_) - return; - - NSPoint point = [self getClickPointForEvent:event]; - - if (rotating_) { - // Apply rotation effect. - cur_mouse_pos_ = point; - renderer_->IncrementSpin((cur_mouse_pos_.x - last_mouse_pos_.x), - (cur_mouse_pos_.y - last_mouse_pos_.y)); - last_mouse_pos_ = cur_mouse_pos_; - [self setNeedsDisplay:YES]; - return; - } - - browser_->SendMouseMoveEvent(point.x, point.y, false); -} - -- (void)mouseDragged:(NSEvent *)event { - [self mouseMoved:event]; -} - -- (void)rightMouseDragged:(NSEvent *)event { - [self mouseMoved:event]; -} - -- (void)otherMouseDragged:(NSEvent *)event { - [self mouseMoved:event]; -} - -- (void)mouseEntered:(NSEvent *)event { - [self mouseMoved:event]; -} - -- (void)mouseExited:(NSEvent *)event { - if (!browser_) - return; - - NSPoint point = [self getClickPointForEvent:event]; - - browser_->SendMouseMoveEvent(point.x, point.y, true); -} - -- (void)keyDown:(NSEvent *)event { - if (!browser_) - return; - - CefKeyInfo keyInfo; - [self getKeyInfo:keyInfo forEvent:event]; - int modifiers = [self getModifiersForEvent:event]; - - browser_->SendKeyEvent(KT_KEYDOWN, keyInfo, modifiers); - - if ([event modifierFlags] & (NSNumericPadKeyMask | NSFunctionKeyMask)) { - // Don't send a Char event for non-char keys like arrows, function keys and - // clear. - switch (keyInfo.keyCode) { - case 81: // = - case 75: // / - case 67: // * - case 78: // - - case 69: // + - case 76: // Enter - case 65: // . - case 82: // 0 - case 83: // 1 - case 84: // 2 - case 85: // 3 - case 86: // 4 - case 87: // 5 - case 88: // 6 - case 89: // 7 - case 91: // 8 - case 92: // 9 - break; - default: - return; - } - } - - browser_->SendKeyEvent(KT_CHAR, keyInfo, modifiers); -} - -- (void)keyUp:(NSEvent *)event { - if (!browser_) - return; - - CefKeyInfo keyInfo; - [self getKeyInfo:keyInfo forEvent:event]; - int modifiers = [self getModifiersForEvent:event]; - - browser_->SendKeyEvent(KT_KEYUP, keyInfo, modifiers); -} - -- (void)flagsChanged:(NSEvent *)event { - if ([self isKeyUpEvent:event]) - [self keyUp:event]; - else - [self keyDown:event]; -} - -- (void)scrollWheel:(NSEvent *)event { - if (!browser_) - return; - - CGEventRef cgEvent = [event CGEvent]; - ASSERT(cgEvent); - - NSPoint point = [self getClickPointForEvent:event]; - int deltaX = - CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventPointDeltaAxis2); - int deltaY = - CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventPointDeltaAxis1); - - browser_->SendMouseWheelEvent(point.x, point.y, deltaX, deltaY); -} - -- (BOOL)canBecomeKeyView { - return (browser_ != NULL); -} - -- (BOOL)acceptsFirstResponder { - return (browser_ != NULL); -} - -- (BOOL)becomeFirstResponder { - if (browser_) { - browser_->SendFocusEvent(true); - return [super becomeFirstResponder]; - } - - return NO; -} - -- (BOOL)resignFirstResponder { - if (browser_) { - browser_->SendFocusEvent(false); - return [super resignFirstResponder]; - } - - return NO; -} - -- (void)undo:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->Undo(); -} - -- (void)redo:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->Redo(); -} - -- (void)cut:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->Cut(); -} - -- (void)copy:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->Copy(); -} - -- (void)paste:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->Paste(); -} - -- (void)delete:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->Delete(); -} - -- (void)selectAll:(id)sender { - if (browser_) - browser_->GetFocusedFrame()->SelectAll(); -} - -- (NSPoint)getClickPointForEvent:(NSEvent*)event { - NSPoint windowLocal = [event locationInWindow]; - NSPoint contentLocal = [self convertPoint:windowLocal fromView:nil]; - - NSPoint point; - point.x = contentLocal.x; - point.y = [self frame].size.height - contentLocal.y; // Flip y. - return point; -} - -- (void)getKeyInfo:(CefKeyInfo&)info forEvent:(NSEvent*)event { - if ([event type] == NSKeyDown || [event type] == NSKeyUp) { - NSString* s = [event characters]; - if ([s length] > 0) - info.character = [s characterAtIndex:0]; - - s = [event charactersIgnoringModifiers]; - if ([s length] > 0) - info.characterNoModifiers = [s characterAtIndex:0]; - } - - info.keyCode = [event keyCode]; -} - -- (int)getModifiersForEvent:(NSEvent*)event { - int modifiers = 0; - - if ([event modifierFlags] & NSControlKeyMask) - modifiers |= KEY_CTRL; - if ([event modifierFlags] & NSShiftKeyMask) - modifiers |= KEY_SHIFT; - if ([event modifierFlags] & NSAlternateKeyMask) - modifiers |= KEY_ALT; - if ([event modifierFlags] & NSCommandKeyMask) - modifiers |= KEY_META; - if ([self isKeyPadEvent:event]) - modifiers |= KEY_KEYPAD; - - return modifiers; -} - -- (BOOL)isKeyUpEvent:(NSEvent*)event { - if ([event type] != NSFlagsChanged) - return [event type] == NSKeyUp; - - // FIXME: This logic fails if the user presses both Shift keys at once, for - // example: we treat releasing one of them as keyDown. - switch ([event keyCode]) { - case 54: // Right Command - case 55: // Left Command - return ([event modifierFlags] & NSCommandKeyMask) == 0; - - case 57: // Capslock - return ([event modifierFlags] & NSAlphaShiftKeyMask) == 0; - - case 56: // Left Shift - case 60: // Right Shift - return ([event modifierFlags] & NSShiftKeyMask) == 0; - - case 58: // Left Alt - case 61: // Right Alt - return ([event modifierFlags] & NSAlternateKeyMask) == 0; - - case 59: // Left Ctrl - case 62: // Right Ctrl - return ([event modifierFlags] & NSControlKeyMask) == 0; - - case 63: // Function - return ([event modifierFlags] & NSFunctionKeyMask) == 0; - } - return false; -} - -- (BOOL)isKeyPadEvent:(NSEvent*)event { - if ([event modifierFlags] & NSNumericPadKeyMask) - return true; - - switch ([event keyCode]) { - case 71: // Clear - case 81: // = - case 75: // / - case 67: // * - case 78: // - - case 69: // + - case 76: // Enter - case 65: // . - case 82: // 0 - case 83: // 1 - case 84: // 2 - case 85: // 3 - case 86: // 4 - case 87: // 5 - case 88: // 6 - case 89: // 7 - case 91: // 8 - case 92: // 9 - return true; - } - - return false; -} - -@end - - -namespace osrtest { - -void RunTest(bool transparent) { - NSRect screen_rect = [[NSScreen mainScreen] visibleFrame]; - NSRect window_rect = {{0, screen_rect.size.height}, {700, 700}}; - NSWindow* newWnd = [[NSWindow alloc] - initWithContentRect:window_rect - styleMask:(NSTitledWindowMask | - NSClosableWindowMask | - NSMiniaturizableWindowMask | - NSResizableWindowMask | - NSUnifiedTitleAndToolbarWindowMask) - backing:NSBackingStoreBuffered - defer:NO]; - ASSERT(newWnd); - - ClientOpenGLView* view = [[ClientOpenGLView alloc] initWithFrame:window_rect - andTransparency:transparent]; - [view setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; - - [newWnd setContentView:view]; - [view release]; - - CefWindowInfo info; - - // Initialize the window info as off-screen. - info.SetAsOffScreen(view); - info.SetTransparentPainting(transparent); - - CefBrowserSettings settings; - AppGetBrowserSettings(settings); - - // Creat the browser window. - CefBrowser::CreateBrowser(info, new ClientOSRHandler(view), - "http://tests/osrtest", settings); - - [newWnd makeKeyAndOrderFront: nil]; -} - -} // namespace osrtest - diff --git a/cef1/tests/cefclient/performance_test.cpp b/cef1/tests/cefclient/performance_test.cpp deleted file mode 100644 index 12f9935a4..000000000 --- a/cef1/tests/cefclient/performance_test.cpp +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "cefclient/performance_test.h" -#include "include/cef_v8.h" - -#include -#include - -#include "cefclient/performance_test_setup.h" - -namespace performance_test { - -// Use more interations for a Release build. -#ifdef NDEBUG -const size_t kDefaultIterations = 100000; -#else -const size_t kDefaultIterations = 10000; -#endif - -const char kTestUrl[] = "http://tests/performance"; - -namespace { - -const char kGetPerfTests[] = "GetPerfTests"; -const char kRunPerfTest[] = "RunPerfTest"; - -class V8Handler : public CefV8Handler { - public: - V8Handler() { - } - - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) { - if (name == kRunPerfTest) { - if (arguments.size() == 1 && arguments[0]->IsString()) { - // Run the specified perf test. - bool found = false; - - std::string test = arguments[0]->GetStringValue(); - for (size_t i = 0; i < kPerfTestsCount; ++i) { - if (test == kPerfTests[i].name) { - // Execute the test. - int64 delta = kPerfTests[i].test(kPerfTests[i].iterations); - - retval = CefV8Value::CreateInt(delta); - found = true; - break; - } - } - - if (!found) { - std::string msg = "Unknown test: "; - msg.append(test); - exception = msg; - } - } else { - exception = "Invalid function parameters"; - } - } else if (name == kGetPerfTests) { - // Retrieve the list of perf tests. - retval = CefV8Value::CreateArray(kPerfTestsCount); - for (size_t i = 0; i < kPerfTestsCount; ++i) { - CefRefPtr val = CefV8Value::CreateArray(2); - val->SetValue(0, CefV8Value::CreateString(kPerfTests[i].name)); - val->SetValue(1, CefV8Value::CreateUInt(kPerfTests[i].iterations)); - retval->SetValue(i, val); - } - } - - return true; - } - - private: - IMPLEMENT_REFCOUNTING(V8Handler); -}; - -} // namespace - -void InitTest(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr object) { - CefRefPtr handler = new V8Handler(); - - // Bind test functions. - object->SetValue(kGetPerfTests, - CefV8Value::CreateFunction(kGetPerfTests, handler), - V8_PROPERTY_ATTRIBUTE_READONLY); - object->SetValue(kRunPerfTest, - CefV8Value::CreateFunction(kRunPerfTest, handler), - V8_PROPERTY_ATTRIBUTE_READONLY); -} - -} // namespace performance_test diff --git a/cef1/tests/cefclient/performance_test.h b/cef1/tests/cefclient/performance_test.h deleted file mode 100644 index f279301b3..000000000 --- a/cef1/tests/cefclient/performance_test.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_PERFORMANCE_TEST_H_ -#define CEF_TESTS_CEFCLIENT_PERFORMANCE_TEST_H_ -#pragma once - -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "include/cef_v8.h" - -namespace performance_test { - -extern const char kTestUrl[]; - -void InitTest(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr object); - -} // namespace performance_test - -#endif // CEF_TESTS_CEFCLIENT_PERFORMANCE_TEST_H_ diff --git a/cef1/tests/cefclient/performance_test_setup.h b/cef1/tests/cefclient/performance_test_setup.h deleted file mode 100644 index a4f2647ef..000000000 --- a/cef1/tests/cefclient/performance_test_setup.h +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_PERFORMANCE_TEST_SETUP_H_ -#define CEF_TESTS_CEFCLIENT_PERFORMANCE_TEST_SETUP_H_ -#pragma once - -#include "cefclient/util.h" - -namespace performance_test { - -// Default number of iterations. -extern const size_t kDefaultIterations; - -// Test name. -#define PERF_TEST_NAME(name) PerfTest##name - -// Entry in test array. -#define PERF_TEST_ENTRY_EX(name, iterations) \ - { #name, PERF_TEST_NAME(name), iterations } -#define PERF_TEST_ENTRY(name) PERF_TEST_ENTRY_EX(name, kDefaultIterations) - -// Test function declaration. -#define PERF_TEST_RESULT int64 -#define PERF_TEST_PARAM_ITERATIONS iterations -#define PERF_TEST_PARAMS size_t PERF_TEST_PARAM_ITERATIONS -#define PERF_TEST_FUNC(name) \ - PERF_TEST_RESULT PERF_TEST_NAME(name)(PERF_TEST_PARAMS) - -// Typedef for test pointers. -typedef PERF_TEST_RESULT(PerfTest(PERF_TEST_PARAMS)); - -class CefTimer { - public: - CefTimer() : running_(false) { - } - - bool IsRunning() { return running_; } - - void Start() { - ASSERT(!running_); - running_ = true; - start_.Now(); - } - - void Stop() { - stop_.Now(); - ASSERT(running_); - running_ = false; - } - - int64 Delta() { - ASSERT(!running_); - return start_.Delta(stop_); - } - - private: - bool running_; - CefTime start_; - CefTime stop_; -}; - -// Peform test iterations using a user-provided timing result variable. -#define PERF_ITERATIONS_START_EX() \ - { \ - CefTimer _timer; \ - _timer.Start(); \ - for (size_t _i = 0; _i < PERF_TEST_PARAM_ITERATIONS; ++_i) { - -#define PERF_ITERATIONS_END_EX(result) \ - } \ - _timer.Stop(); \ - result = _timer.Delta(); \ - } - -// Perform test iterations and return the timing result. -#define PERF_ITERATIONS_START() \ - int64 _result = 0; \ - PERF_ITERATIONS_START_EX() - -#define PERF_ITERATIONS_END() \ - PERF_ITERATIONS_END_EX(_result) \ - return _result; - -// Perf test entry structure. -struct PerfTestEntry { - const char* name; - PerfTest* test; - size_t iterations; -}; - -// Array of perf tests. -extern const PerfTestEntry kPerfTests[]; -extern const size_t kPerfTestsCount; - -} // namespace performance_test - -#endif // CEF_TESTS_CEFCLIENT_PERFORMANCE_TEST_H_ diff --git a/cef1/tests/cefclient/performance_test_tests.cpp b/cef1/tests/cefclient/performance_test_tests.cpp deleted file mode 100644 index 389a126a2..000000000 --- a/cef1/tests/cefclient/performance_test_tests.cpp +++ /dev/null @@ -1,328 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 "cefclient/performance_test.h" -#include "cefclient/performance_test_setup.h" -#include "include/cef_v8.h" - -namespace performance_test { - -namespace { - -// Test function implementations. - -PERF_TEST_FUNC(V8NullCreate) { - PERF_ITERATIONS_START() - CefRefPtr value = CefV8Value::CreateNull(); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8BoolCreate) { - PERF_ITERATIONS_START() - CefRefPtr value = CefV8Value::CreateBool(true); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8IntCreate) { - PERF_ITERATIONS_START() - CefRefPtr value = CefV8Value::CreateInt(-5); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8UIntCreate) { - PERF_ITERATIONS_START() - CefRefPtr value = CefV8Value::CreateUInt(10); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8DoubleCreate) { - PERF_ITERATIONS_START() - CefRefPtr value = CefV8Value::CreateDouble(12.432); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8DateCreate) { - static cef_time_t time = {2012, 1, 0, 1}; - - PERF_ITERATIONS_START() - CefRefPtr value = CefV8Value::CreateDate(time); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8StringCreate) { - CefString str = "test string"; - - PERF_ITERATIONS_START() - CefRefPtr value = CefV8Value::CreateString(str); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8ArrayCreate) { - PERF_ITERATIONS_START() - CefRefPtr value = CefV8Value::CreateArray(1); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8ArraySetValue) { - CefRefPtr val = CefV8Value::CreateBool(true); - CefRefPtr array = CefV8Value::CreateArray(1); - array->SetValue(0, val); - - PERF_ITERATIONS_START() - array->SetValue(0, val); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8ArrayGetValue) { - CefRefPtr val = CefV8Value::CreateBool(true); - CefRefPtr array = CefV8Value::CreateArray(1); - array->SetValue(0, val); - - PERF_ITERATIONS_START() - CefRefPtr ret = array->GetValue(0); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8FunctionCreate) { - class Handler : public CefV8Handler { - public: - Handler() {} - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { return false; } - IMPLEMENT_REFCOUNTING(Handler); - }; - - CefString name = "name"; - CefRefPtr handler = new Handler(); - - PERF_ITERATIONS_START() - CefRefPtr value = CefV8Value::CreateFunction(name, handler); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8FunctionExecute) { - class Handler : public CefV8Handler { - public: - Handler() {} - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { return true; } - IMPLEMENT_REFCOUNTING(Handler); - }; - - CefString name = "name"; - CefRefPtr handler = new Handler(); - CefRefPtr func = CefV8Value::CreateFunction(name, handler); - CefRefPtr obj = CefV8Context::GetCurrentContext()->GetGlobal(); - CefV8ValueList args; - - PERF_ITERATIONS_START() - func->ExecuteFunction(obj, args); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8FunctionExecuteWithContext) { - class Handler : public CefV8Handler { - public: - Handler() {} - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { return true; } - IMPLEMENT_REFCOUNTING(Handler); - }; - - CefString name = "name"; - CefRefPtr handler = new Handler(); - CefRefPtr func = CefV8Value::CreateFunction(name, handler); - CefRefPtr context = CefV8Context::GetCurrentContext(); - CefRefPtr obj = context->GetGlobal(); - CefV8ValueList args; - - PERF_ITERATIONS_START() - func->ExecuteFunctionWithContext(context, obj, args); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8ObjectCreate) { - PERF_ITERATIONS_START() - CefRefPtr value = CefV8Value::CreateObject(NULL); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8ObjectCreateWithAccessor) { - class Accessor : public CefV8Accessor { - public: - Accessor() {} - virtual bool Get(const CefString& name, - const CefRefPtr object, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - return true; - } - virtual bool Set(const CefString& name, - const CefRefPtr object, - const CefRefPtr value, - CefString& exception) OVERRIDE { - return true; - } - IMPLEMENT_REFCOUNTING(Accessor); - }; - - CefRefPtr accessor = new Accessor(); - - PERF_ITERATIONS_START() - CefRefPtr value = CefV8Value::CreateObject(accessor); - PERF_ITERATIONS_END() -} - - -PERF_TEST_FUNC(V8ObjectSetValue) { - CefString name = "name"; - CefRefPtr val = CefV8Value::CreateBool(true); - CefRefPtr obj = CefV8Value::CreateObject(NULL); - obj->SetValue(name, val, V8_PROPERTY_ATTRIBUTE_NONE); - - PERF_ITERATIONS_START() - obj->SetValue(name, val, V8_PROPERTY_ATTRIBUTE_NONE); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8ObjectGetValue) { - CefString name = "name"; - CefRefPtr val = CefV8Value::CreateBool(true); - CefRefPtr obj = CefV8Value::CreateObject(NULL); - obj->SetValue(name, val, V8_PROPERTY_ATTRIBUTE_NONE); - - PERF_ITERATIONS_START() - CefRefPtr ret = obj->GetValue(name); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8ObjectSetValueWithAccessor) { - class Accessor : public CefV8Accessor { - public: - Accessor() {} - virtual bool Get(const CefString& name, - const CefRefPtr object, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - return true; - } - virtual bool Set(const CefString& name, - const CefRefPtr object, - const CefRefPtr value, - CefString& exception) OVERRIDE { - val_ = value; - return true; - } - CefRefPtr val_; - IMPLEMENT_REFCOUNTING(Accessor); - }; - - CefRefPtr accessor = new Accessor(); - - CefString name = "name"; - CefRefPtr val = CefV8Value::CreateBool(true); - CefRefPtr obj = CefV8Value::CreateObject(accessor); - obj->SetValue(name, V8_ACCESS_CONTROL_DEFAULT, V8_PROPERTY_ATTRIBUTE_NONE); - obj->SetValue(name, val, V8_PROPERTY_ATTRIBUTE_NONE); - - PERF_ITERATIONS_START() - obj->SetValue(name, val, V8_PROPERTY_ATTRIBUTE_NONE); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8ObjectGetValueWithAccessor) { - class Accessor : public CefV8Accessor { - public: - Accessor() : val_(CefV8Value::CreateBool(true)) {} - virtual bool Get(const CefString& name, - const CefRefPtr object, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - retval = val_; - return true; - } - virtual bool Set(const CefString& name, - const CefRefPtr object, - const CefRefPtr value, - CefString& exception) OVERRIDE { - return true; - } - CefRefPtr val_; - IMPLEMENT_REFCOUNTING(Accessor); - }; - - CefRefPtr accessor = new Accessor(); - - CefString name = "name"; - CefRefPtr val = CefV8Value::CreateBool(true); - CefRefPtr obj = CefV8Value::CreateObject(accessor); - obj->SetValue(name, V8_ACCESS_CONTROL_DEFAULT, V8_PROPERTY_ATTRIBUTE_NONE); - obj->SetValue(name, val, V8_PROPERTY_ATTRIBUTE_NONE); - - PERF_ITERATIONS_START() - CefRefPtr ret = obj->GetValue(name); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8ContextEnterExit) { - CefRefPtr context = CefV8Context::GetCurrentContext(); - - PERF_ITERATIONS_START() - context->Enter(); - context->Exit(); - PERF_ITERATIONS_END() -} - -PERF_TEST_FUNC(V8ContextEval) { - CefRefPtr context = CefV8Context::GetCurrentContext(); - CefString jsCode = "var i = 0;"; - CefRefPtr retval; - CefRefPtr exception; - - PERF_ITERATIONS_START() - context->Eval(jsCode, retval, exception); - PERF_ITERATIONS_END() -} - -} // namespace - - -// Test function entries. - -const PerfTestEntry kPerfTests[] = { - PERF_TEST_ENTRY(V8NullCreate), - PERF_TEST_ENTRY(V8BoolCreate), - PERF_TEST_ENTRY(V8IntCreate), - PERF_TEST_ENTRY(V8UIntCreate), - PERF_TEST_ENTRY(V8DoubleCreate), - PERF_TEST_ENTRY(V8DateCreate), - PERF_TEST_ENTRY(V8StringCreate), - PERF_TEST_ENTRY(V8ArrayCreate), - PERF_TEST_ENTRY(V8ArraySetValue), - PERF_TEST_ENTRY(V8ArrayGetValue), - PERF_TEST_ENTRY(V8FunctionCreate), - PERF_TEST_ENTRY(V8FunctionExecute), - PERF_TEST_ENTRY(V8FunctionExecuteWithContext), - PERF_TEST_ENTRY(V8ObjectCreate), - PERF_TEST_ENTRY(V8ObjectCreateWithAccessor), - PERF_TEST_ENTRY(V8ObjectSetValue), - PERF_TEST_ENTRY(V8ObjectGetValue), - PERF_TEST_ENTRY(V8ObjectSetValueWithAccessor), - PERF_TEST_ENTRY(V8ObjectGetValueWithAccessor), - PERF_TEST_ENTRY(V8ContextEnterExit), - PERF_TEST_ENTRY(V8ContextEval), -}; - -const size_t kPerfTestsCount = (sizeof(kPerfTests) / sizeof(kPerfTests[0])); - -} // namespace performance_test diff --git a/cef1/tests/cefclient/plugin_test.cpp b/cef1/tests/cefclient/plugin_test.cpp deleted file mode 100644 index db4161bc6..000000000 --- a/cef1/tests/cefclient/plugin_test.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "include/cef_nplugin.h" -#include "cefclient/clientplugin.h" - -namespace plugin_test { - -void InitTest() { - // Structure providing information about the client plugin. - CefPluginInfo plugin_info; - CefString(&plugin_info.display_name).FromASCII("Client Plugin"); - CefString(&plugin_info.unique_name).FromASCII("client_plugin"); - CefString(&plugin_info.description).FromASCII("My Example Client Plugin"); - CefString(&plugin_info.mime_types).FromASCII("application/x-client-plugin"); - CefString(&plugin_info.file_extensions).FromASCII("xcp"); - - plugin_info.np_getentrypoints = NP_ClientGetEntryPoints; - plugin_info.np_initialize = NP_ClientInitialize; - plugin_info.np_shutdown = NP_ClientShutdown; - - // Register the internal client plugin - CefRegisterPlugin(plugin_info); -} - -} // namespace plugin_test diff --git a/cef1/tests/cefclient/plugin_test.h b/cef1/tests/cefclient/plugin_test.h deleted file mode 100644 index 8885105dc..000000000 --- a/cef1/tests/cefclient/plugin_test.h +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_PLUGIN_TEST_H_ -#define CEF_TESTS_CEFCLIENT_PLUGIN_TEST_H_ -#pragma once - -namespace plugin_test { - -// Register the internal client plugin. -void InitTest(); - -} // namespace plugin_test - -#endif // CEF_TESTS_CEFCLIENT_PLUGIN_TEST_H_ diff --git a/cef1/tests/cefclient/res/binding.html b/cef1/tests/cefclient/res/binding.html deleted file mode 100644 index 9672f8ada..000000000 --- a/cef1/tests/cefclient/res/binding.html +++ /dev/null @@ -1,22 +0,0 @@ - - -ClientV8FunctionHandler says:

-
-
- - diff --git a/cef1/tests/cefclient/res/cefclient.ico b/cef1/tests/cefclient/res/cefclient.ico deleted file mode 100644 index d551aa3aaf80adf9b7760e2eb8de95a5c3e53df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23558 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 - -Dialog Test - - - -
-Click a button to show the associated dialog type. -
-
-
-
input type="file": -

-
- - diff --git a/cef1/tests/cefclient/res/domaccess.html b/cef1/tests/cefclient/res/domaccess.html deleted file mode 100644 index 68ff69647..000000000 --- a/cef1/tests/cefclient/res/domaccess.html +++ /dev/null @@ -1,13 +0,0 @@ - - -

Select some portion of the below page content and click the "Describe Selection" button. The selected region will then be described below.

-

This is p1

-

This is p2

-

This is p3

-

This is p4

-
- -

The description will appear here.

-
- - diff --git a/cef1/tests/cefclient/res/extension.html b/cef1/tests/cefclient/res/extension.html deleted file mode 100644 index f713996de..000000000 --- a/cef1/tests/cefclient/res/extension.html +++ /dev/null @@ -1,15 +0,0 @@ - - -ClientV8ExtensionHandler says:
-
-
- - diff --git a/cef1/tests/cefclient/res/localstorage.html b/cef1/tests/cefclient/res/localstorage.html deleted file mode 100644 index a794305b7..000000000 --- a/cef1/tests/cefclient/res/localstorage.html +++ /dev/null @@ -1,24 +0,0 @@ - - - -Click the "Add Line" button to add a line or the "Clear" button to clear.
-This data will persist across sessions if a cache path was specified.
- - -
- - - diff --git a/cef1/tests/cefclient/res/logo.png b/cef1/tests/cefclient/res/logo.png deleted file mode 100644 index 41dd728df08295acf843dce12d9d19a342922df7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19879 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 - - - A Modal Dialog - - -Argument:
-
-Reply:
-

- -

-

- - - diff --git a/cef1/tests/cefclient/res/modalmain.html b/cef1/tests/cefclient/res/modalmain.html deleted file mode 100644 index 44a060507..000000000 --- a/cef1/tests/cefclient/res/modalmain.html +++ /dev/null @@ -1,58 +0,0 @@ - - - -Test Modal Dialog - - - -

Tests

-
- - -

Time (timers are suppresed while the modal dialog is open)

-
- -

Result Log

-
- - - - - diff --git a/cef1/tests/cefclient/res/osrplugin.html b/cef1/tests/cefclient/res/osrplugin.html deleted file mode 100644 index 5a5f2d3dd..000000000 --- a/cef1/tests/cefclient/res/osrplugin.html +++ /dev/null @@ -1,55 +0,0 @@ - - -Off-Screen Rendering App Example - - -
- - - - -
- - - - - - - - - - - - - - -
Off-Screen Rendering App Example
An embedded OpenGL plugin window that renders content from an off-screen browser window. - View Page Source
You can rotate the view! -
    -
  • Click and drag the view with the left mouse button while holding the shift key.
  • -
  • Enter a URL and click the "Go!" button to browse to a new Website.
  • -
  • Click here to test transparency.
  • -
  • Click here to test requestAnimationFrame.
  • -
  • Click here to test a windowless plugin.
  • -
-
- -
-   -
- - - - - -
-
- -
-
- Pixel value: Click the left mouse button while holding the control key to test a pixel value. -
-
-
- - diff --git a/cef1/tests/cefclient/res/osrtest.html b/cef1/tests/cefclient/res/osrtest.html deleted file mode 100644 index cb52d4624..000000000 --- a/cef1/tests/cefclient/res/osrtest.html +++ /dev/null @@ -1,41 +0,0 @@ - - -Off-Screen Rendering Test - - -
- - - - - - - - - - - - - - - - - -
Off-Screen Rendering App Example
An OpenGL view that renders content from an off-screen browser window.
You can rotate the view! -
    -
  • Click and drag the view with the left mouse button while holding the shift key.
  • -
  • Enter a URL and click the "Go!" button to browse to a new Website.
  • -
  • Click here to test transparency.
  • -
  • Click here to test requestAnimationFrame.
  • -
  • Click here to test a windowless plugin.
  • -
-
-
- - -
-
-
- - - diff --git a/cef1/tests/cefclient/res/other_tests.html b/cef1/tests/cefclient/res/other_tests.html deleted file mode 100644 index 41a8d51d3..000000000 --- a/cef1/tests/cefclient/res/other_tests.html +++ /dev/null @@ -1,31 +0,0 @@ - - -Other Tests - - -

Various other internal and external tests.

- - - diff --git a/cef1/tests/cefclient/res/performance.html b/cef1/tests/cefclient/res/performance.html deleted file mode 100644 index df7f0a5d7..000000000 --- a/cef1/tests/cefclient/res/performance.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - Performance Tests - - - -

Performance Tests

- Filter: -
- -
- - - - - - - - - - - - - -
NameIterations per RunAvg (ms)Min (ms)Max (ms)StdDev (ms)Runs (ms)
-
- -
- - Result 1: -
Result 2: -
- -
- - - - - - - - - - -
NameResult 1 Avg (ms)Result 2 Avg (ms)% Diff
-
- - - - - diff --git a/cef1/tests/cefclient/res/plugin.html b/cef1/tests/cefclient/res/plugin.html deleted file mode 100644 index 3deedd903..000000000 --- a/cef1/tests/cefclient/res/plugin.html +++ /dev/null @@ -1,10 +0,0 @@ - - -Client Plugin loaded by Mime Type:
- -

Client Plugin loaded by File Extension:
- - -
 
- - diff --git a/cef1/tests/cefclient/res/small.ico b/cef1/tests/cefclient/res/small.ico deleted file mode 100644 index d551aa3aaf80adf9b7760e2eb8de95a5c3e53df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23558 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 - - -Transparency Examples - - - - -

Image Transparency

-Hover over an image to make it fully opaque.
-klematis -klematis - -

Block Transparency

-White 0% White 25% White 50% White 75% White 100% -
-Black 0% Black 25% Black 50% Black 75% Black 100% - - - diff --git a/cef1/tests/cefclient/res/uiplugin.html b/cef1/tests/cefclient/res/uiplugin.html deleted file mode 100644 index 8d982db0b..000000000 --- a/cef1/tests/cefclient/res/uiplugin.html +++ /dev/null @@ -1,57 +0,0 @@ - - -User Interface App Example - - -
- - - - -
- - - - - - - - - - - - - - -
User Interface App Example
An embedded OpenGL plugin window that communicates with the Chromium browser control via JavaScript calls. - View Page Source
You can make the square rotate! -
    -
  • Click the square with the left mouse button or click the Decrement Rotation button to decrement the rotation value.
  • -
  • Click the square with the right mouse button or click the Increment Rotation button to increment the rotation value.
  • -
  • Click the Reset Rotation button to reset the rotation value to zero.
  • -
-
- -
- -
- -
- Rotation Value: -
- - -
-
-
- - - diff --git a/cef1/tests/cefclient/res/xmlhttprequest.html b/cef1/tests/cefclient/res/xmlhttprequest.html deleted file mode 100644 index 638c63c82..000000000 --- a/cef1/tests/cefclient/res/xmlhttprequest.html +++ /dev/null @@ -1,19 +0,0 @@ - - - -
-URL: -
-
-
- - diff --git a/cef1/tests/cefclient/resource.h b/cef1/tests/cefclient/resource.h deleted file mode 100644 index fb28ac227..000000000 --- a/cef1/tests/cefclient/resource.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by cefclient.rc -// -#define BINARY 256 -#define IDC_MYICON 2 -#define IDD_CEFCLIENT_DIALOG 102 -#define IDS_APP_TITLE 103 -#define IDD_ABOUTBOX 103 -#define IDM_ABOUT 104 -#define IDM_EXIT 105 -#define IDI_CEFCLIENT 107 -#define IDI_SMALL 108 -#define IDC_CEFCLIENT 109 -#define IDR_MAINFRAME 128 -#define IDC_NAV_BACK 200 -#define IDC_NAV_FORWARD 201 -#define IDC_NAV_RELOAD 202 -#define IDC_NAV_STOP 203 -#define ID_WARN_CONSOLEMESSAGE 32000 -#define ID_WARN_DOWNLOADCOMPLETE 32001 -#define ID_WARN_DOWNLOADERROR 32002 -#define ID_FIND 32101 -#define ID_PRINT 32102 -#define ID_TESTS_DEVTOOLS_SHOW 32700 -#define ID_TESTS_DEVTOOLS_CLOSE 32701 -#define ID_TESTS_DOMACCESS 32702 -#define ID_TESTS_GETIMAGE 32703 -#define ID_TESTS_GETSOURCE 32704 -#define ID_TESTS_GETTEXT 32705 -#define ID_TESTS_JAVASCRIPT_EXECUTE 32706 -#define ID_TESTS_JAVASCRIPT_INVOKE 32707 -#define ID_TESTS_OSRAPP 32708 -#define ID_TESTS_OTHER_TESTS 32809 -#define ID_TESTS_PLUGIN_INFO 32810 -#define ID_TESTS_POPUP 32711 -#define ID_TESTS_REQUEST 32712 -#define ID_TESTS_TRANSPARENT_POPUP 32713 -#define ID_TESTS_TRANSPARENT_OSRAPP 32714 -#define ID_TESTS_WEBURLREQUEST 32715 -#define ID_TESTS_ZOOM_IN 32716 -#define ID_TESTS_ZOOM_OUT 32717 -#define ID_TESTS_ZOOM_RESET 32718 -#define IDC_STATIC -1 -#define IDS_BINDING 1000 -#define IDS_DIALOGS 1001 -#define IDS_DOMACCESS 1002 -#define IDS_EXTENSION 1003 -#define IDS_LOCALSTORAGE 1004 -#define IDS_LOGO 1005 -#define IDS_LOGOBALL 1006 -#define IDS_MODALDIALOG 1007 -#define IDS_MODALMAIN 1008 -#define IDS_OSRPLUGIN 1009 -#define IDS_OTHER_TESTS 1010 -#define IDS_PERFORMANCE 1011 -#define IDS_PLUGIN 1012 -#define IDS_TRANSPARENCY 1013 -#define IDS_UIPLUGIN 1014 -#define IDS_XMLHTTPREQUEST 1015 - -// Avoid files associated with MacOS -#define _X86_ - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 130 -#define _APS_NEXT_COMMAND_VALUE 32795 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 110 -#endif -#endif diff --git a/cef1/tests/cefclient/resource_util.h b/cef1/tests/cefclient/resource_util.h deleted file mode 100644 index d38830792..000000000 --- a/cef1/tests/cefclient/resource_util.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_RESOURCE_UTIL_H_ -#define CEF_TESTS_CEFCLIENT_RESOURCE_UTIL_H_ -#pragma once - -#include -#include "include/cef_stream.h" - -#if defined(OS_POSIX) -// Returns the directory containing resource files. -bool GetResourceDir(std::string& dir); -#endif - -// Retrieve a resource as a string. -bool LoadBinaryResource(const char* resource_name, std::string& resource_data); - -// Retrieve a resource as a steam reader. -CefRefPtr GetBinaryResourceReader(const char* resource_name); - -#endif // CEF_TESTS_CEFCLIENT_RESOURCE_UTIL_H_ diff --git a/cef1/tests/cefclient/resource_util_linux.cpp b/cef1/tests/cefclient/resource_util_linux.cpp deleted file mode 100644 index aa4f4a939..000000000 --- a/cef1/tests/cefclient/resource_util_linux.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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 "cefclient/resource_util.h" -#include -#include - -bool GetResourceDir(std::string& dir) { - char buff[1024]; - - // Retrieve the executable path. - ssize_t len = readlink("/proc/self/exe", buff, sizeof(buff)-1); - if (len == -1) - return false; - - buff[len] = 0; - - // Remove the executable name from the path. - char* pos = strrchr(buff, '/'); - if (!pos) - return false; - - // Add "files" to the path. - strcpy(pos+1, "files"); // NOLINT(runtime/printf) - dir = std::string(buff); - return true; -} diff --git a/cef1/tests/cefclient/resource_util_mac.mm b/cef1/tests/cefclient/resource_util_mac.mm deleted file mode 100644 index c4652a0cf..000000000 --- a/cef1/tests/cefclient/resource_util_mac.mm +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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 "cefclient/resource_util.h" -#import -#include -#include -#include "cefclient/util.h" - -namespace { - -bool AmIBundled() { - // Implementation adapted from Chromium's base/mac/foundation_util.mm - ProcessSerialNumber psn = {0, kCurrentProcess}; - - FSRef fsref; - OSStatus pbErr; - if ((pbErr = GetProcessBundleLocation(&psn, &fsref)) != noErr) { - ASSERT(false); - return false; - } - - FSCatalogInfo info; - OSErr fsErr; - if ((fsErr = FSGetCatalogInfo(&fsref, kFSCatInfoNodeFlags, &info, - NULL, NULL, NULL)) != noErr) { - ASSERT(false); - return false; - } - - return (info.nodeFlags & kFSNodeIsDirectoryMask); -} - -} // namespace - -bool GetResourceDir(std::string& dir) { - // Implementation adapted from Chromium's base/base_path_mac.mm - if (AmIBundled()) { - // Retrieve the executable directory. - uint32_t pathSize = 0; - _NSGetExecutablePath(NULL, &pathSize); - if (pathSize > 0) { - dir.resize(pathSize); - _NSGetExecutablePath(const_cast(dir.c_str()), &pathSize); - } - - // Trim executable name up to the last separator - std::string::size_type last_separator = dir.find_last_of("/"); - dir.resize(last_separator); - dir.append("/../Resources"); - return true; - } else { - // TODO: Provide unbundled path - ASSERT(false); - return false; - } -} diff --git a/cef1/tests/cefclient/resource_util_posix.cpp b/cef1/tests/cefclient/resource_util_posix.cpp deleted file mode 100644 index 68a4331f6..000000000 --- a/cef1/tests/cefclient/resource_util_posix.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "cefclient/resource_util.h" -#include - -namespace { - -bool FileExists(const char* path) { - FILE* f = fopen(path, "rb"); - if (f) { - fclose(f); - return true; - } - return false; -} - -bool ReadFileToString(const char* path, std::string& data) { - // Implementation adapted from base/file_util.cc - FILE* file = fopen(path, "rb"); - if (!file) - return false; - - char buf[1 << 16]; - size_t len; - while ((len = fread(buf, 1, sizeof(buf), file)) > 0) - data.append(buf, len); - fclose(file); - - return true; -} - -} // namespace - -bool LoadBinaryResource(const char* resource_name, std::string& resource_data) { - std::string path; - if (!GetResourceDir(path)) - return false; - - path.append("/"); - path.append(resource_name); - - return ReadFileToString(path.c_str(), resource_data); -} - -CefRefPtr GetBinaryResourceReader(const char* resource_name) { - std::string path; - if (!GetResourceDir(path)) - return NULL; - - path.append("/"); - path.append(resource_name); - - if (!FileExists(path.c_str())) - return NULL; - - return CefStreamReader::CreateForFile(path); -} diff --git a/cef1/tests/cefclient/resource_util_win.cpp b/cef1/tests/cefclient/resource_util_win.cpp deleted file mode 100644 index d8e39abdf..000000000 --- a/cef1/tests/cefclient/resource_util_win.cpp +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "cefclient/resource_util.h" -#include "include/cef_stream.h" -#include "include/wrapper/cef_byte_read_handler.h" -#include "cefclient/resource.h" -#include "cefclient/util.h" - -namespace { - -bool LoadBinaryResource(int binaryId, DWORD &dwSize, LPBYTE &pBytes) { - HINSTANCE hInst = GetModuleHandle(NULL); - HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(binaryId), - MAKEINTRESOURCE(256)); - if (hRes) { - HGLOBAL hGlob = LoadResource(hInst, hRes); - if (hGlob) { - dwSize = SizeofResource(hInst, hRes); - pBytes = (LPBYTE)LockResource(hGlob); - if (dwSize > 0 && pBytes) - return true; - } - } - - return false; -} - -int GetResourceId(const char* resource_name) { - // Map of resource labels to BINARY id values. - static struct _resource_map { - char* name; - int id; - } resource_map[] = { - {"binding.html", IDS_BINDING}, - {"dialogs.html", IDS_DIALOGS}, - {"domaccess.html", IDS_DOMACCESS}, - {"extension.html", IDS_EXTENSION}, - {"localstorage.html", IDS_LOCALSTORAGE}, - {"logo.png", IDS_LOGO}, - {"logoball.png", IDS_LOGOBALL}, - {"modaldialog.html", IDS_MODALDIALOG}, - {"modalmain.html", IDS_MODALMAIN}, - {"osrplugin.html", IDS_OSRPLUGIN}, - {"other_tests.html", IDS_OTHER_TESTS}, - {"performance.html", IDS_PERFORMANCE}, - {"plugin.html", IDS_PLUGIN}, - {"transparency.html", IDS_TRANSPARENCY}, - {"uiplugin.html", IDS_UIPLUGIN}, - {"xmlhttprequest.html", IDS_XMLHTTPREQUEST}, - }; - - for (int i = 0; i < sizeof(resource_map)/sizeof(_resource_map); ++i) { - if (!strcmp(resource_map[i].name, resource_name)) - return resource_map[i].id; - } - - return 0; -} - -} // namespace - -bool LoadBinaryResource(const char* resource_name, std::string& resource_data) { - int resource_id = GetResourceId(resource_name); - if (resource_id == 0) - return false; - - DWORD dwSize; - LPBYTE pBytes; - - if (LoadBinaryResource(resource_id, dwSize, pBytes)) { - resource_data = std::string(reinterpret_cast(pBytes), dwSize); - return true; - } - - ASSERT(FALSE); // The resource should be found. - return false; -} - -CefRefPtr GetBinaryResourceReader(const char* resource_name) { - int resource_id = GetResourceId(resource_name); - if (resource_id == 0) - return NULL; - - DWORD dwSize; - LPBYTE pBytes; - - if (LoadBinaryResource(resource_id, dwSize, pBytes)) { - return CefStreamReader::CreateForHandler( - new CefByteReadHandler(pBytes, dwSize, NULL)); - } - - ASSERT(FALSE); // The resource should be found. - return NULL; -} diff --git a/cef1/tests/cefclient/scheme_test.cpp b/cef1/tests/cefclient/scheme_test.cpp deleted file mode 100644 index c9a0c35b4..000000000 --- a/cef1/tests/cefclient/scheme_test.cpp +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "cefclient/scheme_test.h" -#include -#include -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "include/cef_response.h" -#include "include/cef_request.h" -#include "include/cef_scheme.h" -#include "cefclient/resource_util.h" -#include "cefclient/string_util.h" -#include "cefclient/util.h" - -namespace scheme_test { - -namespace { - -// Implementation of the schema handler for client:// requests. -class ClientSchemeHandler : public CefSchemeHandler { - public: - ClientSchemeHandler() : offset_(0) {} - - virtual bool ProcessRequest(CefRefPtr request, - CefRefPtr callback) - OVERRIDE { - REQUIRE_IO_THREAD(); - - bool handled = false; - - AutoLock lock_scope(this); - - std::string url = request->GetURL(); - if (strstr(url.c_str(), "handler.html") != NULL) { - // Build the response html - data_ = "Client Scheme Handler" - "This contents of this page page are served by the " - "ClientSchemeHandler class handling the client:// protocol." - "
You should see an image:" - "
";
-
-      // Output a string representation of the request
-      std::string dump;
-      DumpRequestContents(request, dump);
-      data_.append(dump);
-
-      data_.append("

Try the test form:" - "
" - "" - "" - "" - "
"); - - handled = true; - - // Set the resulting mime type - mime_type_ = "text/html"; - } else if (strstr(url.c_str(), "client.png") != NULL) { - // Load the response image - if (LoadBinaryResource("logo.png", data_)) { - handled = true; - // Set the resulting mime type - mime_type_ = "image/png"; - } - } - - if (handled) { - // Indicate the headers are available. - callback->HeadersAvailable(); - return true; - } - - return false; - } - - virtual void GetResponseHeaders(CefRefPtr response, - int64& response_length, - CefString& redirectUrl) OVERRIDE { - REQUIRE_IO_THREAD(); - - ASSERT(!data_.empty()); - - response->SetMimeType(mime_type_); - response->SetStatus(200); - - // Set the resulting response length - response_length = data_.length(); - } - - virtual void Cancel() OVERRIDE { - REQUIRE_IO_THREAD(); - } - - virtual bool ReadResponse(void* data_out, - int bytes_to_read, - int& bytes_read, - CefRefPtr callback) - OVERRIDE { - REQUIRE_IO_THREAD(); - - bool has_data = false; - bytes_read = 0; - - AutoLock lock_scope(this); - - if (offset_ < data_.length()) { - // Copy the next block of data into the buffer. - int transfer_size = - std::min(bytes_to_read, static_cast(data_.length() - offset_)); - memcpy(data_out, data_.c_str() + offset_, transfer_size); - offset_ += transfer_size; - - bytes_read = transfer_size; - has_data = true; - } - - return has_data; - } - - private: - std::string data_; - std::string mime_type_; - size_t offset_; - - IMPLEMENT_REFCOUNTING(ClientSchemeHandler); - IMPLEMENT_LOCKING(ClientSchemeHandler); -}; - -// Implementation of the factory for for creating schema handlers. -class ClientSchemeHandlerFactory : public CefSchemeHandlerFactory { - public: - // Return a new scheme handler instance to handle the request. - virtual CefRefPtr Create(CefRefPtr browser, - const CefString& scheme_name, - CefRefPtr request) - OVERRIDE { - REQUIRE_IO_THREAD(); - return new ClientSchemeHandler(); - } - - IMPLEMENT_REFCOUNTING(ClientSchemeHandlerFactory); -}; - -} // namespace - -void AddSchemes(CefRefPtr registrar) { - registrar->AddCustomScheme("client", true, false, false); -} - -void InitTest() { - CefRegisterSchemeHandlerFactory("client", "tests", - new ClientSchemeHandlerFactory()); -} - -} // namespace scheme_test diff --git a/cef1/tests/cefclient/scheme_test.h b/cef1/tests/cefclient/scheme_test.h deleted file mode 100644 index 83bed62db..000000000 --- a/cef1/tests/cefclient/scheme_test.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_SCHEME_TEST_H_ -#define CEF_TESTS_CEFCLIENT_SCHEME_TEST_H_ -#pragma once - -#include "include/cef_browser.h" -#include "include/cef_scheme.h" - -namespace scheme_test { - -void AddSchemes(CefRefPtr registrar); - -// Register the scheme handler. -void InitTest(); - -} // namespace scheme_test - -#endif // CEF_TESTS_CEFCLIENT_SCHEME_TEST_H_ diff --git a/cef1/tests/cefclient/string_util.cpp b/cef1/tests/cefclient/string_util.cpp deleted file mode 100644 index ebeca5c03..000000000 --- a/cef1/tests/cefclient/string_util.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework 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 "cefclient/string_util.h" -#include -#include -#include "include/cef_request.h" - -void DumpRequestContents(CefRefPtr request, std::string& str) { - std::stringstream ss; - - ss << "URL: " << std::string(request->GetURL()); - ss << "\nMethod: " << std::string(request->GetMethod()); - - CefRequest::HeaderMap headerMap; - request->GetHeaderMap(headerMap); - if (headerMap.size() > 0) { - ss << "\nHeaders:"; - CefRequest::HeaderMap::const_iterator it = headerMap.begin(); - for (; it != headerMap.end(); ++it) { - ss << "\n\t" << std::string((*it).first) << ": " << - std::string((*it).second); - } - } - - CefRefPtr postData = request->GetPostData(); - if (postData.get()) { - CefPostData::ElementVector elements; - postData->GetElements(elements); - if (elements.size() > 0) { - ss << "\nPost Data:"; - CefRefPtr element; - CefPostData::ElementVector::const_iterator it = elements.begin(); - for (; it != elements.end(); ++it) { - element = (*it); - if (element->GetType() == PDE_TYPE_BYTES) { - // the element is composed of bytes - ss << "\n\tBytes: "; - if (element->GetBytesCount() == 0) { - ss << "(empty)"; - } else { - // retrieve the data. - size_t size = element->GetBytesCount(); - char* bytes = new char[size]; - element->GetBytes(size, bytes); - ss << std::string(bytes, size); - delete [] bytes; - } - } else if (element->GetType() == PDE_TYPE_FILE) { - ss << "\n\tFile: " << std::string(element->GetFile()); - } - } - } - } - - str = ss.str(); -} - -std::string StringReplace(const std::string& str, const std::string& from, - const std::string& to) { - std::string result = str; - std::string::size_type pos = 0; - std::string::size_type from_len = from.length(); - std::string::size_type to_len = to.length(); - do { - pos = result.find(from, pos); - if (pos != std::string::npos) { - result.replace(pos, from_len, to); - pos += to_len; - } - } while (pos != std::string::npos); - return result; -} diff --git a/cef1/tests/cefclient/string_util.h b/cef1/tests/cefclient/string_util.h deleted file mode 100644 index c43e6f210..000000000 --- a/cef1/tests/cefclient/string_util.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_STRING_UTIL_H_ -#define CEF_TESTS_CEFCLIENT_STRING_UTIL_H_ -#pragma once - -#include -#include "include/cef_base.h" - -class CefRequest; - -// Dump the contents of the request into a string. -void DumpRequestContents(CefRefPtr request, std::string& str); - -// Replace all instances of |from| with |to| in |str|. -std::string StringReplace(const std::string& str, const std::string& from, - const std::string& to); - -#endif // CEF_TESTS_CEFCLIENT_STRING_UTIL_H_ diff --git a/cef1/tests/cefclient/uiplugin.cpp b/cef1/tests/cefclient/uiplugin.cpp deleted file mode 100644 index 7558defa3..000000000 --- a/cef1/tests/cefclient/uiplugin.cpp +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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 "cefclient/uiplugin.h" - -#if defined(OS_WIN) - -#include -#include -#include -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "cefclient/cefclient.h" - -// Initialized in NP_Initialize. -NPNetscapeFuncs* g_uibrowser = NULL; - -namespace { - -// Global values. -float g_rotationspeed = 0.0f; -float g_theta = 0.0f; - -// Class holding pointers for the client plugin window. -class ClientPlugin { - public: - ClientPlugin() { - hWnd = NULL; - hDC = NULL; - hRC = NULL; - } - - HWND hWnd; - HDC hDC; - HGLRC hRC; -}; - -// Forward declarations of functions included in this code module: -LRESULT CALLBACK PluginWndProc(HWND hWnd, UINT message, WPARAM wParam, - LPARAM lParam); -void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC); -void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC); - -NPError NPP_NewImpl(NPMIMEType plugin_type, NPP instance, uint16 mode, - int16 argc, char* argn[], char* argv[], - NPSavedData* saved) { - if (instance == NULL) - return NPERR_INVALID_INSTANCE_ERROR; - - ClientPlugin* plugin = new ClientPlugin; - instance->pdata = reinterpret_cast(plugin); - - return NPERR_NO_ERROR; -} - -NPError NPP_DestroyImpl(NPP instance, NPSavedData** save) { - ClientPlugin* plugin = reinterpret_cast(instance->pdata); - - if (plugin) { - if (plugin->hWnd) { - DestroyWindow(plugin->hWnd); - DisableOpenGL(plugin->hWnd, plugin->hDC, plugin->hRC); - } - delete plugin; - g_rotationspeed = 0.0f; - g_theta = 0.0f; - } - - return NPERR_NO_ERROR; -} - -NPError NPP_SetWindowImpl(NPP instance, NPWindow* window_info) { - if (instance == NULL) - return NPERR_INVALID_INSTANCE_ERROR; - - if (window_info == NULL) - return NPERR_GENERIC_ERROR; - - ClientPlugin* plugin = reinterpret_cast(instance->pdata); - HWND parent_hwnd = reinterpret_cast(window_info->window); - - if (plugin->hWnd == NULL) { - WNDCLASS wc; - HINSTANCE hInstance = GetModuleHandle(NULL); - - // Register the window class. - wc.style = CS_OWNDC; - wc.lpfnWndProc = PluginWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); - wc.lpszMenuName = NULL; - wc.lpszClassName = L"ClientUIPlugin"; - RegisterClass(&wc); - - // Create the main window. - plugin->hWnd = CreateWindow(L"ClientUIPlugin", L"Client UI Plugin", - WS_CHILD, 0, 0, 0, 0, parent_hwnd, NULL, hInstance, NULL); - - SetWindowLongPtr(plugin->hWnd, GWLP_USERDATA, - reinterpret_cast(plugin)); - - // Enable OpenGL drawing for the window. - EnableOpenGL(plugin->hWnd, &(plugin->hDC), &(plugin->hRC)); - } - - // Position the window and make sure it's visible. - RECT parent_rect; - GetClientRect(parent_hwnd, &parent_rect); - SetWindowPos(plugin->hWnd, NULL, parent_rect.left, parent_rect.top, - parent_rect.right - parent_rect.left, - parent_rect.bottom - parent_rect.top, SWP_SHOWWINDOW); - - UpdateWindow(plugin->hWnd); - ShowWindow(plugin->hWnd, SW_SHOW); - - return NPERR_NO_ERROR; -} - -// Send the notification to the browser as a JavaScript function call. -static void NotifyNewRotation(float value) { - std::stringstream buf; - buf << "notifyNewRotation(" << value << ");"; - AppGetBrowser()->GetMainFrame()->ExecuteJavaScript(buf.str(), CefString(), - 0); -} - -// Nice little fly polygon borrowed from the OpenGL Red Book. -const GLubyte fly[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x80, 0x01, 0xC0, 0x06, 0xC0, 0x03, 0x60, - 0x04, 0x60, 0x06, 0x20, 0x04, 0x30, 0x0C, 0x20, - 0x04, 0x18, 0x18, 0x20, 0x04, 0x0C, 0x30, 0x20, - 0x04, 0x06, 0x60, 0x20, 0x44, 0x03, 0xC0, 0x22, - 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, - 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, - 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, - 0x66, 0x01, 0x80, 0x66, 0x33, 0x01, 0x80, 0xCC, - 0x19, 0x81, 0x81, 0x98, 0x0C, 0xC1, 0x83, 0x30, - 0x07, 0xe1, 0x87, 0xe0, 0x03, 0x3f, 0xfc, 0xc0, - 0x03, 0x31, 0x8c, 0xc0, 0x03, 0x33, 0xcc, 0xc0, - 0x06, 0x64, 0x26, 0x60, 0x0c, 0xcc, 0x33, 0x30, - 0x18, 0xcc, 0x33, 0x18, 0x10, 0xc4, 0x23, 0x08, - 0x10, 0x63, 0xC6, 0x08, 0x10, 0x30, 0x0c, 0x08, - 0x10, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x08}; - - -// Plugin window procedure. -LRESULT CALLBACK PluginWndProc(HWND hWnd, UINT message, WPARAM wParam, - LPARAM lParam) { - ClientPlugin* plugin = - reinterpret_cast(GetWindowLongPtr(hWnd, GWLP_USERDATA)); - - switch (message) { - case WM_CREATE: - // Start the timer that's used for redrawing. - SetTimer(hWnd, 1, 1, NULL); - return 0; - - case WM_DESTROY: - // Stop the timer that's used for redrawing. - KillTimer(hWnd, 1); - return 0; - - case WM_LBUTTONDOWN: - // Decrement rotation speed. - ModifyRotation(-2.0f); - return 0; - - case WM_RBUTTONDOWN: - // Increment rotation speed. - ModifyRotation(2.0f); - return 0; - - case WM_SIZE: - if (plugin) { - // Resize the OpenGL viewport to match the window size. - int width = LOWORD(lParam); - int height = HIWORD(lParam); - - wglMakeCurrent(plugin->hDC, plugin->hRC); - glViewport(0, 0, width, height); - } - break; - - case WM_ERASEBKGND: - return 0; - - case WM_TIMER: - wglMakeCurrent(plugin->hDC, plugin->hRC); - - // Adjust the theta value and redraw the display when the timer fires. - glClearColor(1.0f, 1.0f, 1.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT); - - glPushMatrix(); - glEnable(GL_POLYGON_STIPPLE); - glPolygonStipple(fly); - - glRotatef(g_theta, 0.0f, 0.0f, 1.0f); - glBegin(GL_QUADS); - glColor3f(1.0f, 0.0f, 0.0f); - glVertex2f(0.7f, 0.7f); - glColor3f(0.0f, 1.0f, 0.0f); - glVertex2f(0.7f, -0.7f); - glColor3f(0.0f, 0.0f, 1.0f); - glVertex2f(-0.7f, -0.7f); - glColor3f(1.0f, 0.0f, 1.0f); - glVertex2f(-0.7f, 0.7f); - glEnd(); - - glDisable(GL_POLYGON_STIPPLE); - glPopMatrix(); - - SwapBuffers(plugin->hDC); - - g_theta -= g_rotationspeed; - } - - return DefWindowProc(hWnd, message, wParam, lParam); -} - -// Enable OpenGL. -void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC) { - PIXELFORMATDESCRIPTOR pfd; - int format; - - // Get the device context. - *hDC = GetDC(hWnd); - - // Set the pixel format for the DC. - ZeroMemory(&pfd, sizeof(pfd)); - pfd.nSize = sizeof(pfd); - pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; - pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = 24; - pfd.cDepthBits = 16; - pfd.iLayerType = PFD_MAIN_PLANE; - format = ChoosePixelFormat(*hDC, &pfd); - SetPixelFormat(*hDC, format, &pfd); - - // Create and enable the render contex. - *hRC = wglCreateContext(*hDC); -} - -// Disable OpenGL. -void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC) { - wglMakeCurrent(NULL, NULL); - wglDeleteContext(hRC); - ReleaseDC(hWnd, hDC); -} - -} // namespace - -NPError API_CALL NP_UIGetEntryPoints(NPPluginFuncs* pFuncs) { - pFuncs->newp = NPP_NewImpl; - pFuncs->destroy = NPP_DestroyImpl; - pFuncs->setwindow = NPP_SetWindowImpl; - return NPERR_NO_ERROR; -} - -NPError API_CALL NP_UIInitialize(NPNetscapeFuncs* pFuncs) { - g_uibrowser = pFuncs; - return NPERR_NO_ERROR; -} - -NPError API_CALL NP_UIShutdown(void) { - g_uibrowser = NULL; - return NPERR_NO_ERROR; -} - -void ModifyRotation(float value) { - g_rotationspeed += value; - NotifyNewRotation(g_rotationspeed); -} - -void ResetRotation() { - g_rotationspeed = 0.0; - NotifyNewRotation(g_rotationspeed); -} - -#endif // OS_WIN diff --git a/cef1/tests/cefclient/uiplugin.h b/cef1/tests/cefclient/uiplugin.h deleted file mode 100644 index 2ab18ca67..000000000 --- a/cef1/tests/cefclient/uiplugin.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2009 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2006-2008 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. - -// Portions of this implementation are borrowed from webkit\default_plugin\ -// plugin_impl.h - -#ifndef CEF_TESTS_CEFCLIENT_UIPLUGIN_H_ -#define CEF_TESTS_CEFCLIENT_UIPLUGIN_H_ -#pragma once - -#include "include/cef_nplugin.h" - -#if defined(OS_WIN) - -extern NPNetscapeFuncs* g_uibrowser; - -NPError API_CALL NP_UIGetEntryPoints(NPPluginFuncs* pFuncs); -NPError API_CALL NP_UIInitialize(NPNetscapeFuncs* pFuncs); -NPError API_CALL NP_UIShutdown(void); - -// Function called to modify the rotation value. -void ModifyRotation(float value); -// Function called to reset the rotation value. -void ResetRotation(); - -#endif // OS_WIN - -#endif // CEF_TESTS_CEFCLIENT_UIPLUGIN_H_ diff --git a/cef1/tests/cefclient/uiplugin_test.cpp b/cef1/tests/cefclient/uiplugin_test.cpp deleted file mode 100644 index e205d8f82..000000000 --- a/cef1/tests/cefclient/uiplugin_test.cpp +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework 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 "cefclient/uiplugin_test.h" -#include -#include "include/cef_browser.h" -#include "include/cef_frame.h" -#include "include/cef_v8.h" -#include "cefclient/uiplugin.h" -#include "cefclient/cefclient.h" - -namespace uiplugin_test { - -namespace { - -// Implementation of the V8 handler class for the "window.uiapp" functions. -class ClientV8UIHandler : public CefV8Handler { - public: - ClientV8UIHandler() {} - - // Execute with the specified argument list and return value. Return true if - // the method was handled. - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) { - if (name == "modifyRotation") { - // This function requires one argument. - if (arguments.size() != 1) - return false; - - float increment = 0.; - if (arguments[0]->IsInt()) { - // The argument is an integer value. - increment = static_cast(arguments[0]->GetIntValue()); - } else if (arguments[0]->IsDouble()) { - // The argument is an double value. - increment = static_cast(arguments[0]->GetDoubleValue()); - } - - if (increment != 0.) { - // Modify the rotation accordingly. - ModifyRotation(increment); - return true; - } - } else if (name == "resetRotation") { - // Reset the rotation value. - ResetRotation(); - return true; - } else if (name == "viewSource") { - // View the page source. - AppGetBrowser()->GetMainFrame()->ViewSource(); - return true; - } - - return false; - } - - IMPLEMENT_REFCOUNTING(ClientV8UIHandler); -}; - -} // namespace - -void InitTest() { - // Structure providing information about the client plugin. - CefPluginInfo plugin_info; - CefString(&plugin_info.display_name).FromASCII("Client UI Plugin"); - CefString(&plugin_info.unique_name).FromASCII("client_ui_plugin"); - CefString(&plugin_info.description).FromASCII("My Example Client UI Plugin"); - CefString(&plugin_info.mime_types).FromASCII( - "application/x-client-ui-plugin"); - - plugin_info.np_getentrypoints = NP_UIGetEntryPoints; - plugin_info.np_initialize = NP_UIInitialize; - plugin_info.np_shutdown = NP_UIShutdown; - - // Register the internal client plugin - CefRegisterPlugin(plugin_info); - - // Register a V8 extension with the below JavaScript code that calls native - // methods implemented in ClientV8UIHandler. - std::string code = "var cef;" - "if (!cef)" - " cef = {};" - "if (!cef.uiapp)" - " cef.uiapp = {};" - "(function() {" - " cef.uiapp.modifyRotation = function(val) {" - " native function modifyRotation();" - " return modifyRotation(val);" - " };" - " cef.uiapp.resetRotation = function() {" - " native function resetRotation();" - " return resetRotation();" - " };" - " cef.uiapp.viewSource = function() {" - " native function viewSource();" - " return viewSource();" - " };" - "})();"; - CefRegisterExtension("uiplugin/test", code, new ClientV8UIHandler()); -} - -} // namespace uiplugin_test \ No newline at end of file diff --git a/cef1/tests/cefclient/uiplugin_test.h b/cef1/tests/cefclient/uiplugin_test.h deleted file mode 100644 index f322abfb3..000000000 --- a/cef1/tests/cefclient/uiplugin_test.h +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_UIPLUGIN_TEST_H_ -#define CEF_TESTS_CEFCLIENT_UIPLUGIN_TEST_H_ -#pragma once - -namespace uiplugin_test { - -// Register the internal client plugin and V8 extension. -void InitTest(); - -} // namespace uiplugin_test - -#endif // CEF_TESTS_CEFCLIENT_UIPLUGIN_TEST_H_ diff --git a/cef1/tests/cefclient/util.h b/cef1/tests/cefclient/util.h deleted file mode 100644 index ba0305c1c..000000000 --- a/cef1/tests/cefclient/util.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef CEF_TESTS_CEFCLIENT_UTIL_H_ -#define CEF_TESTS_CEFCLIENT_UTIL_H_ -#pragma once - -#include "include/cef_task.h" - -#if defined(OS_WIN) - -#include // NOLINT(build/include_order) - -#ifndef NDEBUG -#define ASSERT(condition) if (!(condition)) { DebugBreak(); } -#else -#define ASSERT(condition) ((void)0) -#endif - -#else // !OS_WIN - -#include // NOLINT(build/include_order) - -#ifndef NDEBUG -#define ASSERT(condition) if (!(condition)) { assert(false); } -#else -#define ASSERT(condition) ((void)0) -#endif - -#endif // !OS_WIN - -#define REQUIRE_UI_THREAD() ASSERT(CefCurrentlyOn(TID_UI)); -#define REQUIRE_IO_THREAD() ASSERT(CefCurrentlyOn(TID_IO)); -#define REQUIRE_FILE_THREAD() ASSERT(CefCurrentlyOn(TID_FILE)); - -#endif // CEF_TESTS_CEFCLIENT_UTIL_H_ diff --git a/cef1/tests/unittests/command_line_unittest.cc b/cef1/tests/unittests/command_line_unittest.cc deleted file mode 100644 index 031432fe7..000000000 --- a/cef1/tests/unittests/command_line_unittest.cc +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "include/cef_command_line.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -void VerifyCommandLine(CefRefPtr command_line) { - std::string program = command_line->GetProgram(); - EXPECT_EQ("test.exe", program); - - EXPECT_TRUE(command_line->HasSwitches()); - - EXPECT_TRUE(command_line->HasSwitch("switch1")); - std::string switch1 = command_line->GetSwitchValue("switch1"); - EXPECT_EQ("", switch1); - EXPECT_TRUE(command_line->HasSwitch("switch2")); - std::string switch2 = command_line->GetSwitchValue("switch2"); - EXPECT_EQ("val2", switch2); - EXPECT_TRUE(command_line->HasSwitch("switch3")); - std::string switch3 = command_line->GetSwitchValue("switch3"); - EXPECT_EQ("val3", switch3); - EXPECT_TRUE(command_line->HasSwitch("switch4")); - std::string switch4 = command_line->GetSwitchValue("switch4"); - EXPECT_EQ("val 4", switch4); - EXPECT_FALSE(command_line->HasSwitch("switchnoexist")); - - CefCommandLine::SwitchMap switches; - command_line->GetSwitches(switches); - EXPECT_EQ((size_t)4, switches.size()); - - bool has1 = false, has2 = false, has3 = false, has4 = false; - - CefCommandLine::SwitchMap::const_iterator it = switches.begin(); - for (; it != switches.end(); ++it) { - std::string name = it->first; - std::string val = it->second; - - if (name == "switch1") { - has1 = true; - EXPECT_EQ("", val); - } else if (name == "switch2") { - has2 = true; - EXPECT_EQ("val2", val); - } else if (name == "switch3") { - has3 = true; - EXPECT_EQ("val3", val); - } else if (name == "switch4") { - has4 = true; - EXPECT_EQ("val 4", val); - } - } - - EXPECT_TRUE(has1); - EXPECT_TRUE(has2); - EXPECT_TRUE(has3); - EXPECT_TRUE(has4); - - EXPECT_TRUE(command_line->HasArguments()); - - CefCommandLine::ArgumentList args; - command_line->GetArguments(args); - EXPECT_EQ((size_t)2, args.size()); - std::string arg0 = args[0]; - EXPECT_EQ("arg1", arg0); - std::string arg1 = args[1]; - EXPECT_EQ("arg 2", arg1); -} - -} // namespace - -// Test creating a command line from argc/argv or string. -TEST(CommandLineTest, Init) { - CefRefPtr command_line = CefCommandLine::CreateCommandLine(); - EXPECT_TRUE(command_line.get() != NULL); - -#if defined(OS_WIN) - command_line->InitFromString("test.exe --switch1 -switch2=val2 /switch3=val3 " - "-switch4=\"val 4\" arg1 \"arg 2\""); -#else - const char* args[] = { - "test.exe", - "--switch1", - "-switch2=val2", - "-switch3=val3", - "-switch4=val 4", - "arg1", - "arg 2" - }; - command_line->InitFromArgv(sizeof(args) / sizeof(char*), args); -#endif - - VerifyCommandLine(command_line); -} - -// Test creating a command line using set and append methods. -TEST(CommandLineTest, Manual) { - CefRefPtr command_line = CefCommandLine::CreateCommandLine(); - EXPECT_TRUE(command_line.get() != NULL); - - command_line->SetProgram("test.exe"); - command_line->AppendSwitch("switch1"); - command_line->AppendSwitchWithValue("switch2", "val2"); - command_line->AppendSwitchWithValue("switch3", "val3"); - command_line->AppendSwitchWithValue("switch4", "val 4"); - command_line->AppendArgument("arg1"); - command_line->AppendArgument("arg 2"); - - VerifyCommandLine(command_line); -} diff --git a/cef1/tests/unittests/content_filter_unittest.cc b/cef1/tests/unittests/content_filter_unittest.cc deleted file mode 100644 index d155bcd4a..000000000 --- a/cef1/tests/unittests/content_filter_unittest.cc +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "include/cef_content_filter.h" -#include "tests/unittests/test_handler.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -bool g_ContentFilterTestHandlerHandleResourceResponseCalled; -bool g_ContentFilterProcessDataCalled; -bool g_ContentFilterDrainCalled; - -class TestContentFilter : public CefContentFilter { - public: - TestContentFilter() { - look_for_ = "FAILURE!"; - replace_with_ = "BIG SUCCESS!"; - } - - virtual void ProcessData(const void* data, int data_size, - CefRefPtr& substitute_data) - OVERRIDE { - EXPECT_TRUE(CefCurrentlyOn(TID_UI)); - - g_ContentFilterProcessDataCalled = true; - - std::string in_out(static_cast(data), data_size); - std::string::const_iterator look_for_it = look_for_.begin(); - - bool is_modified = false; - if (!remainder_.empty()) { - in_out.insert(in_out.begin(), remainder_.begin(), remainder_.end()); - remainder_.clear(); - } - - std::string::size_type off = 0; - do { - if ((look_for_it == look_for_.end()) || - (look_for_it == look_for_.begin())) { - // start over - off = in_out.find(look_for_[0], off); - if (off == in_out.npos) - break; - look_for_it = look_for_.begin(); - } - - while (look_for_it != look_for_.end()) { - if (*look_for_it != in_out[off]) { - look_for_it = look_for_.begin(); - break; - } - - if (++off == in_out.length()) - off = in_out.npos; - - if (off == in_out.npos) - break; - - look_for_it++; - } - - if (look_for_it == look_for_.end()) { - // found it - in_out.replace(in_out.begin() + off - look_for_.length(), - in_out.begin() + off, - replace_with_); - off += replace_with_.length() - look_for_.length(); - if (off >= in_out.length()) - off = in_out.npos; - - look_for_it = look_for_.begin(); - is_modified = true; - } - } while (off != in_out.npos); - - if (look_for_it != look_for_.begin()) { - // partial match at the end of the buffer - // save for next packet - size_t slice_off = - in_out.length() - (look_for_it - look_for_.begin()) - 1; - - remainder_ = in_out.substr(slice_off); - in_out.erase(slice_off); - } - - if (is_modified) { - substitute_data = CefStreamReader::CreateForData( - static_cast(const_cast(in_out.data())), - in_out.size()); - } - } - - virtual void Drain(CefRefPtr& remainder) OVERRIDE { - EXPECT_TRUE(CefCurrentlyOn(TID_UI)); - - g_ContentFilterDrainCalled = true; - - if (remainder_.empty()) - return; - - remainder = CefStreamReader::CreateForData( - static_cast(const_cast(remainder_.data())), - remainder_.size()); - } - - protected: - IMPLEMENT_REFCOUNTING(TestContentFilter); - - private: - std::string look_for_; - std::string replace_with_; - std::string remainder_; -}; - -class ContentFilterTestHandler : public TestHandler { - public: - class Visitor : public CefDOMVisitor { - public: - explicit Visitor(ContentFilterTestHandler* handler) : handler_(handler) {} - - // Test if the filter succeeded in modifying the content - void TestContentReplaced(CefRefPtr document) { - // Navigate the complete document structure. - CefRefPtr resultNode = - document->GetElementById("test_result"); - - EXPECT_TRUE(resultNode.get()); - EXPECT_EQ("BIG SUCCESS!", resultNode->GetElementInnerText().ToString()); - } - - virtual void Visit(CefRefPtr document) OVERRIDE { - EXPECT_TRUE(CefCurrentlyOn(TID_UI)); - - handler_->got_visitor_called_.yes(); - - TestContentReplaced(document); - - handler_->DestroyTest(); - } - - protected: - ContentFilterTestHandler* handler_; - IMPLEMENT_REFCOUNTING(Visitor); - }; - - ContentFilterTestHandler() { - visitor_ = new Visitor(this); - } - - virtual void RunTest() OVERRIDE { - std::string mainHtml = - "

If filtering works you should see BIG SUCCESS! below:

" - "
FAILURE!
"; - - AddResource("http://tests/test_filter.html", mainHtml, "text/html"); - CreateBrowser("http://tests/test_filter.html"); - } - - virtual void OnResourceResponse(CefRefPtr browser, - const CefString& url, - CefRefPtr response, - CefRefPtr& filter) - OVERRIDE { - EXPECT_TRUE(CefCurrentlyOn(TID_UI)); - - g_ContentFilterTestHandlerHandleResourceResponseCalled = true; - - ASSERT_EQ(url, "http://tests/test_filter.html"); - - CefResponse::HeaderMap headers; - response->GetHeaderMap(headers); - std::string mime_type = response->GetMimeType(); - int status_code = response->GetStatus(); - std::string status_text = response->GetStatusText(); - - ASSERT_TRUE(headers.empty()); - ASSERT_EQ(mime_type, "text/html"); - ASSERT_EQ(status_code, 200); - ASSERT_EQ(status_text, "OK"); - - filter = new TestContentFilter(); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - EXPECT_TRUE(CefCurrentlyOn(TID_UI)); - - if (frame->IsMain()) { - // The page is done loading so visit the DOM. - browser->GetMainFrame()->VisitDOM(visitor_.get()); - } - } - - TrackCallback got_visitor_called_; - - private: - CefRefPtr visitor_; -}; - -} // namespace - -// Verify send and recieve -TEST(ContentFilterTest, ContentFilter) { - g_ContentFilterTestHandlerHandleResourceResponseCalled = false; - g_ContentFilterProcessDataCalled = false; - g_ContentFilterDrainCalled = false; - - CefRefPtr handler = - new ContentFilterTestHandler(); - handler->ExecuteTest(); - - ASSERT_TRUE(handler->got_visitor_called_); - ASSERT_TRUE(g_ContentFilterTestHandlerHandleResourceResponseCalled); - ASSERT_TRUE(g_ContentFilterProcessDataCalled); - ASSERT_TRUE(g_ContentFilterDrainCalled); -} diff --git a/cef1/tests/unittests/cookie_unittest.cc b/cef1/tests/unittests/cookie_unittest.cc deleted file mode 100644 index fbef0662b..000000000 --- a/cef1/tests/unittests/cookie_unittest.cc +++ /dev/null @@ -1,961 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 -#include "include/cef_cookie.h" -#include "include/cef_runnable.h" -#include "include/cef_scheme.h" -#include "tests/unittests/test_handler.h" -#include "tests/unittests/test_suite.h" -#include "base/files/scoped_temp_dir.h" -#include "base/synchronization/waitable_event.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -const char* kTestUrl = "http://www.test.com/path/to/cookietest/foo.html"; -const char* kTestDomain = "www.test.com"; -const char* kTestPath = "/path/to/cookietest"; - -typedef std::vector CookieVector; - -void IOT_Set(CefRefPtr manager, - const CefString& url, CookieVector* cookies, - base::WaitableEvent* event) { - CookieVector::const_iterator it = cookies->begin(); - for (; it != cookies->end(); ++it) - EXPECT_TRUE(manager->SetCookie(url, *it)); - event->Signal(); -} - -void IOT_Delete(CefRefPtr manager, - const CefString& url, const CefString& cookie_name, - base::WaitableEvent* event) { - EXPECT_TRUE(manager->DeleteCookies(url, cookie_name)); - event->Signal(); -} - -class TestVisitor : public CefCookieVisitor { - public: - TestVisitor(CookieVector* cookies, bool deleteCookies, - base::WaitableEvent* event) - : cookies_(cookies), - delete_cookies_(deleteCookies), - event_(event) { - } - virtual ~TestVisitor() { - event_->Signal(); - } - - virtual bool Visit(const CefCookie& cookie, int count, int total, - bool& deleteCookie) { - cookies_->push_back(cookie); - if (delete_cookies_) - deleteCookie = true; - return true; - } - - CookieVector* cookies_; - bool delete_cookies_; - base::WaitableEvent* event_; - - IMPLEMENT_REFCOUNTING(TestVisitor); -}; - -// Set the cookies. -void SetCookies(CefRefPtr manager, - const CefString& url, CookieVector& cookies, - base::WaitableEvent& event) { - CefPostTask(TID_IO, NewCefRunnableFunction(IOT_Set, manager, url, - &cookies, &event)); - event.Wait(); -} - -// Delete the cookie. -void DeleteCookies(CefRefPtr manager, - const CefString& url, const CefString& cookie_name, - base::WaitableEvent& event) { - CefPostTask(TID_IO, NewCefRunnableFunction(IOT_Delete, manager, url, - cookie_name, &event)); - event.Wait(); -} - -// Create a test cookie. If |withDomain| is true a domain cookie will be -// created, otherwise a host cookie will be created. -void CreateCookie(CefRefPtr manager, - CefCookie& cookie, bool withDomain, - base::WaitableEvent& event) { - CefString(&cookie.name).FromASCII("my_cookie"); - CefString(&cookie.value).FromASCII("My Value"); - if (withDomain) - CefString(&cookie.domain).FromASCII(kTestDomain); - CefString(&cookie.path).FromASCII(kTestPath); - cookie.has_expires = true; - cookie.expires.year = 2200; - cookie.expires.month = 4; - cookie.expires.day_of_week = 5; - cookie.expires.day_of_month = 11; - - CookieVector cookies; - cookies.push_back(cookie); - - SetCookies(manager, kTestUrl, cookies, event); -} - -// Retrieve the test cookie. If |withDomain| is true check that the cookie -// is a domain cookie, otherwise a host cookie. if |deleteCookies| is true -// the cookie will be deleted when it's retrieved. -void GetCookie(CefRefPtr manager, - const CefCookie& cookie, bool withDomain, - base::WaitableEvent& event, bool deleteCookies) { - CookieVector cookies; - - // Get the cookie and delete it. - EXPECT_TRUE(manager->VisitUrlCookies(kTestUrl, false, - new TestVisitor(&cookies, deleteCookies, &event))); - event.Wait(); - - EXPECT_EQ((CookieVector::size_type)1, cookies.size()); - - const CefCookie& cookie_read = cookies[0]; - EXPECT_EQ(CefString(&cookie_read.name), "my_cookie"); - EXPECT_EQ(CefString(&cookie_read.value), "My Value"); - if (withDomain) - EXPECT_EQ(CefString(&cookie_read.domain), ".www.test.com"); - else - EXPECT_EQ(CefString(&cookie_read.domain), kTestDomain); - EXPECT_EQ(CefString(&cookie_read.path), kTestPath); - EXPECT_TRUE(cookie_read.has_expires); - EXPECT_EQ(cookie.expires.year, cookie_read.expires.year); - EXPECT_EQ(cookie.expires.month, cookie_read.expires.month); - EXPECT_EQ(cookie.expires.day_of_week, cookie_read.expires.day_of_week); - EXPECT_EQ(cookie.expires.day_of_month, cookie_read.expires.day_of_month); - EXPECT_EQ(cookie.expires.hour, cookie_read.expires.hour); - EXPECT_EQ(cookie.expires.minute, cookie_read.expires.minute); - EXPECT_EQ(cookie.expires.second, cookie_read.expires.second); - EXPECT_EQ(cookie.expires.millisecond, cookie_read.expires.millisecond); -} - -// Visit URL cookies. -void VisitUrlCookies(CefRefPtr manager, - const CefString& url, - bool includeHttpOnly, - CookieVector& cookies, - bool deleteCookies, - base::WaitableEvent& event) { - EXPECT_TRUE(manager->VisitUrlCookies(url, includeHttpOnly, - new TestVisitor(&cookies, deleteCookies, &event))); - event.Wait(); -} - -// Visit all cookies. -void VisitAllCookies(CefRefPtr manager, - CookieVector& cookies, - bool deleteCookies, - base::WaitableEvent& event) { - EXPECT_TRUE(manager->VisitAllCookies( - new TestVisitor(&cookies, deleteCookies, &event))); - event.Wait(); -} - -// Verify that no cookies exist. If |withUrl| is true it will only check for -// cookies matching the URL. -void VerifyNoCookies(CefRefPtr manager, - base::WaitableEvent& event, bool withUrl) { - CookieVector cookies; - - // Verify that the cookie has been deleted. - if (withUrl) { - EXPECT_TRUE(manager->VisitUrlCookies(kTestUrl, false, - new TestVisitor(&cookies, false, &event))); - } else { - EXPECT_TRUE(manager->VisitAllCookies( - new TestVisitor(&cookies, false, &event))); - } - event.Wait(); - - EXPECT_EQ((CookieVector::size_type)0, cookies.size()); -} - -// Delete all system cookies. -void DeleteAllCookies(CefRefPtr manager, - base::WaitableEvent& event) { - CefPostTask(TID_IO, NewCefRunnableFunction(IOT_Delete, manager, CefString(), - CefString(), &event)); - event.Wait(); -} - -void TestDomainCookie(CefRefPtr manager) { - base::WaitableEvent event(false, false); - CefCookie cookie; - - // Create a domain cookie. - CreateCookie(manager, cookie, true, event); - - // Retrieve, verify and delete the domain cookie. - GetCookie(manager, cookie, true, event, true); - - // Verify that the cookie was deleted. - VerifyNoCookies(manager, event, true); -} - -void TestHostCookie(CefRefPtr manager) { - base::WaitableEvent event(false, false); - CefCookie cookie; - - // Create a host cookie. - CreateCookie(manager, cookie, false, event); - - // Retrieve, verify and delete the host cookie. - GetCookie(manager, cookie, false, event, true); - - // Verify that the cookie was deleted. - VerifyNoCookies(manager, event, true); -} - -void TestMultipleCookies(CefRefPtr manager) { - base::WaitableEvent event(false, false); - std::stringstream ss; - int i; - - CookieVector cookies; - - const int kNumCookies = 4; - - // Create the cookies. - for (i = 0; i < kNumCookies; i++) { - CefCookie cookie; - - ss << "my_cookie" << i; - CefString(&cookie.name).FromASCII(ss.str().c_str()); - ss.str(""); - ss << "My Value " << i; - CefString(&cookie.value).FromASCII(ss.str().c_str()); - ss.str(""); - - cookies.push_back(cookie); - } - - // Set the cookies. - SetCookies(manager, kTestUrl, cookies, event); - cookies.clear(); - - // Get the cookies without deleting them. - VisitUrlCookies(manager, kTestUrl, false, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)kNumCookies, cookies.size()); - - CookieVector::const_iterator it = cookies.begin(); - for (i = 0; it != cookies.end(); ++it, ++i) { - const CefCookie& cookie = *it; - - ss << "my_cookie" << i; - EXPECT_EQ(CefString(&cookie.name), ss.str()); - ss.str(""); - ss << "My Value " << i; - EXPECT_EQ(CefString(&cookie.value), ss.str()); - ss.str(""); - } - - cookies.clear(); - - // Delete the 2nd cookie. - DeleteCookies(manager, kTestUrl, CefString("my_cookie1"), event); - - // Verify that the cookie has been deleted. - VisitUrlCookies(manager, kTestUrl, false, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)3, cookies.size()); - EXPECT_EQ(CefString(&cookies[0].name), "my_cookie0"); - EXPECT_EQ(CefString(&cookies[1].name), "my_cookie2"); - EXPECT_EQ(CefString(&cookies[2].name), "my_cookie3"); - - cookies.clear(); - - // Delete the rest of the cookies. - DeleteCookies(manager, kTestUrl, CefString(), event); - - // Verify that the cookies have been deleted. - VisitUrlCookies(manager, kTestUrl, false, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)0, cookies.size()); - - // Create the cookies. - for (i = 0; i < kNumCookies; i++) { - CefCookie cookie; - - ss << "my_cookie" << i; - CefString(&cookie.name).FromASCII(ss.str().c_str()); - ss.str(""); - ss << "My Value " << i; - CefString(&cookie.value).FromASCII(ss.str().c_str()); - ss.str(""); - - cookies.push_back(cookie); - } - - // Delete all of the cookies using the visitor. - VisitUrlCookies(manager, kTestUrl, false, cookies, true, event); - - cookies.clear(); - - // Verify that the cookies have been deleted. - VisitUrlCookies(manager, kTestUrl, false, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)0, cookies.size()); -} - -void TestAllCookies(CefRefPtr manager) { - base::WaitableEvent event(false, false); - CookieVector cookies; - - // Delete all system cookies just in case something is left over from a - // different test. - DeleteCookies(manager, CefString(), CefString(), event); - - // Verify that all system cookies have been deleted. - VisitAllCookies(manager, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)0, cookies.size()); - - // Create cookies with 2 separate hosts. - CefCookie cookie1; - const char* kUrl1 = "http://www.foo.com"; - CefString(&cookie1.name).FromASCII("my_cookie1"); - CefString(&cookie1.value).FromASCII("My Value 1"); - - cookies.push_back(cookie1); - SetCookies(manager, kUrl1, cookies, event); - cookies.clear(); - - CefCookie cookie2; - const char* kUrl2 = "http://www.bar.com"; - CefString(&cookie2.name).FromASCII("my_cookie2"); - CefString(&cookie2.value).FromASCII("My Value 2"); - - cookies.push_back(cookie2); - SetCookies(manager, kUrl2, cookies, event); - cookies.clear(); - - // Verify that all system cookies can be retrieved. - VisitAllCookies(manager, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)2, cookies.size()); - EXPECT_EQ(CefString(&cookies[0].name), "my_cookie1"); - EXPECT_EQ(CefString(&cookies[0].value), "My Value 1"); - EXPECT_EQ(CefString(&cookies[0].domain), "www.foo.com"); - EXPECT_EQ(CefString(&cookies[1].name), "my_cookie2"); - EXPECT_EQ(CefString(&cookies[1].value), "My Value 2"); - EXPECT_EQ(CefString(&cookies[1].domain), "www.bar.com"); - cookies.clear(); - - // Verify that the cookies can be retrieved separately. - VisitUrlCookies(manager, kUrl1, false, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)1, cookies.size()); - EXPECT_EQ(CefString(&cookies[0].name), "my_cookie1"); - EXPECT_EQ(CefString(&cookies[0].value), "My Value 1"); - EXPECT_EQ(CefString(&cookies[0].domain), "www.foo.com"); - cookies.clear(); - - VisitUrlCookies(manager, kUrl2, false, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)1, cookies.size()); - EXPECT_EQ(CefString(&cookies[0].name), "my_cookie2"); - EXPECT_EQ(CefString(&cookies[0].value), "My Value 2"); - EXPECT_EQ(CefString(&cookies[0].domain), "www.bar.com"); - cookies.clear(); - - // Delete all of the system cookies. - DeleteAllCookies(manager, event); - - // Verify that all system cookies have been deleted. - VerifyNoCookies(manager, event, false); -} - -void TestChangeDirectory(CefRefPtr manager, - const CefString& original_dir) { - base::WaitableEvent event(false, false); - CefCookie cookie; - - base::ScopedTempDir temp_dir; - - // Create a new temporary directory. - EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); - - // Delete all of the system cookies. - DeleteAllCookies(manager, event); - - // Set the new temporary directory as the storage location. - EXPECT_TRUE(manager->SetStoragePath(temp_dir.path().value())); - - // Wait for the storage location change to complete on the IO thread. - WaitForIOThread(); - - // Verify that no cookies exist. - VerifyNoCookies(manager, event, true); - - // Create a domain cookie. - CreateCookie(manager, cookie, true, event); - - // Retrieve and verify the domain cookie. - GetCookie(manager, cookie, true, event, false); - - // Restore the original storage location. - EXPECT_TRUE(manager->SetStoragePath(original_dir)); - - // Wait for the storage location change to complete on the IO thread. - WaitForIOThread(); - - // Verify that no cookies exist. - VerifyNoCookies(manager, event, true); - - // Set the new temporary directory as the storage location. - EXPECT_TRUE(manager->SetStoragePath(temp_dir.path().value())); - - // Wait for the storage location change to complete on the IO thread. - WaitForIOThread(); - - // Retrieve and verify the domain cookie that was set previously. - GetCookie(manager, cookie, true, event, false); - - // Restore the original storage location. - EXPECT_TRUE(manager->SetStoragePath(original_dir)); - - // Wait for the storage location change to complete on the IO thread. - WaitForIOThread(); -} - -} // namespace - -// Test creation of a domain cookie. -TEST(CookieTest, DomainCookieGlobal) { - CefRefPtr manager = CefCookieManager::GetGlobalManager(); - EXPECT_TRUE(manager.get()); - - TestDomainCookie(manager); -} - -// Test creation of a domain cookie. -TEST(CookieTest, DomainCookieInMemory) { - CefRefPtr manager = - CefCookieManager::CreateManager(CefString()); - EXPECT_TRUE(manager.get()); - - TestDomainCookie(manager); -} - -// Test creation of a domain cookie. -TEST(CookieTest, DomainCookieOnDisk) { - base::ScopedTempDir temp_dir; - - // Create a new temporary directory. - EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); - - CefRefPtr manager = - CefCookieManager::CreateManager(temp_dir.path().value()); - EXPECT_TRUE(manager.get()); - - TestDomainCookie(manager); -} - -// Test creation of a host cookie. -TEST(CookieTest, HostCookieGlobal) { - CefRefPtr manager = CefCookieManager::GetGlobalManager(); - EXPECT_TRUE(manager.get()); - - TestHostCookie(manager); -} - -// Test creation of a host cookie. -TEST(CookieTest, HostCookieInMemory) { - CefRefPtr manager = - CefCookieManager::CreateManager(CefString()); - EXPECT_TRUE(manager.get()); - - TestHostCookie(manager); -} - -// Test creation of a host cookie. -TEST(CookieTest, HostCookieOnDisk) { - base::ScopedTempDir temp_dir; - - // Create a new temporary directory. - EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); - - CefRefPtr manager = - CefCookieManager::CreateManager(temp_dir.path().value()); - EXPECT_TRUE(manager.get()); - - TestHostCookie(manager); -} - -// Test creation of multiple cookies. -TEST(CookieTest, MultipleCookiesGlobal) { - CefRefPtr manager = CefCookieManager::GetGlobalManager(); - EXPECT_TRUE(manager.get()); - - TestMultipleCookies(manager); -} - -// Test creation of multiple cookies. -TEST(CookieTest, MultipleCookiesInMemory) { - CefRefPtr manager = - CefCookieManager::CreateManager(CefString()); - EXPECT_TRUE(manager.get()); - - TestMultipleCookies(manager); -} - -// Test creation of multiple cookies. -TEST(CookieTest, MultipleCookiesOnDisk) { - base::ScopedTempDir temp_dir; - - // Create a new temporary directory. - EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); - - CefRefPtr manager = - CefCookieManager::CreateManager(temp_dir.path().value()); - EXPECT_TRUE(manager.get()); - - TestMultipleCookies(manager); -} - -TEST(CookieTest, AllCookiesGlobal) { - CefRefPtr manager = CefCookieManager::GetGlobalManager(); - EXPECT_TRUE(manager.get()); - - TestAllCookies(manager); -} - -TEST(CookieTest, AllCookiesInMemory) { - CefRefPtr manager = - CefCookieManager::CreateManager(CefString()); - EXPECT_TRUE(manager.get()); - - TestAllCookies(manager); -} - -TEST(CookieTest, AllCookiesOnDisk) { - base::ScopedTempDir temp_dir; - - // Create a new temporary directory. - EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); - - CefRefPtr manager = - CefCookieManager::CreateManager(temp_dir.path().value()); - EXPECT_TRUE(manager.get()); - - TestAllCookies(manager); -} - -TEST(CookieTest, ChangeDirectoryGlobal) { - CefRefPtr manager = CefCookieManager::GetGlobalManager(); - EXPECT_TRUE(manager.get()); - - std::string cache_path; - CefTestSuite::GetCachePath(cache_path); - - TestChangeDirectory(manager, cache_path); -} - -TEST(CookieTest, ChangeDirectoryCreated) { - CefRefPtr manager = - CefCookieManager::CreateManager(CefString()); - EXPECT_TRUE(manager.get()); - - TestChangeDirectory(manager, CefString()); -} - - -namespace { - -const char* kCookieJSUrl1 = "http://tests/cookie1.html"; -const char* kCookieJSUrl2 = "http://tests/cookie2.html"; - -class CookieTestJSHandler : public TestHandler { - public: - CookieTestJSHandler() {} - - virtual void RunTest() OVERRIDE { - // Create =new in-memory managers. - manager1_ = CefCookieManager::CreateManager(CefString()); - manager2_ = CefCookieManager::CreateManager(CefString()); - - std::string page = - "" - "" - "COOKIE TEST1"; - AddResource(kCookieJSUrl1, page, "text/html"); - - page = - "" - "" - "COOKIE TEST2"; - AddResource(kCookieJSUrl2, page, "text/html"); - - // Create the browser - CreateBrowser(kCookieJSUrl1); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - std::string url = frame->GetURL(); - if (url == kCookieJSUrl1) { - got_load_end1_.yes(); - VerifyCookie(manager1_, url, "name1", "value1", got_cookie1_); - - // Go to the next URL - frame->LoadURL(kCookieJSUrl2); - } else { - got_load_end2_.yes(); - VerifyCookie(manager2_, url, "name2", "value2", got_cookie2_); - - DestroyTest(); - } - } - - virtual CefRefPtr GetCookieManager( - CefRefPtr browser, - const CefString& main_url) OVERRIDE { - if (main_url == kCookieJSUrl1) { - // Return the first cookie manager. - got_cookie_manager1_.yes(); - return manager1_; - } else { - // Return the second cookie manager. - got_cookie_manager2_.yes(); - return manager2_; - } - } - - // Verify that the cookie was set successfully. - void VerifyCookie(CefRefPtr manager, - const std::string& url, - const std::string& name, - const std::string& value, - TrackCallback& callback) { - base::WaitableEvent event(false, false); - CookieVector cookies; - - // Get the cookie. - VisitUrlCookies(manager, url, false, cookies, false, event); - - if (cookies.size() == 1 && CefString(&cookies[0].name) == name && - CefString(&cookies[0].value) == value) { - callback.yes(); - } - } - - CefRefPtr manager1_; - CefRefPtr manager2_; - - TrackCallback got_cookie_manager1_; - TrackCallback got_cookie_manager2_; - TrackCallback got_load_end1_; - TrackCallback got_load_end2_; - TrackCallback got_cookie1_; - TrackCallback got_cookie2_; -}; - -} // namespace - -// Verify use of multiple cookie managers vis JS. -TEST(CookieTest, GetCookieManagerJS) { - CefRefPtr handler = new CookieTestJSHandler(); - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_cookie_manager1_); - EXPECT_TRUE(handler->got_cookie_manager2_); - EXPECT_TRUE(handler->got_load_end1_); - EXPECT_TRUE(handler->got_load_end2_); - EXPECT_TRUE(handler->got_cookie1_); - EXPECT_TRUE(handler->got_cookie2_); -} - - -namespace { - -class CookieTestSchemeHandler : public TestHandler { - public: - class SchemeHandler : public CefSchemeHandler { - public: - explicit SchemeHandler(CookieTestSchemeHandler* handler) - : handler_(handler), - offset_(0) {} - - virtual bool ProcessRequest(CefRefPtr request, - CefRefPtr callback) - OVERRIDE { - std::string url = request->GetURL(); - if (url == handler_->url1_) { - content_ = "COOKIE TEST1"; - cookie_ = "name1=value1"; - handler_->got_process_request1_.yes(); - } else if (url == handler_->url2_) { - content_ = "COOKIE TEST2"; - cookie_ = "name2=value2"; - handler_->got_process_request2_.yes(); - } else if (url == handler_->url3_) { - content_ = "COOKIE TEST3"; - handler_->got_process_request3_.yes(); - - // Verify that the cookie was passed in. - CefRequest::HeaderMap headerMap; - request->GetHeaderMap(headerMap); - CefRequest::HeaderMap::iterator it = headerMap.find("Cookie"); - if (it != headerMap.end() && it->second == "name2=value2") - handler_->got_process_request_cookie_.yes(); - - } - callback->HeadersAvailable(); - return true; - } - - virtual void GetResponseHeaders(CefRefPtr response, - int64& response_length, - CefString& redirectUrl) OVERRIDE { - response_length = content_.size(); - - response->SetStatus(200); - response->SetMimeType("text/html"); - - if (!cookie_.empty()) { - CefResponse::HeaderMap headerMap; - response->GetHeaderMap(headerMap); - headerMap.insert(std::make_pair("Set-Cookie", cookie_)); - response->SetHeaderMap(headerMap); - } - } - - virtual bool ReadResponse(void* data_out, - int bytes_to_read, - int& bytes_read, - CefRefPtr callback) - OVERRIDE { - bool has_data = false; - bytes_read = 0; - - size_t size = content_.size(); - if (offset_ < size) { - int transfer_size = - std::min(bytes_to_read, static_cast(size - offset_)); - memcpy(data_out, content_.c_str() + offset_, transfer_size); - offset_ += transfer_size; - - bytes_read = transfer_size; - has_data = true; - } - - return has_data; - } - - virtual void Cancel() OVERRIDE { - } - - private: - CookieTestSchemeHandler* handler_; - std::string content_; - size_t offset_; - std::string cookie_; - - IMPLEMENT_REFCOUNTING(SchemeHandler); - }; - - class SchemeHandlerFactory : public CefSchemeHandlerFactory { - public: - explicit SchemeHandlerFactory(CookieTestSchemeHandler* handler) - : handler_(handler) {} - - virtual CefRefPtr Create(CefRefPtr browser, - const CefString& scheme_name, - CefRefPtr request) - OVERRIDE { - std::string url = request->GetURL(); - if (url == handler_->url3_) { - // Verify that the cookie was not passed in. - CefRequest::HeaderMap headerMap; - request->GetHeaderMap(headerMap); - CefRequest::HeaderMap::iterator it = headerMap.find("Cookie"); - if (it != headerMap.end() && it->second == "name2=value2") - handler_->got_create_cookie_.yes(); - } - - return new SchemeHandler(handler_); - } - - private: - CookieTestSchemeHandler* handler_; - - IMPLEMENT_REFCOUNTING(SchemeHandlerFactory); - }; - - CookieTestSchemeHandler(const std::string& scheme) : scheme_(scheme) { - url1_ = scheme + "://cookie-tests/cookie1.html"; - url2_ = scheme + "://cookie-tests/cookie2.html"; - url3_ = scheme + "://cookie-tests/cookie3.html"; - } - - virtual void RunTest() OVERRIDE { - // Create new in-memory managers. - manager1_ = CefCookieManager::CreateManager(CefString()); - manager2_ = CefCookieManager::CreateManager(CefString()); - - if (scheme_ != "http") { - std::vector schemes; - schemes.push_back("http"); - schemes.push_back("https"); - schemes.push_back(scheme_); - - manager1_->SetSupportedSchemes(schemes); - manager2_->SetSupportedSchemes(schemes); - } - - // Register the scheme handler. - CefRegisterSchemeHandlerFactory(scheme_, "cookie-tests", - new SchemeHandlerFactory(this)); - - // Create the browser - CreateBrowser(url1_); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - std::string url = frame->GetURL(); - if (url == url1_) { - got_load_end1_.yes(); - VerifyCookie(manager1_, url, "name1", "value1", got_cookie1_); - - // Go to the next URL - frame->LoadURL(url2_); - } else if (url == url2_) { - got_load_end2_.yes(); - VerifyCookie(manager2_, url, "name2", "value2", got_cookie2_); - - // Go to the next URL - frame->LoadURL(url3_); - } else { - got_load_end3_.yes(); - VerifyCookie(manager2_, url, "name2", "value2", got_cookie3_); - - // Unregister the scheme handler. - CefRegisterSchemeHandlerFactory(scheme_, "cookie-tests", NULL); - - DestroyTest(); - } - } - - virtual CefRefPtr GetCookieManager( - CefRefPtr browser, - const CefString& main_url) OVERRIDE { - if (main_url == url1_) { - // Return the first cookie manager. - got_cookie_manager1_.yes(); - return manager1_; - } else { - // Return the second cookie manager. - got_cookie_manager2_.yes(); - return manager2_; - } - } - - // Verify that the cookie was set successfully. - void VerifyCookie(CefRefPtr manager, - const std::string& url, - const std::string& name, - const std::string& value, - TrackCallback& callback) { - base::WaitableEvent event(false, false); - CookieVector cookies; - - // Get the cookie. - VisitUrlCookies(manager, url, false, cookies, false, event); - - if (cookies.size() == 1 && CefString(&cookies[0].name) == name && - CefString(&cookies[0].value) == value) { - callback.yes(); - } - } - - std::string scheme_; - std::string url1_; - std::string url2_; - std::string url3_; - - CefRefPtr manager1_; - CefRefPtr manager2_; - - TrackCallback got_process_request1_; - TrackCallback got_process_request2_; - TrackCallback got_process_request3_; - TrackCallback got_create_cookie_; - TrackCallback got_process_request_cookie_; - TrackCallback got_cookie_manager1_; - TrackCallback got_cookie_manager2_; - TrackCallback got_load_end1_; - TrackCallback got_load_end2_; - TrackCallback got_load_end3_; - TrackCallback got_cookie1_; - TrackCallback got_cookie2_; - TrackCallback got_cookie3_; -}; - -} // namespace - -// Verify use of multiple cookie managers via HTTP. -TEST(CookieTest, GetCookieManagerHttp) { - CefRefPtr handler = - new CookieTestSchemeHandler("http"); - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_process_request1_); - EXPECT_TRUE(handler->got_process_request2_); - EXPECT_TRUE(handler->got_process_request3_); - EXPECT_FALSE(handler->got_create_cookie_); - EXPECT_TRUE(handler->got_process_request_cookie_); - EXPECT_TRUE(handler->got_cookie_manager1_); - EXPECT_TRUE(handler->got_cookie_manager2_); - EXPECT_TRUE(handler->got_load_end1_); - EXPECT_TRUE(handler->got_load_end2_); - EXPECT_TRUE(handler->got_load_end3_); - EXPECT_TRUE(handler->got_cookie1_); - EXPECT_TRUE(handler->got_cookie2_); - EXPECT_TRUE(handler->got_cookie3_); -} - -// Verify use of multiple cookie managers via a custom scheme. -TEST(CookieTest, GetCookieManagerCustom) { - CefRefPtr handler = - new CookieTestSchemeHandler("ccustom"); - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_process_request1_); - EXPECT_TRUE(handler->got_process_request2_); - EXPECT_TRUE(handler->got_process_request3_); - EXPECT_FALSE(handler->got_create_cookie_); - EXPECT_TRUE(handler->got_process_request_cookie_); - EXPECT_TRUE(handler->got_cookie_manager1_); - EXPECT_TRUE(handler->got_cookie_manager2_); - EXPECT_TRUE(handler->got_load_end1_); - EXPECT_TRUE(handler->got_load_end2_); - EXPECT_TRUE(handler->got_load_end3_); - EXPECT_TRUE(handler->got_cookie1_); - EXPECT_TRUE(handler->got_cookie2_); - EXPECT_TRUE(handler->got_cookie3_); -} - - -// Entry point for registering custom schemes. -// Called from run_all_unittests.cc. -void RegisterCookieCustomSchemes( - CefRefPtr registrar) { - // Used by the GetCookieManagerCustom test. - registrar->AddCustomScheme("ccustom", true, false, false); -} diff --git a/cef1/tests/unittests/dom_unittest.cc b/cef1/tests/unittests/dom_unittest.cc deleted file mode 100644 index 67b8f86fc..000000000 --- a/cef1/tests/unittests/dom_unittest.cc +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "include/cef_dom.h" -#include "tests/unittests/test_handler.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -class TestDOMHandler : public TestHandler { - public: - class Visitor : public CefDOMVisitor { - public: - explicit Visitor(TestDOMHandler* handler) : handler_(handler) {} - - void TestHeadNodeStructure(CefRefPtr headNode) { - EXPECT_TRUE(headNode.get()); - EXPECT_TRUE(headNode->IsElement()); - EXPECT_FALSE(headNode->IsText()); - EXPECT_EQ(headNode->GetName(), "HEAD"); - EXPECT_EQ(headNode->GetElementTagName(), "HEAD"); - - EXPECT_TRUE(headNode->HasChildren()); - EXPECT_FALSE(headNode->HasElementAttributes()); - - CefRefPtr titleNode = headNode->GetFirstChild(); - EXPECT_TRUE(titleNode.get()); - EXPECT_TRUE(titleNode->IsElement()); - EXPECT_FALSE(titleNode->IsText()); - EXPECT_EQ(titleNode->GetName(), "TITLE"); - EXPECT_EQ(titleNode->GetElementTagName(), "TITLE"); - EXPECT_TRUE(titleNode->GetParent()->IsSame(headNode)); - - EXPECT_FALSE(titleNode->GetNextSibling().get()); - EXPECT_FALSE(titleNode->GetPreviousSibling().get()); - EXPECT_TRUE(titleNode->HasChildren()); - EXPECT_FALSE(titleNode->HasElementAttributes()); - - CefRefPtr textNode = titleNode->GetFirstChild(); - EXPECT_TRUE(textNode.get()); - EXPECT_FALSE(textNode->IsElement()); - EXPECT_TRUE(textNode->IsText()); - EXPECT_EQ(textNode->GetValue(), "The Title"); - EXPECT_TRUE(textNode->GetParent()->IsSame(titleNode)); - - EXPECT_FALSE(textNode->GetNextSibling().get()); - EXPECT_FALSE(textNode->GetPreviousSibling().get()); - EXPECT_FALSE(textNode->HasChildren()); - } - - void TestBodyNodeStructure(CefRefPtr bodyNode) { - EXPECT_TRUE(bodyNode.get()); - EXPECT_TRUE(bodyNode->IsElement()); - EXPECT_FALSE(bodyNode->IsText()); - EXPECT_EQ(bodyNode->GetName(), "BODY"); - EXPECT_EQ(bodyNode->GetElementTagName(), "BODY"); - - EXPECT_TRUE(bodyNode->HasChildren()); - EXPECT_FALSE(bodyNode->HasElementAttributes()); - - CefRefPtr h1Node = bodyNode->GetFirstChild(); - EXPECT_TRUE(h1Node.get()); - EXPECT_TRUE(h1Node->IsElement()); - EXPECT_FALSE(h1Node->IsText()); - EXPECT_EQ(h1Node->GetName(), "H1"); - EXPECT_EQ(h1Node->GetElementTagName(), "H1"); - - EXPECT_FALSE(h1Node->GetNextSibling().get()); - EXPECT_FALSE(h1Node->GetPreviousSibling().get()); - EXPECT_TRUE(h1Node->HasChildren()); - EXPECT_FALSE(h1Node->HasElementAttributes()); - - CefRefPtr textNode = h1Node->GetFirstChild(); - EXPECT_TRUE(textNode.get()); - EXPECT_FALSE(textNode->IsElement()); - EXPECT_TRUE(textNode->IsText()); - EXPECT_EQ(textNode->GetValue(), "Hello From"); - - EXPECT_FALSE(textNode->GetPreviousSibling().get()); - EXPECT_FALSE(textNode->HasChildren()); - - CefRefPtr brNode = textNode->GetNextSibling(); - EXPECT_TRUE(brNode.get()); - EXPECT_TRUE(brNode->IsElement()); - EXPECT_FALSE(brNode->IsText()); - EXPECT_EQ(brNode->GetName(), "BR"); - EXPECT_EQ(brNode->GetElementTagName(), "BR"); - - EXPECT_FALSE(brNode->HasChildren()); - - EXPECT_TRUE(brNode->HasElementAttributes()); - EXPECT_TRUE(brNode->HasElementAttribute("class")); - EXPECT_EQ(brNode->GetElementAttribute("class"), "some_class"); - EXPECT_TRUE(brNode->HasElementAttribute("id")); - EXPECT_EQ(brNode->GetElementAttribute("id"), "some_id"); - EXPECT_FALSE(brNode->HasElementAttribute("no_existing")); - - CefDOMNode::AttributeMap map; - brNode->GetElementAttributes(map); - ASSERT_EQ(map.size(), (size_t)2); - EXPECT_EQ(map["class"], "some_class"); - EXPECT_EQ(map["id"], "some_id"); - - // Can also retrieve by ID. - brNode = bodyNode->GetDocument()->GetElementById("some_id"); - EXPECT_TRUE(brNode.get()); - EXPECT_TRUE(brNode->IsElement()); - EXPECT_FALSE(brNode->IsText()); - EXPECT_EQ(brNode->GetName(), "BR"); - EXPECT_EQ(brNode->GetElementTagName(), "BR"); - - textNode = brNode->GetNextSibling(); - EXPECT_TRUE(textNode.get()); - EXPECT_FALSE(textNode->IsElement()); - EXPECT_TRUE(textNode->IsText()); - EXPECT_EQ(textNode->GetValue(), "Main Frame"); - - EXPECT_FALSE(textNode->GetNextSibling().get()); - EXPECT_FALSE(textNode->HasChildren()); - } - - // Test document structure by iterating through the DOM tree. - void TestStructure(CefRefPtr document) { - EXPECT_EQ(document->GetTitle(), "The Title"); - EXPECT_EQ(document->GetBaseURL(), "http://tests/main.html"); - EXPECT_EQ(document->GetCompleteURL("foo.html"), "http://tests/foo.html"); - - // Navigate the complete document structure. - CefRefPtr docNode = document->GetDocument(); - EXPECT_TRUE(docNode.get()); - EXPECT_FALSE(docNode->IsElement()); - EXPECT_FALSE(docNode->IsText()); - - CefRefPtr htmlNode = docNode->GetFirstChild(); - EXPECT_TRUE(htmlNode.get()); - EXPECT_TRUE(htmlNode->IsElement()); - EXPECT_FALSE(htmlNode->IsText()); - EXPECT_EQ(htmlNode->GetName(), "HTML"); - EXPECT_EQ(htmlNode->GetElementTagName(), "HTML"); - - EXPECT_TRUE(htmlNode->HasChildren()); - EXPECT_FALSE(htmlNode->HasElementAttributes()); - - CefRefPtr headNode = htmlNode->GetFirstChild(); - TestHeadNodeStructure(headNode); - - CefRefPtr bodyNode = headNode->GetNextSibling(); - TestBodyNodeStructure(bodyNode); - - // Retrieve the head node directly. - headNode = document->GetHead(); - TestHeadNodeStructure(headNode); - - // Retrieve the body node directly. - bodyNode = document->GetBody(); - TestBodyNodeStructure(bodyNode); - } - - // Test document modification by changing the H1 tag. - void TestModify(CefRefPtr document) { - CefRefPtr bodyNode = document->GetBody(); - CefRefPtr h1Node = bodyNode->GetFirstChild(); - - ASSERT_EQ(h1Node->GetAsMarkup(), - "

Hello From
" - "Main Frame

"); - - CefRefPtr textNode = h1Node->GetFirstChild(); - ASSERT_EQ(textNode->GetValue(), "Hello From"); - ASSERT_TRUE(textNode->SetValue("A Different Message From")); - ASSERT_EQ(textNode->GetValue(), "A Different Message From"); - - CefRefPtr brNode = textNode->GetNextSibling(); - EXPECT_EQ(brNode->GetElementAttribute("class"), "some_class"); - EXPECT_TRUE(brNode->SetElementAttribute("class", "a_different_class")); - EXPECT_EQ(brNode->GetElementAttribute("class"), "a_different_class"); - - ASSERT_EQ(h1Node->GetAsMarkup(), - "

A Different Message From
Main Frame

"); - - ASSERT_FALSE(h1Node->SetValue("Something Different")); - } - - virtual void Visit(CefRefPtr document) { - handler_->got_visitor_called_.yes(); - - if (handler_->test_type_ == STRUCTURE) - TestStructure(document); - else if (handler_->test_type_ == MODIFY) - TestModify(document); - - handler_->DestroyTest(); - } - - protected: - TestDOMHandler* handler_; - - IMPLEMENT_REFCOUNTING(Visitor); - }; - - enum TestType { - STRUCTURE, - MODIFY, - }; - - explicit TestDOMHandler(TestType test) : test_type_(test) { - visitor_ = new Visitor(this); - } - - virtual void RunTest() OVERRIDE { - std::stringstream mainHtml; - mainHtml << - "" - "The Title" - "" - "

Hello From
" - "Main Frame

" - "" - ""; - - AddResource("http://tests/main.html", mainHtml.str(), "text/html"); - CreateBrowser("http://tests/main.html"); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - if (frame->IsMain()) { - // The page is done loading so visit the DOM. - browser->GetMainFrame()->VisitDOM(visitor_.get()); - } - } - - CefRefPtr visitor_; - TestType test_type_; - - TrackCallback got_visitor_called_; -}; - -} // namespace - -// Test DOM structure reading. -TEST(DOMTest, Read) { - CefRefPtr handler = - new TestDOMHandler(TestDOMHandler::STRUCTURE); - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_visitor_called_); -} - -// Test DOM modifications. -TEST(DOMTest, Modify) { - CefRefPtr handler = - new TestDOMHandler(TestDOMHandler::MODIFY); - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_visitor_called_); -} diff --git a/cef1/tests/unittests/geolocation_unittest.cc b/cef1/tests/unittests/geolocation_unittest.cc deleted file mode 100644 index 54973bb28..000000000 --- a/cef1/tests/unittests/geolocation_unittest.cc +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (c) 2012 The Chromium Embedded Framework 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 "include/cef_geolocation.h" -#include "include/cef_runnable.h" -#include "tests/unittests/test_handler.h" -#include "base/synchronization/waitable_event.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -const char* kTestOrigin = "http://tests/"; -const char* kTestUrl = "http://tests/GeolocationTestHandler"; -const char* kTestAllowUrl = "http://tests/GeolocationTestHandler.Allow"; -const char* kTestDenyUrl = "http://tests/GeolocationTestHandler.Deny"; -const char* kTestCancelUrl = "http://tests/GeolocationTestHandler.Cancel"; - -enum TestMode { - TEST_ALLOW, - TEST_DENY, - TEST_CANCEL, -}; - -class GeolocationTestHandler : public TestHandler { - public: - GeolocationTestHandler(const TestMode& mode, bool async) - : mode_(mode), - async_(async), - request_id_(-1) { - } - - virtual void RunTest() OVERRIDE { - std::string html = - "TEST START"; - AddResource(kTestUrl, html, "text/html"); - - std::string end_html = "TEST END"; - AddResource(kTestAllowUrl, end_html, "text/html"); - AddResource(kTestDenyUrl, end_html, "text/html"); - AddResource(kTestCancelUrl, end_html, "text/html"); - - // Create the browser - CreateBrowser(kTestUrl); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - std::string url = frame->GetURL(); - if (url != kTestUrl) { - if (url == kTestAllowUrl) - got_allow_.yes(); - else if (url == kTestDenyUrl) - got_deny_.yes(); - else if (url == kTestCancelUrl) - got_cancel_.yes(); - - DestroyTest(); - } - } - - void ExecuteCallback(CefRefPtr callback) { - if (mode_ == TEST_ALLOW) - callback->Continue(true); - else if (mode_ == TEST_DENY) - callback->Continue(false); - } - - virtual void OnRequestGeolocationPermission( - CefRefPtr browser, - const CefString& requesting_url, - int request_id, - CefRefPtr callback) OVERRIDE { - got_requestgeolocationpermission_.yes(); - - EXPECT_TRUE(CefCurrentlyOn(TID_UI)); - - EXPECT_STREQ(kTestOrigin, requesting_url.ToString().c_str()); - request_id_ = request_id; - - if (!async_) { - ExecuteCallback(callback); - } else { - CefPostTask(TID_UI, - NewCefRunnableMethod(this, &GeolocationTestHandler::ExecuteCallback, - callback)); - } - } - - virtual void OnCancelGeolocationPermission( - CefRefPtr browser, - const CefString& requesting_url, - int request_id) OVERRIDE { - got_cancelgeolocationpermission_.yes(); - - EXPECT_TRUE(CefCurrentlyOn(TID_UI)); - - EXPECT_STREQ(kTestOrigin, requesting_url.ToString().c_str()); - EXPECT_EQ(request_id, request_id_); - } - - virtual void DestroyTest() OVERRIDE { - EXPECT_TRUE(got_requestgeolocationpermission_); - if (mode_ == TEST_CANCEL) - EXPECT_TRUE(got_cancelgeolocationpermission_); - else - EXPECT_FALSE(got_cancelgeolocationpermission_); - - TestHandler::DestroyTest(); - } - - TestMode mode_; - bool async_; - - int request_id_; - - TrackCallback got_requestgeolocationpermission_; - TrackCallback got_cancelgeolocationpermission_; - TrackCallback got_allow_; - TrackCallback got_cancel_; - TrackCallback got_deny_; -}; - -} // namespace - -TEST(GeolocationTest, HandlerAllow) { - CefRefPtr handler = - new GeolocationTestHandler(TEST_ALLOW, false); - handler->ExecuteTest(); - EXPECT_TRUE(handler->got_allow_); -} - -TEST(GeolocationTest, HandlerAllowAsync) { - CefRefPtr handler = - new GeolocationTestHandler(TEST_ALLOW, true); - handler->ExecuteTest(); - EXPECT_TRUE(handler->got_allow_); -} - -TEST(GeolocationTest, HandlerDeny) { - CefRefPtr handler = - new GeolocationTestHandler(TEST_DENY, false); - handler->ExecuteTest(); - EXPECT_TRUE(handler->got_deny_); -} - -TEST(GeolocationTest, HandlerDenyAsync) { - CefRefPtr handler = - new GeolocationTestHandler(TEST_DENY, true); - handler->ExecuteTest(); - EXPECT_TRUE(handler->got_deny_); -} - -TEST(GeolocationTest, HandlerCancel) { - CefRefPtr handler = - new GeolocationTestHandler(TEST_CANCEL, false); - handler->ExecuteTest(); - EXPECT_TRUE(handler->got_cancel_); -} - - -namespace { - -class TestGetGeolocationCallback : public CefGetGeolocationCallback { - public: - explicit TestGetGeolocationCallback(base::WaitableEvent* event) - : event_(event) { - } - - virtual void OnLocationUpdate(const CefGeoposition& position) OVERRIDE { - EXPECT_TRUE(CefCurrentlyOn(TID_UI)); - EXPECT_EQ(position.error_code, GEOPOSITON_ERROR_NONE); - EXPECT_NE(position.latitude, 0.0); - EXPECT_NE(position.longitude, 0.0); - EXPECT_NE(position.accuracy, 0.0); - EXPECT_NE(position.timestamp.year, 0); - event_->Signal(); - } - -private: - base::WaitableEvent* event_; - - IMPLEMENT_REFCOUNTING(TestGetGeolocationCallback); -}; - -} // namespace - -TEST(GeolocationTest, GetGeolocation) { - base::WaitableEvent event(false, false); - CefGetGeolocation(new TestGetGeolocationCallback(&event)); - event.Wait(); -} diff --git a/cef1/tests/unittests/mac/English.lproj/InfoPlist.strings b/cef1/tests/unittests/mac/English.lproj/InfoPlist.strings deleted file mode 100644 index fe2abe11b..000000000 --- a/cef1/tests/unittests/mac/English.lproj/InfoPlist.strings +++ /dev/null @@ -1,3 +0,0 @@ -/* Localized versions of Info.plist keys */ - -NSHumanReadableCopyright = "© Chromium Embedded Framework Authors, 2010"; diff --git a/cef1/tests/unittests/mac/English.lproj/MainMenu.xib b/cef1/tests/unittests/mac/English.lproj/MainMenu.xib deleted file mode 100644 index e4f7c1fc3..000000000 --- a/cef1/tests/unittests/mac/English.lproj/MainMenu.xib +++ /dev/null @@ -1,2880 +0,0 @@ - - - - 1050 - 10F569 - 820 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 820 - - - YES - - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - AMainMenu - - YES - - - cefclient - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - TestShell - - YES - - - About cefclient - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - YES - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide cefclient - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit cefclient - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - File - - YES - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - Open Recent - - YES - - - Clear Menu - - 1048576 - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - Edit - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Find - - 1048576 - 2147483647 - - - submenuAction: - - Find - - YES - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 1048576 - 2147483647 - - - submenuAction: - - Spelling and Grammar - - YES - - - Show Spelling… - : - 1048576 - 2147483647 - - - - - - Check Spelling - ; - 1048576 - 2147483647 - - - - - - Check Spelling While Typing - - 1048576 - 2147483647 - - - - - - Check Grammar With Spelling - - 1048576 - 2147483647 - - - - - - - - - Substitutions - - 1048576 - 2147483647 - - - submenuAction: - - Substitutions - - YES - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - Speech - - YES - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - - - - - - - - Format - - 1048576 - 2147483647 - - - submenuAction: - - Format - - YES - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Show Colors - C - 1179648 - 2147483647 - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - View - - YES - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - Window - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 1048576 - 2147483647 - - - submenuAction: - - Help - - YES - - - cefclient Help - ? - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - YES - - - - - YES - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - showHelp: - - - - 360 - - - - orderFrontColorPanel: - - - - 361 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - terminate: - - - - 369 - - - - unhideAllApplications: - - - - 370 - - - - newDocument: - - - - 373 - - - - openDocument: - - - - 374 - - - - - YES - - 0 - - YES - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - YES - - - - - - - - - - MainMenu - - - 19 - - - YES - - - - - - 56 - - - YES - - - - - - 103 - - - YES - - - - 1 - - - 217 - - - YES - - - - - - 83 - - - YES - - - - - - 81 - - - YES - - - - - - - - - - - - - - - - 75 - - - 3 - - - 80 - - - 8 - - - 78 - - - 6 - - - 72 - - - - - 82 - - - 9 - - - 124 - - - YES - - - - - - 77 - - - 5 - - - 73 - - - 1 - - - 79 - - - 7 - - - 112 - - - 10 - - - 74 - - - 2 - - - 125 - - - YES - - - - - - 126 - - - - - 205 - - - YES - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - YES - - - - - - 216 - - - YES - - - - - - 200 - - - YES - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - YES - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 106 - - - YES - - - - 2 - - - 111 - - - - - 57 - - - YES - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - 1111 - - - 144 - - - - - 129 - - - 121 - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - YES - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - YES - - - - - - 296 - - - YES - - - - - - - 297 - - - - - 298 - - - - - 299 - - - YES - - - - - - 300 - - - YES - - - - - - - 344 - - - - - 345 - - - - - 211 - - - YES - - - - - - 212 - - - YES - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - YES - - - - - - 349 - - - YES - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 389 - - - - - - - YES - - YES - -3.IBPluginDependency - 103.IBPluginDependency - 103.ImportedFromIB2 - 106.IBEditorWindowLastContentRect - 106.IBPluginDependency - 106.ImportedFromIB2 - 106.editorWindowContentRectSynchronizationRect - 111.IBPluginDependency - 111.ImportedFromIB2 - 112.IBPluginDependency - 112.ImportedFromIB2 - 124.IBPluginDependency - 124.ImportedFromIB2 - 125.IBPluginDependency - 125.ImportedFromIB2 - 125.editorWindowContentRectSynchronizationRect - 126.IBPluginDependency - 126.ImportedFromIB2 - 129.IBPluginDependency - 129.ImportedFromIB2 - 130.IBPluginDependency - 130.ImportedFromIB2 - 130.editorWindowContentRectSynchronizationRect - 131.IBPluginDependency - 131.ImportedFromIB2 - 134.IBPluginDependency - 134.ImportedFromIB2 - 136.IBPluginDependency - 136.ImportedFromIB2 - 143.IBPluginDependency - 143.ImportedFromIB2 - 144.IBPluginDependency - 144.ImportedFromIB2 - 145.IBPluginDependency - 145.ImportedFromIB2 - 149.IBPluginDependency - 149.ImportedFromIB2 - 150.IBPluginDependency - 150.ImportedFromIB2 - 19.IBPluginDependency - 19.ImportedFromIB2 - 195.IBPluginDependency - 195.ImportedFromIB2 - 196.IBPluginDependency - 196.ImportedFromIB2 - 197.IBPluginDependency - 197.ImportedFromIB2 - 198.IBPluginDependency - 198.ImportedFromIB2 - 199.IBPluginDependency - 199.ImportedFromIB2 - 200.IBEditorWindowLastContentRect - 200.IBPluginDependency - 200.ImportedFromIB2 - 200.editorWindowContentRectSynchronizationRect - 201.IBPluginDependency - 201.ImportedFromIB2 - 202.IBPluginDependency - 202.ImportedFromIB2 - 203.IBPluginDependency - 203.ImportedFromIB2 - 204.IBPluginDependency - 204.ImportedFromIB2 - 205.IBEditorWindowLastContentRect - 205.IBPluginDependency - 205.ImportedFromIB2 - 205.editorWindowContentRectSynchronizationRect - 206.IBPluginDependency - 206.ImportedFromIB2 - 207.IBPluginDependency - 207.ImportedFromIB2 - 208.IBPluginDependency - 208.ImportedFromIB2 - 209.IBPluginDependency - 209.ImportedFromIB2 - 210.IBPluginDependency - 210.ImportedFromIB2 - 211.IBPluginDependency - 211.ImportedFromIB2 - 212.IBEditorWindowLastContentRect - 212.IBPluginDependency - 212.ImportedFromIB2 - 212.editorWindowContentRectSynchronizationRect - 213.IBPluginDependency - 213.ImportedFromIB2 - 214.IBPluginDependency - 214.ImportedFromIB2 - 215.IBPluginDependency - 215.ImportedFromIB2 - 216.IBPluginDependency - 216.ImportedFromIB2 - 217.IBPluginDependency - 217.ImportedFromIB2 - 218.IBPluginDependency - 218.ImportedFromIB2 - 219.IBPluginDependency - 219.ImportedFromIB2 - 220.IBEditorWindowLastContentRect - 220.IBPluginDependency - 220.ImportedFromIB2 - 220.editorWindowContentRectSynchronizationRect - 221.IBPluginDependency - 221.ImportedFromIB2 - 23.IBPluginDependency - 23.ImportedFromIB2 - 236.IBPluginDependency - 236.ImportedFromIB2 - 239.IBPluginDependency - 239.ImportedFromIB2 - 24.IBEditorWindowLastContentRect - 24.IBPluginDependency - 24.ImportedFromIB2 - 24.editorWindowContentRectSynchronizationRect - 29.IBEditorWindowLastContentRect - 29.IBPluginDependency - 29.ImportedFromIB2 - 29.WindowOrigin - 29.editorWindowContentRectSynchronizationRect - 295.IBPluginDependency - 296.IBEditorWindowLastContentRect - 296.IBPluginDependency - 296.editorWindowContentRectSynchronizationRect - 297.IBPluginDependency - 298.IBPluginDependency - 299.IBPluginDependency - 300.IBEditorWindowLastContentRect - 300.IBPluginDependency - 300.editorWindowContentRectSynchronizationRect - 344.IBPluginDependency - 345.IBPluginDependency - 346.IBPluginDependency - 346.ImportedFromIB2 - 348.IBPluginDependency - 348.ImportedFromIB2 - 349.IBEditorWindowLastContentRect - 349.IBPluginDependency - 349.ImportedFromIB2 - 349.editorWindowContentRectSynchronizationRect - 350.IBPluginDependency - 350.ImportedFromIB2 - 351.IBPluginDependency - 351.ImportedFromIB2 - 354.IBPluginDependency - 354.ImportedFromIB2 - 389.IBPluginDependency - 5.IBPluginDependency - 5.ImportedFromIB2 - 56.IBPluginDependency - 56.ImportedFromIB2 - 57.IBEditorWindowLastContentRect - 57.IBPluginDependency - 57.ImportedFromIB2 - 57.editorWindowContentRectSynchronizationRect - 58.IBPluginDependency - 58.ImportedFromIB2 - 72.IBPluginDependency - 72.ImportedFromIB2 - 73.IBPluginDependency - 73.ImportedFromIB2 - 74.IBPluginDependency - 74.ImportedFromIB2 - 75.IBPluginDependency - 75.ImportedFromIB2 - 77.IBPluginDependency - 77.ImportedFromIB2 - 78.IBPluginDependency - 78.ImportedFromIB2 - 79.IBPluginDependency - 79.ImportedFromIB2 - 80.IBPluginDependency - 80.ImportedFromIB2 - 81.IBEditorWindowLastContentRect - 81.IBPluginDependency - 81.ImportedFromIB2 - 81.editorWindowContentRectSynchronizationRect - 82.IBPluginDependency - 82.ImportedFromIB2 - 83.IBPluginDependency - 83.ImportedFromIB2 - 92.IBPluginDependency - 92.ImportedFromIB2 - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - {{906, 713}, {164, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{375, 955}, {171, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{522, 812}, {146, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{436, 809}, {64, 6}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{915, 473}, {272, 83}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {275, 83}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{675, 493}, {240, 243}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{144, 735}, {243, 243}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{915, 473}, {164, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {167, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{915, 473}, {238, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {241, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{835, 663}, {194, 73}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{304, 905}, {197, 73}} - {{541, 736}, {426, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - - {74, 862} - {{6, 836}, {430, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - {{785, 693}, {231, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - {{254, 935}, {234, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{719, 693}, {173, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - {{188, 935}, {176, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{915, 473}, {212, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {215, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{553, 553}, {193, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{18, 653}, {200, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{633, 533}, {196, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{102, 775}, {199, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - YES - - - YES - - - - - YES - - - YES - - - - 439 - - - - YES - - NSApplication - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSApplication.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSApplicationScripting.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSColorPanel.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSHelpManager.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSPageLayout.h - - - - NSBrowser - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSBrowser.h - - - - NSControl - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSControl.h - - - - NSController - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSController.h - - - - NSDocument - NSObject - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - id - id - id - id - id - id - - - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - - printDocument: - id - - - revertDocumentToSaved: - id - - - runPageLayout: - id - - - saveDocument: - id - - - saveDocumentAs: - id - - - saveDocumentTo: - id - - - - - IBFrameworkSource - AppKit.framework/Headers/NSDocument.h - - - - NSDocument - - IBFrameworkSource - AppKit.framework/Headers/NSDocumentScripting.h - - - - NSDocumentController - NSObject - - YES - - YES - clearRecentDocuments: - newDocument: - openDocument: - saveAllDocuments: - - - YES - id - id - id - id - - - - YES - - YES - clearRecentDocuments: - newDocument: - openDocument: - saveAllDocuments: - - - YES - - clearRecentDocuments: - id - - - newDocument: - id - - - openDocument: - id - - - saveAllDocuments: - id - - - - - IBFrameworkSource - AppKit.framework/Headers/NSDocumentController.h - - - - NSFormatter - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFormatter.h - - - - NSMatrix - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSMatrix.h - - - - NSMenu - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenu.h - - - - NSMenuItem - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenuItem.h - - - - NSMovieView - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSMovieView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAccessibility.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAlert.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAnimation.h - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSComboBox.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSComboBoxCell.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDatePickerCell.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDictionaryController.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDragging.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDrawer.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontManager.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontPanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSImage.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSKeyValueBinding.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSNibLoading.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSOutlineView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSPasteboard.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSRuleEditor.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSavePanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSound.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSpeechRecognizer.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSpeechSynthesizer.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSplitView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTabView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTableView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSText.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTextStorage.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTextView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTokenField.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTokenFieldCell.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSToolbar.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSToolbarItem.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSWindow.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSMetadata.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSNetServices.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObjectScripting.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPort.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPortCoder.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptObjectSpecifiers.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptWhoseTests.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSSpellServer.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSStream.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLDownload.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSXMLParser.h - - - - NSObject - - IBFrameworkSource - Print.framework/Headers/PDEPluginInterface.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CIImageProvider.h - - - - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSInterfaceStyle.h - - - - NSResponder - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSResponder.h - - - - NSTableView - NSControl - - - - NSText - NSView - - - - NSUserDefaultsController - NSController - - IBFrameworkSource - AppKit.framework/Headers/NSUserDefaultsController.h - - - - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSClipView.h - - - - NSView - - - - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSRulerView.h - - - - NSView - NSResponder - - - - NSWindow - - - - NSWindow - NSResponder - - - - NSWindow - - IBFrameworkSource - AppKit.framework/Headers/NSWindowScripting.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - ../../../../cef.xcodeproj - 3 - - YES - - YES - NSMenuCheckmark - NSMenuMixedState - - - YES - {9, 8} - {7, 2} - - - - diff --git a/cef1/tests/unittests/mac/Info.plist b/cef1/tests/unittests/mac/Info.plist deleted file mode 100644 index 3d5f27c20..000000000 --- a/cef1/tests/unittests/mac/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - unittests.icns - CFBundleIdentifier - org.cef.unittests - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/cef1/tests/unittests/mac/unittests.icns b/cef1/tests/unittests/mac/unittests.icns deleted file mode 100644 index f36742de2572421b1eaa5569f64ab34e450ddb67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55080 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%0Ac$%Pvh#VA!uK`rp4)7 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 OV{TRe000a^@Bjd~o7PtV diff --git a/cef1/tests/unittests/navigation_unittest.cc b/cef1/tests/unittests/navigation_unittest.cc deleted file mode 100644 index 54328649d..000000000 --- a/cef1/tests/unittests/navigation_unittest.cc +++ /dev/null @@ -1,619 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "include/cef_scheme.h" -#include "tests/unittests/test_handler.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -static const char* kNav1 = "http://tests/nav1.html"; -static const char* kNav2 = "http://tests/nav2.html"; -static const char* kNav3 = "http://tests/nav3.html"; -static const char* kNav4 = "http://tests/nav4.html"; - -enum NavAction { - NA_LOAD = 1, - NA_BACK, - NA_FORWARD, - NA_CLEAR -}; - -typedef struct { - NavAction action; // What to do - const char* target; // Where to be after navigation - bool can_go_back; // After navigation, can go back? - bool can_go_forward; // After navigation, can go forward? -} NavListItem; - -// Array of navigation actions: X = current page, . = history exists -static NavListItem kNavList[] = { - // kNav1 | kNav2 | kNav3 - {NA_LOAD, kNav1, false, false}, // X - {NA_LOAD, kNav2, true, false}, // . X - {NA_BACK, kNav1, false, true}, // X . - {NA_FORWARD, kNav2, true, false}, // . X - {NA_LOAD, kNav3, true, false}, // . . X - {NA_BACK, kNav2, true, true}, // . X . - {NA_CLEAR, kNav2, false, false}, // X -}; - -#define NAV_LIST_SIZE() (sizeof(kNavList) / sizeof(NavListItem)) - -class HistoryNavTestHandler : public TestHandler { - public: - HistoryNavTestHandler() : nav_(0) {} - - virtual void RunTest() OVERRIDE { - // Add the resources that we will navigate to/from. - AddResource(kNav1, "Nav1", "text/html"); - AddResource(kNav2, "Nav2", "text/html"); - AddResource(kNav3, "Nav3", "text/html"); - - // Create the browser. - CreateBrowser(CefString()); - } - - void RunNav(CefRefPtr browser) { - if (nav_ == NAV_LIST_SIZE()) { - // End of the nav list. - DestroyTest(); - return; - } - - const NavListItem& item = kNavList[nav_]; - - // Perform the action. - switch (item.action) { - case NA_LOAD: - browser->GetMainFrame()->LoadURL(item.target); - break; - case NA_BACK: - browser->GoBack(); - break; - case NA_FORWARD: - browser->GoForward(); - break; - case NA_CLEAR: - browser->ClearHistory(); - // Not really a navigation action so go to the next one. - nav_++; - RunNav(browser); - break; - default: - break; - } - } - - virtual void OnAfterCreated(CefRefPtr browser) OVERRIDE { - TestHandler::OnAfterCreated(browser); - - RunNav(browser); - } - - virtual bool OnBeforeBrowse(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr request, - NavType navType, - bool isRedirect) OVERRIDE { - const NavListItem& item = kNavList[nav_]; - - got_before_browse_[nav_].yes(); - - std::string url = request->GetURL(); - if (url == item.target) - got_correct_target_[nav_].yes(); - - if (((item.action == NA_BACK || item.action == NA_FORWARD) && - navType == NAVTYPE_BACKFORWARD) || - (item.action == NA_LOAD && navType == NAVTYPE_OTHER)) { - got_correct_nav_type_[nav_].yes(); - } - - return false; - } - - virtual void OnNavStateChange(CefRefPtr browser, - bool canGoBack, - bool canGoForward) OVERRIDE { - const NavListItem& item = kNavList[nav_]; - - got_nav_state_change_[nav_].yes(); - - if (item.can_go_back == canGoBack) - got_correct_can_go_back_[nav_].yes(); - if (item.can_go_forward == canGoForward) - got_correct_can_go_forward_[nav_].yes(); - } - - virtual void OnLoadStart(CefRefPtr browser, - CefRefPtr frame) OVERRIDE { - if(browser->IsPopup() || !frame->IsMain()) - return; - - const NavListItem& item = kNavList[nav_]; - - got_load_start_[nav_].yes(); - - std::string url1 = browser->GetMainFrame()->GetURL(); - std::string url2 = frame->GetURL(); - if (url1 == item.target && url2 == item.target) - got_correct_load_start_url_[nav_].yes(); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - if (browser->IsPopup() || !frame->IsMain()) - return; - - const NavListItem& item = kNavList[nav_]; - - got_load_end_[nav_].yes(); - - std::string url1 = browser->GetMainFrame()->GetURL(); - std::string url2 = frame->GetURL(); - if (url1 == item.target && url2 == item.target) - got_correct_load_end_url_[nav_].yes(); - - if (item.can_go_back == browser->CanGoBack()) - got_correct_can_go_back2_[nav_].yes(); - if (item.can_go_forward == browser->CanGoForward()) - got_correct_can_go_forward2_[nav_].yes(); - - nav_++; - RunNav(browser); - } - - int nav_; - - TrackCallback got_before_browse_[NAV_LIST_SIZE()]; - TrackCallback got_correct_target_[NAV_LIST_SIZE()]; - TrackCallback got_correct_nav_type_[NAV_LIST_SIZE()]; - TrackCallback got_nav_state_change_[NAV_LIST_SIZE()]; - TrackCallback got_correct_can_go_back_[NAV_LIST_SIZE()]; - TrackCallback got_correct_can_go_forward_[NAV_LIST_SIZE()]; - TrackCallback got_load_start_[NAV_LIST_SIZE()]; - TrackCallback got_correct_load_start_url_[NAV_LIST_SIZE()]; - TrackCallback got_load_end_[NAV_LIST_SIZE()]; - TrackCallback got_correct_load_end_url_[NAV_LIST_SIZE()]; - TrackCallback got_correct_can_go_back2_[NAV_LIST_SIZE()]; - TrackCallback got_correct_can_go_forward2_[NAV_LIST_SIZE()]; -}; - -} // namespace - -// Verify history navigation. -TEST(NavigationTest, History) { - CefRefPtr handler = - new HistoryNavTestHandler(); - handler->ExecuteTest(); - - for (size_t i = 0; i < NAV_LIST_SIZE(); ++i) { - if (kNavList[i].action != NA_CLEAR) { - ASSERT_TRUE(handler->got_before_browse_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_target_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_nav_type_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_load_start_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_load_start_url_[i]) << "i = " << i; - } - - if (i == 0 || kNavList[i].can_go_back != kNavList[i-1].can_go_back || - kNavList[i].can_go_forward != kNavList[i-1].can_go_forward) { - // Back/forward state has changed from one navigation to the next. - ASSERT_TRUE(handler->got_nav_state_change_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_can_go_back_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_can_go_forward_[i]) << "i = " << i; - } else { - ASSERT_FALSE(handler->got_nav_state_change_[i]) << "i = " << i; - ASSERT_FALSE(handler->got_correct_can_go_back_[i]) << "i = " << i; - ASSERT_FALSE(handler->got_correct_can_go_forward_[i]) << "i = " << i; - } - - if (kNavList[i].action != NA_CLEAR) { - ASSERT_TRUE(handler->got_load_end_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_load_end_url_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_can_go_back2_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_can_go_forward2_[i]) << "i = " << i; - } - } -} - - -namespace { - -class FrameNameIdentNavTestHandler : public TestHandler { - public: - FrameNameIdentNavTestHandler() : browse_ct_(0) {} - - virtual void RunTest() OVERRIDE { - // Add the frame resources. - std::stringstream ss; - - // Page with named frame - ss << "Nav1" - "", "text/html"); - AddResource(kV8ContextChildTestUrl, "" - "CHILD", - "text/html"); - CreateBrowser(kV8ContextParentTestUrl); - } else if (test_mode_ == V8TEST_ON_UNCAUGHT_EXCEPTION || - test_mode_ == V8TEST_ON_UNCAUGHT_EXCEPTION_DEV_TOOLS) { - AddResource(kV8OnUncaughtExceptionTestUrl, "" - "

OnUncaughtException

" - "\n" - "\n", - "text/html"); - CreateBrowser(kV8OnUncaughtExceptionTestUrl); - } else { - if (test_mode_ == V8TEST_CONTEXT_INVALID) { - AddResource(kV8NavTestUrl, "" - "TEST", "text/html"); - } - - EXPECT_TRUE(test_url_ != NULL); - AddResource(test_url_, "" - "TEST", "text/html"); - CreateBrowser(test_url_); - } - } - - // Run the specified test. - void RunTest(V8TestMode test_mode) { - switch (test_mode) { - case V8TEST_NULL_CREATE: - RunNullCreateTest(); - break; - case V8TEST_BOOL_CREATE: - RunBoolCreateTest(); - break; - case V8TEST_INT_CREATE: - RunIntCreateTest(); - break; - case V8TEST_UINT_CREATE: - RunUIntCreateTest(); - break; - case V8TEST_DOUBLE_CREATE: - RunDoubleCreateTest(); - break; - case V8TEST_DATE_CREATE: - RunDateCreateTest(); - break; - case V8TEST_STRING_CREATE: - RunStringCreateTest(); - break; - case V8TEST_ARRAY_CREATE: - RunArrayCreateTest(); - break; - case V8TEST_ARRAY_VALUE: - RunArrayValueTest(); - break; - case V8TEST_OBJECT_CREATE: - RunObjectCreateTest(); - break; - case V8TEST_OBJECT_USERDATA: - RunObjectUserDataTest(); - break; - case V8TEST_OBJECT_ACCESSOR: - RunObjectAccessorTest(); - break; - case V8TEST_OBJECT_ACCESSOR_EXCEPTION: - RunObjectAccessorExceptionTest(); - break; - case V8TEST_OBJECT_ACCESSOR_FAIL: - RunObjectAccessorFailTest(); - break; - case V8TEST_OBJECT_ACCESSOR_READONLY: - RunObjectAccessorReadOnlyTest(); - break; - case V8TEST_OBJECT_VALUE: - RunObjectValueTest(); - break; - case V8TEST_OBJECT_VALUE_READONLY: - RunObjectValueReadOnlyTest(); - break; - case V8TEST_OBJECT_VALUE_ENUM: - RunObjectValueEnumTest(); - break; - case V8TEST_OBJECT_VALUE_DONTENUM: - RunObjectValueDontEnumTest(); - break; - case V8TEST_OBJECT_VALUE_DELETE: - RunObjectValueDeleteTest(); - break; - case V8TEST_OBJECT_VALUE_DONTDELETE: - RunObjectValueDontDeleteTest(); - break; - case V8TEST_OBJECT_VALUE_EMPTYKEY: - RunObjectValueEmptyKeyTest(); - break; - case V8TEST_FUNCTION_CREATE: - RunFunctionCreateTest(); - break; - case V8TEST_FUNCTION_HANDLER: - RunFunctionHandlerTest(); - break; - case V8TEST_FUNCTION_HANDLER_EXCEPTION: - RunFunctionHandlerExceptionTest(); - break; - case V8TEST_FUNCTION_HANDLER_FAIL: - RunFunctionHandlerFailTest(); - break; - case V8TEST_FUNCTION_HANDLER_NO_OBJECT: - RunFunctionHandlerNoObjectTest(); - break; - case V8TEST_FUNCTION_HANDLER_WITH_CONTEXT: - RunFunctionHandlerWithContextTest(); - break; - case V8TEST_CONTEXT_EVAL: - RunContextEvalTest(); - break; - case V8TEST_CONTEXT_EVAL_EXCEPTION: - RunContextEvalExceptionTest(); - break; - case V8TEST_CONTEXT_ENTERED: - RunContextEnteredTest(); - break; - case V8TEST_CONTEXT_INVALID: - // The test is triggered when the context is released. - GetBrowser()->GetMainFrame()->LoadURL(kV8NavTestUrl); - break; - case V8TEST_BINDING: - RunBindingTest(); - break; - case V8TEST_STACK_TRACE: - RunStackTraceTest(); - break; - case V8TEST_ON_UNCAUGHT_EXCEPTION: - RunOnUncaughtExceptionTest(); - break; - case V8TEST_ON_UNCAUGHT_EXCEPTION_DEV_TOOLS: - RunOnUncaughtExceptionDevToolsTest(); - break; - default: - ADD_FAILURE(); - DestroyTest(); - break; - } - } - - void RunNullCreateTest() { - CefRefPtr value = CefV8Value::CreateNull(); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsNull()); - - EXPECT_FALSE(value->IsUndefined()); - EXPECT_FALSE(value->IsArray()); - EXPECT_FALSE(value->IsBool()); - EXPECT_FALSE(value->IsDate()); - EXPECT_FALSE(value->IsDouble()); - EXPECT_FALSE(value->IsFunction()); - EXPECT_FALSE(value->IsInt()); - EXPECT_FALSE(value->IsUInt()); - EXPECT_FALSE(value->IsObject()); - EXPECT_FALSE(value->IsString()); - - DestroyTest(); - } - - void RunBoolCreateTest() { - CefRefPtr value = CefV8Value::CreateBool(true); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsBool()); - EXPECT_EQ(true, value->GetBoolValue()); - - EXPECT_FALSE(value->IsUndefined()); - EXPECT_FALSE(value->IsArray()); - EXPECT_FALSE(value->IsDate()); - EXPECT_FALSE(value->IsDouble()); - EXPECT_FALSE(value->IsFunction()); - EXPECT_FALSE(value->IsInt()); - EXPECT_FALSE(value->IsUInt()); - EXPECT_FALSE(value->IsNull()); - EXPECT_FALSE(value->IsObject()); - EXPECT_FALSE(value->IsString()); - - DestroyTest(); - } - - void RunIntCreateTest() { - CefRefPtr value = CefV8Value::CreateInt(12); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsInt()); - EXPECT_TRUE(value->IsUInt()); - EXPECT_TRUE(value->IsDouble()); - EXPECT_EQ(12, value->GetIntValue()); - EXPECT_EQ((uint32)12, value->GetUIntValue()); - EXPECT_EQ(12, value->GetDoubleValue()); - - EXPECT_FALSE(value->IsUndefined()); - EXPECT_FALSE(value->IsArray()); - EXPECT_FALSE(value->IsBool()); - EXPECT_FALSE(value->IsDate()); - EXPECT_FALSE(value->IsFunction()); - EXPECT_FALSE(value->IsNull()); - EXPECT_FALSE(value->IsObject()); - EXPECT_FALSE(value->IsString()); - - DestroyTest(); - } - - void RunUIntCreateTest() { - CefRefPtr value = CefV8Value::CreateUInt(12); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsInt()); - EXPECT_TRUE(value->IsUInt()); - EXPECT_TRUE(value->IsDouble()); - EXPECT_EQ(12, value->GetIntValue()); - EXPECT_EQ((uint32)12, value->GetUIntValue()); - EXPECT_EQ(12, value->GetDoubleValue()); - - EXPECT_FALSE(value->IsUndefined()); - EXPECT_FALSE(value->IsArray()); - EXPECT_FALSE(value->IsBool()); - EXPECT_FALSE(value->IsDate()); - EXPECT_FALSE(value->IsFunction()); - EXPECT_FALSE(value->IsNull()); - EXPECT_FALSE(value->IsObject()); - EXPECT_FALSE(value->IsString()); - - DestroyTest(); - } - - void RunDoubleCreateTest() { - CefRefPtr value = CefV8Value::CreateDouble(12.1223); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsDouble()); - EXPECT_EQ(12.1223, value->GetDoubleValue()); - - EXPECT_FALSE(value->IsUndefined()); - EXPECT_FALSE(value->IsArray()); - EXPECT_FALSE(value->IsBool()); - EXPECT_FALSE(value->IsDate()); - EXPECT_FALSE(value->IsFunction()); - EXPECT_FALSE(value->IsInt()); - EXPECT_FALSE(value->IsUInt()); - EXPECT_FALSE(value->IsNull()); - EXPECT_FALSE(value->IsObject()); - EXPECT_FALSE(value->IsString()); - - DestroyTest(); - } - - void RunDateCreateTest() { - CefRefPtr context = GetContext(); - - CefTime date; - date.year = 2200; - date.month = 4; - date.day_of_week = 5; - date.day_of_month = 11; - date.hour = 20; - date.minute = 15; - date.second = 42; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr value = CefV8Value::CreateDate(date); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsDate()); - EXPECT_TRUE(value->IsObject()); - EXPECT_EQ(date.GetTimeT(), value->GetDateValue().GetTimeT()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - EXPECT_FALSE(value->IsUndefined()); - EXPECT_FALSE(value->IsArray()); - EXPECT_FALSE(value->IsBool()); - EXPECT_FALSE(value->IsDouble()); - EXPECT_FALSE(value->IsFunction()); - EXPECT_FALSE(value->IsInt()); - EXPECT_FALSE(value->IsUInt()); - EXPECT_FALSE(value->IsNull()); - EXPECT_FALSE(value->IsString()); - - DestroyTest(); - } - - void RunStringCreateTest() { - CefRefPtr value = CefV8Value::CreateString("My string"); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsString()); - EXPECT_STREQ("My string", value->GetStringValue().ToString().c_str()); - - EXPECT_FALSE(value->IsUndefined()); - EXPECT_FALSE(value->IsArray()); - EXPECT_FALSE(value->IsBool()); - EXPECT_FALSE(value->IsDate()); - EXPECT_FALSE(value->IsDouble()); - EXPECT_FALSE(value->IsFunction()); - EXPECT_FALSE(value->IsInt()); - EXPECT_FALSE(value->IsUInt()); - EXPECT_FALSE(value->IsNull()); - EXPECT_FALSE(value->IsObject()); - - DestroyTest(); - } - - void RunArrayCreateTest() { - CefRefPtr context = GetContext(); - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr value = CefV8Value::CreateArray(2); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsArray()); - EXPECT_TRUE(value->IsObject()); - EXPECT_EQ(2, value->GetArrayLength()); - EXPECT_FALSE(value->HasValue(0)); - EXPECT_FALSE(value->HasValue(1)); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - EXPECT_FALSE(value->IsUndefined()); - EXPECT_FALSE(value->IsBool()); - EXPECT_FALSE(value->IsDate()); - EXPECT_FALSE(value->IsDouble()); - EXPECT_FALSE(value->IsFunction()); - EXPECT_FALSE(value->IsInt()); - EXPECT_FALSE(value->IsUInt()); - EXPECT_FALSE(value->IsNull()); - EXPECT_FALSE(value->IsString()); - - DestroyTest(); - } - - void RunArrayValueTest() { - CefRefPtr context = GetContext(); - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr value = CefV8Value::CreateArray(0); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsArray()); - EXPECT_EQ(0, value->GetArrayLength()); - - // Test addng values. - EXPECT_FALSE(value->HasValue(0)); - EXPECT_FALSE(value->HasValue(1)); - - EXPECT_TRUE(value->SetValue(0, CefV8Value::CreateInt(10))); - EXPECT_FALSE(value->HasException()); - EXPECT_TRUE(value->HasValue(0)); - EXPECT_FALSE(value->HasValue(1)); - - EXPECT_TRUE(value->GetValue(0)->IsInt()); - EXPECT_EQ(10, value->GetValue(0)->GetIntValue()); - EXPECT_FALSE(value->HasException()); - EXPECT_EQ(1, value->GetArrayLength()); - - EXPECT_TRUE(value->SetValue(1, CefV8Value::CreateInt(43))); - EXPECT_FALSE(value->HasException()); - EXPECT_TRUE(value->HasValue(0)); - EXPECT_TRUE(value->HasValue(1)); - - EXPECT_TRUE(value->GetValue(1)->IsInt()); - EXPECT_EQ(43, value->GetValue(1)->GetIntValue()); - EXPECT_FALSE(value->HasException()); - EXPECT_EQ(2, value->GetArrayLength()); - - EXPECT_TRUE(value->DeleteValue(0)); - EXPECT_FALSE(value->HasValue(0)); - EXPECT_TRUE(value->HasValue(1)); - EXPECT_EQ(2, value->GetArrayLength()); - - EXPECT_TRUE(value->DeleteValue(1)); - EXPECT_FALSE(value->HasValue(0)); - EXPECT_FALSE(value->HasValue(1)); - EXPECT_EQ(2, value->GetArrayLength()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunObjectCreateTest() { - CefRefPtr context = GetContext(); - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr value = CefV8Value::CreateObject(NULL); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsObject()); - EXPECT_FALSE(value->GetUserData().get()); - - EXPECT_FALSE(value->IsUndefined()); - EXPECT_FALSE(value->IsArray()); - EXPECT_FALSE(value->IsBool()); - EXPECT_FALSE(value->IsDate()); - EXPECT_FALSE(value->IsDouble()); - EXPECT_FALSE(value->IsFunction()); - EXPECT_FALSE(value->IsInt()); - EXPECT_FALSE(value->IsUInt()); - EXPECT_FALSE(value->IsNull()); - EXPECT_FALSE(value->IsString()); - - DestroyTest(); - } - - void RunObjectUserDataTest() { - CefRefPtr context = GetContext(); - - class UserData : public CefBase { - public: - explicit UserData(int value) : value_(value) {} - int value_; - IMPLEMENT_REFCOUNTING(UserData); - }; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr value = CefV8Value::CreateObject(NULL); - EXPECT_TRUE(value.get()); - - EXPECT_TRUE(value->SetUserData(new UserData(10))); - - CefRefPtr user_data = value->GetUserData(); - EXPECT_TRUE(user_data.get()); - UserData* user_data_impl = static_cast(user_data.get()); - EXPECT_EQ(10, user_data_impl->value_); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunObjectAccessorTest() { - CefRefPtr context = GetContext(); - - static const char* kName = "val"; - static const int kValue = 20; - - class Accessor : public CefV8Accessor { - public: - Accessor() : value_(0) {} - virtual bool Get(const CefString& name, - const CefRefPtr object, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - EXPECT_STREQ(kName, name.ToString().c_str()); - - EXPECT_TRUE(object.get()); - EXPECT_TRUE(object->IsSame(object_)); - - EXPECT_FALSE(retval.get()); - EXPECT_TRUE(exception.empty()); - - got_get_.yes(); - retval = CefV8Value::CreateInt(value_); - EXPECT_EQ(kValue, retval->GetIntValue()); - return true; - } - - virtual bool Set(const CefString& name, - const CefRefPtr object, - const CefRefPtr value, - CefString& exception) OVERRIDE { - EXPECT_STREQ(kName, name.ToString().c_str()); - - EXPECT_TRUE(object.get()); - EXPECT_TRUE(object->IsSame(object_)); - - EXPECT_TRUE(value.get()); - EXPECT_TRUE(exception.empty()); - - got_set_.yes(); - value_ = value->GetIntValue(); - EXPECT_EQ(kValue, value_); - return true; - } - - CefRefPtr object_; - int value_; - TrackCallback got_get_; - TrackCallback got_set_; - - IMPLEMENT_REFCOUNTING(Accessor); - }; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - Accessor* accessor = new Accessor; - CefRefPtr accessorPtr(accessor); - - CefRefPtr object = CefV8Value::CreateObject(accessor); - EXPECT_TRUE(object.get()); - accessor->object_ = object; - - EXPECT_FALSE(object->HasValue(kName)); - - EXPECT_TRUE(object->SetValue(kName, V8_ACCESS_CONTROL_DEFAULT, - V8_PROPERTY_ATTRIBUTE_NONE)); - EXPECT_FALSE(object->HasException()); - EXPECT_TRUE(object->HasValue(kName)); - - EXPECT_TRUE(object->SetValue(kName, CefV8Value::CreateInt(kValue), - V8_PROPERTY_ATTRIBUTE_NONE)); - EXPECT_FALSE(object->HasException()); - EXPECT_TRUE(accessor->got_set_); - EXPECT_EQ(kValue, accessor->value_); - - CefRefPtr val = object->GetValue(kName); - EXPECT_FALSE(object->HasException()); - EXPECT_TRUE(val.get()); - EXPECT_TRUE(accessor->got_get_); - EXPECT_TRUE(val->IsInt()); - EXPECT_EQ(kValue, val->GetIntValue()); - - accessor->object_ = NULL; - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunObjectAccessorExceptionTest() { - CefRefPtr context = GetContext(); - - static const char* kName = "val"; - static const char* kGetException = "My get exception"; - static const char* kSetException = "My set exception"; - static const char* kGetExceptionMsg = "Uncaught Error: My get exception"; - static const char* kSetExceptionMsg = "Uncaught Error: My set exception"; - - class Accessor : public CefV8Accessor { - public: - Accessor() {} - virtual bool Get(const CefString& name, - const CefRefPtr object, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - got_get_.yes(); - exception = kGetException; - return true; - } - - virtual bool Set(const CefString& name, - const CefRefPtr object, - const CefRefPtr value, - CefString& exception) OVERRIDE { - got_set_.yes(); - exception = kSetException; - return true; - } - - TrackCallback got_get_; - TrackCallback got_set_; - - IMPLEMENT_REFCOUNTING(Accessor); - }; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr exception; - Accessor* accessor = new Accessor; - CefRefPtr accessorPtr(accessor); - - CefRefPtr object = CefV8Value::CreateObject(accessor); - EXPECT_TRUE(object.get()); - - EXPECT_FALSE(object->HasValue(kName)); - - EXPECT_TRUE(object->SetValue(kName, V8_ACCESS_CONTROL_DEFAULT, - V8_PROPERTY_ATTRIBUTE_NONE)); - EXPECT_FALSE(object->HasException()); - EXPECT_TRUE(object->HasValue(kName)); - - EXPECT_FALSE(object->SetValue(kName, CefV8Value::CreateInt(1), - V8_PROPERTY_ATTRIBUTE_NONE)); - EXPECT_TRUE(object->HasException()); - EXPECT_TRUE(accessor->got_set_); - exception = object->GetException(); - EXPECT_TRUE(exception.get()); - EXPECT_STREQ(kSetExceptionMsg, exception->GetMessage().ToString().c_str()); - - EXPECT_TRUE(object->ClearException()); - EXPECT_FALSE(object->HasException()); - - CefRefPtr val = object->GetValue(kName); - EXPECT_FALSE(val.get()); - EXPECT_TRUE(object->HasException()); - EXPECT_TRUE(accessor->got_get_); - exception = object->GetException(); - EXPECT_TRUE(exception.get()); - EXPECT_STREQ(kGetExceptionMsg, exception->GetMessage().ToString().c_str()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunObjectAccessorFailTest() { - CefRefPtr context = GetContext(); - - static const char* kName = "val"; - - class Accessor : public CefV8Accessor { - public: - Accessor() {} - virtual bool Get(const CefString& name, - const CefRefPtr object, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - got_get_.yes(); - return false; - } - - virtual bool Set(const CefString& name, - const CefRefPtr object, - const CefRefPtr value, - CefString& exception) OVERRIDE { - got_set_.yes(); - return false; - } - - TrackCallback got_get_; - TrackCallback got_set_; - - IMPLEMENT_REFCOUNTING(Accessor); - }; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr exception; - Accessor* accessor = new Accessor; - CefRefPtr accessorPtr(accessor); - - CefRefPtr object = CefV8Value::CreateObject(accessor); - EXPECT_TRUE(object.get()); - - EXPECT_FALSE(object->HasValue(kName)); - - EXPECT_TRUE(object->SetValue(kName, V8_ACCESS_CONTROL_DEFAULT, - V8_PROPERTY_ATTRIBUTE_NONE)); - EXPECT_FALSE(object->HasException()); - EXPECT_TRUE(object->HasValue(kName)); - - EXPECT_TRUE(object->SetValue(kName, CefV8Value::CreateInt(1), - V8_PROPERTY_ATTRIBUTE_NONE)); - EXPECT_FALSE(object->HasException()); - EXPECT_TRUE(accessor->got_set_); - - CefRefPtr val = object->GetValue(kName); - EXPECT_TRUE(val.get()); - EXPECT_FALSE(object->HasException()); - EXPECT_TRUE(accessor->got_get_); - EXPECT_TRUE(val->IsUndefined()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunObjectAccessorReadOnlyTest() { - CefRefPtr context = GetContext(); - - static const char* kName = "val"; - - class Accessor : public CefV8Accessor { - public: - Accessor() {} - virtual bool Get(const CefString& name, - const CefRefPtr object, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - got_get_.yes(); - return true; - } - - virtual bool Set(const CefString& name, - const CefRefPtr object, - const CefRefPtr value, - CefString& exception) OVERRIDE { - got_set_.yes(); - return true; - } - - TrackCallback got_get_; - TrackCallback got_set_; - - IMPLEMENT_REFCOUNTING(Accessor); - }; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr exception; - Accessor* accessor = new Accessor; - CefRefPtr accessorPtr(accessor); - - CefRefPtr object = CefV8Value::CreateObject(accessor); - EXPECT_TRUE(object.get()); - - EXPECT_FALSE(object->HasValue(kName)); - - EXPECT_TRUE(object->SetValue(kName, V8_ACCESS_CONTROL_DEFAULT, - V8_PROPERTY_ATTRIBUTE_READONLY)); - EXPECT_FALSE(object->HasException()); - EXPECT_TRUE(object->HasValue(kName)); - - EXPECT_TRUE(object->SetValue(kName, CefV8Value::CreateInt(1), - V8_PROPERTY_ATTRIBUTE_NONE)); - EXPECT_FALSE(object->HasException()); - EXPECT_FALSE(accessor->got_set_); - - CefRefPtr val = object->GetValue(kName); - EXPECT_TRUE(val.get()); - EXPECT_FALSE(object->HasException()); - EXPECT_TRUE(accessor->got_get_); - EXPECT_TRUE(val->IsUndefined()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunObjectValueTest() { - CefRefPtr context = GetContext(); - - static const char* kName = "test_arg"; - static const int kVal1 = 13; - static const int kVal2 = 65; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr object = context->GetGlobal(); - EXPECT_TRUE(object.get()); - - object->SetValue(kName, CefV8Value::CreateInt(kVal1), - V8_PROPERTY_ATTRIBUTE_NONE); - - std::stringstream test; - test << - "if (window." << kName << " != " << kVal1 << ") throw 'Fail';\n" << - "window." << kName << " = " << kVal2 << ";"; - - CefRefPtr retval; - CefRefPtr exception; - - EXPECT_TRUE(context->Eval(test.str(), retval, exception)); - if (exception.get()) - ADD_FAILURE() << exception->GetMessage().c_str(); - - CefRefPtr newval = object->GetValue(kName); - EXPECT_TRUE(newval.get()); - EXPECT_TRUE(newval->IsInt()); - EXPECT_EQ(kVal2, newval->GetIntValue()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunObjectValueReadOnlyTest() { - CefRefPtr context = GetContext(); - - static const char* kName = "test_arg"; - static const int kVal1 = 13; - static const int kVal2 = 65; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr object = context->GetGlobal(); - EXPECT_TRUE(object.get()); - - object->SetValue(kName, CefV8Value::CreateInt(kVal1), - V8_PROPERTY_ATTRIBUTE_READONLY); - - std::stringstream test; - test << - "if (window." << kName << " != " << kVal1 << ") throw 'Fail';\n" << - "window." << kName << " = " << kVal2 << ";"; - - CefRefPtr retval; - CefRefPtr exception; - - EXPECT_TRUE(context->Eval(test.str(), retval, exception)); - if (exception.get()) - ADD_FAILURE() << exception->GetMessage().c_str(); - - CefRefPtr newval = object->GetValue(kName); - EXPECT_TRUE(newval.get()); - EXPECT_TRUE(newval->IsInt()); - EXPECT_EQ(kVal1, newval->GetIntValue()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunObjectValueEnumTest() { - CefRefPtr context = GetContext(); - - static const char* kObjName = "test_obj"; - static const char* kArgName = "test_arg"; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr object = context->GetGlobal(); - EXPECT_TRUE(object.get()); - - CefRefPtr obj1 = CefV8Value::CreateObject(NULL); - object->SetValue(kObjName, obj1, V8_PROPERTY_ATTRIBUTE_NONE); - - obj1->SetValue(kArgName, CefV8Value::CreateInt(0), - V8_PROPERTY_ATTRIBUTE_NONE); - - std::stringstream test; - test << - "for (var i in window." << kObjName << ") {\n" - "window." << kObjName << "[i]++;\n" - "}"; - - CefRefPtr retval; - CefRefPtr exception; - - EXPECT_TRUE(context->Eval(test.str(), retval, exception)); - if (exception.get()) - ADD_FAILURE() << exception->GetMessage().c_str(); - - CefRefPtr newval = obj1->GetValue(kArgName); - EXPECT_TRUE(newval.get()); - EXPECT_TRUE(newval->IsInt()); - EXPECT_EQ(1, newval->GetIntValue()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunObjectValueDontEnumTest() { - CefRefPtr context = GetContext(); - - static const char* kObjName = "test_obj"; - static const char* kArgName = "test_arg"; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr object = context->GetGlobal(); - EXPECT_TRUE(object.get()); - - CefRefPtr obj1 = CefV8Value::CreateObject(NULL); - object->SetValue(kObjName, obj1, V8_PROPERTY_ATTRIBUTE_NONE); - - obj1->SetValue(kArgName, CefV8Value::CreateInt(0), - V8_PROPERTY_ATTRIBUTE_DONTENUM); - - std::stringstream test; - test << - "for (var i in window." << kObjName << ") {\n" - "window." << kObjName << "[i]++;\n" - "}"; - - CefRefPtr retval; - CefRefPtr exception; - - EXPECT_TRUE(context->Eval(test.str(), retval, exception)); - if (exception.get()) - ADD_FAILURE() << exception->GetMessage().c_str(); - - CefRefPtr newval = obj1->GetValue(kArgName); - EXPECT_TRUE(newval.get()); - EXPECT_TRUE(newval->IsInt()); - EXPECT_EQ(0, newval->GetIntValue()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunObjectValueDeleteTest() { - CefRefPtr context = GetContext(); - - static const char* kName = "test_arg"; - static const int kVal1 = 13; - static const int kVal2 = 65; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr object = context->GetGlobal(); - EXPECT_TRUE(object.get()); - - object->SetValue(kName, CefV8Value::CreateInt(kVal1), - V8_PROPERTY_ATTRIBUTE_NONE); - - std::stringstream test; - test << - "if (window." << kName << " != " << kVal1 << ") throw 'Fail';\n" << - "window." << kName << " = " << kVal2 << ";\n" - "delete window." << kName << ";"; - - CefRefPtr retval; - CefRefPtr exception; - - EXPECT_TRUE(context->Eval(test.str(), retval, exception)); - if (exception.get()) - ADD_FAILURE() << exception->GetMessage().c_str(); - - CefRefPtr newval = object->GetValue(kName); - EXPECT_TRUE(newval.get()); - EXPECT_TRUE(newval->IsUndefined()); - EXPECT_FALSE(newval->IsInt()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunObjectValueDontDeleteTest() { - CefRefPtr context = GetContext(); - - static const char* kName = "test_arg"; - static const int kVal1 = 13; - static const int kVal2 = 65; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr object = context->GetGlobal(); - EXPECT_TRUE(object.get()); - - object->SetValue(kName, CefV8Value::CreateInt(kVal1), - V8_PROPERTY_ATTRIBUTE_DONTDELETE); - - std::stringstream test; - test << - "if (window." << kName << " != " << kVal1 << ") throw 'Fail';\n" << - "window." << kName << " = " << kVal2 << ";\n" - "delete window." << kName << ";"; - - CefRefPtr retval; - CefRefPtr exception; - - EXPECT_TRUE(context->Eval(test.str(), retval, exception)); - if (exception.get()) - ADD_FAILURE() << exception->GetMessage().c_str(); - - CefRefPtr newval = object->GetValue(kName); - EXPECT_TRUE(newval.get()); - EXPECT_TRUE(newval->IsInt()); - EXPECT_EQ(kVal2, newval->GetIntValue()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunObjectValueEmptyKeyTest() { - CefRefPtr context = GetContext(); - - static const char* kName = ""; - static const int kVal = 13; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr object = context->GetGlobal(); - EXPECT_TRUE(object.get()); - - EXPECT_FALSE(object->HasValue(kName)); - - object->SetValue(kName, CefV8Value::CreateInt(kVal), - V8_PROPERTY_ATTRIBUTE_NONE); - EXPECT_TRUE(object->HasValue(kName)); - - CefRefPtr newval = object->GetValue(kName); - EXPECT_TRUE(newval.get()); - EXPECT_TRUE(newval->IsInt()); - EXPECT_EQ(kVal, newval->GetIntValue()); - - EXPECT_TRUE(object->DeleteValue(kName)); - EXPECT_FALSE(object->HasValue(kName)); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunFunctionCreateTest() { - CefRefPtr context = GetContext(); - - class Handler : public CefV8Handler { - public: - Handler() {} - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { return false; } - IMPLEMENT_REFCOUNTING(Handler); - }; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr value = CefV8Value::CreateFunction("f", new Handler); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsFunction()); - EXPECT_TRUE(value->IsObject()); - - EXPECT_FALSE(value->IsUndefined()); - EXPECT_FALSE(value->IsArray()); - EXPECT_FALSE(value->IsBool()); - EXPECT_FALSE(value->IsDate()); - EXPECT_FALSE(value->IsDouble()); - EXPECT_FALSE(value->IsInt()); - EXPECT_FALSE(value->IsUInt()); - EXPECT_FALSE(value->IsNull()); - EXPECT_FALSE(value->IsString()); - - DestroyTest(); - } - - void RunFunctionHandlerTest() { - CefRefPtr context = GetContext(); - - static const char* kFuncName = "myfunc"; - static const int kVal1 = 32; - static const int kVal2 = 41; - static const int kRetVal = 8; - - class Handler : public CefV8Handler { - public: - Handler() {} - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - EXPECT_STREQ(kFuncName, name.ToString().c_str()); - EXPECT_TRUE(object->IsSame(object_)); - - EXPECT_EQ((size_t)2, arguments.size()); - EXPECT_TRUE(arguments[0]->IsInt()); - EXPECT_EQ(kVal1, arguments[0]->GetIntValue()); - EXPECT_TRUE(arguments[1]->IsInt()); - EXPECT_EQ(kVal2, arguments[1]->GetIntValue()); - - EXPECT_TRUE(exception.empty()); - - retval = CefV8Value::CreateInt(kRetVal); - EXPECT_TRUE(retval.get()); - EXPECT_EQ(kRetVal, retval->GetIntValue()); - - got_execute_.yes(); - return true; - } - - CefRefPtr object_; - TrackCallback got_execute_; - - IMPLEMENT_REFCOUNTING(Handler); - }; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - Handler* handler = new Handler; - CefRefPtr handlerPtr(handler); - - CefRefPtr func = - CefV8Value::CreateFunction(kFuncName, handler); - EXPECT_TRUE(func.get()); - - CefRefPtr obj = CefV8Value::CreateObject(NULL); - EXPECT_TRUE(obj.get()); - handler->object_ = obj; - - CefV8ValueList args; - args.push_back(CefV8Value::CreateInt(kVal1)); - args.push_back(CefV8Value::CreateInt(kVal2)); - - CefRefPtr retval = func->ExecuteFunction(obj, args); - EXPECT_TRUE(handler->got_execute_); - EXPECT_TRUE(retval.get()); - EXPECT_FALSE(func->HasException()); - EXPECT_TRUE(retval->IsInt()); - EXPECT_EQ(kRetVal, retval->GetIntValue()); - - handler->object_ = NULL; - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunFunctionHandlerExceptionTest() { - CefRefPtr context = GetContext(); - - static const char* kException = "My error"; - static const char* kExceptionMsg = "Uncaught Error: My error"; - - class Handler : public CefV8Handler { - public: - Handler() {} - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - exception = kException; - got_execute_.yes(); - return true; - } - - TrackCallback got_execute_; - - IMPLEMENT_REFCOUNTING(Handler); - }; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - Handler* handler = new Handler; - CefRefPtr handlerPtr(handler); - - CefRefPtr func = - CefV8Value::CreateFunction("myfunc", handler); - EXPECT_TRUE(func.get()); - - CefV8ValueList args; - - CefRefPtr retval = func->ExecuteFunction(NULL, args); - EXPECT_TRUE(handler->got_execute_); - EXPECT_FALSE(retval.get()); - EXPECT_TRUE(func->HasException()); - CefRefPtr exception = func->GetException(); - EXPECT_TRUE(exception.get()); - EXPECT_STREQ(kExceptionMsg, exception->GetMessage().ToString().c_str()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunFunctionHandlerFailTest() { - CefRefPtr context = GetContext(); - - class Handler : public CefV8Handler { - public: - Handler() {} - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - got_execute_.yes(); - return false; - } - - TrackCallback got_execute_; - - IMPLEMENT_REFCOUNTING(Handler); - }; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - Handler* handler = new Handler; - CefRefPtr handlerPtr(handler); - - CefRefPtr func = - CefV8Value::CreateFunction("myfunc", handler); - EXPECT_TRUE(func.get()); - - CefV8ValueList args; - - CefRefPtr retval = func->ExecuteFunction(NULL, args); - EXPECT_TRUE(handler->got_execute_); - EXPECT_TRUE(retval.get()); - EXPECT_FALSE(func->HasException()); - EXPECT_TRUE(retval->IsUndefined()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunFunctionHandlerNoObjectTest() { - CefRefPtr context = GetContext(); - - class Handler : public CefV8Handler { - public: - Handler() {} - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - EXPECT_TRUE(object.get()); - CefRefPtr context = CefV8Context::GetCurrentContext(); - EXPECT_TRUE(context.get()); - CefRefPtr global = context->GetGlobal(); - EXPECT_TRUE(global.get()); - EXPECT_TRUE(global->IsSame(object)); - - got_execute_.yes(); - return true; - } - - TrackCallback got_execute_; - - IMPLEMENT_REFCOUNTING(Handler); - }; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - Handler* handler = new Handler; - CefRefPtr handlerPtr(handler); - - CefRefPtr func = - CefV8Value::CreateFunction("myfunc", handler); - EXPECT_TRUE(func.get()); - - CefV8ValueList args; - - CefRefPtr retval = func->ExecuteFunction(NULL, args); - EXPECT_TRUE(handler->got_execute_); - EXPECT_TRUE(retval.get()); - EXPECT_FALSE(func->HasException()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunFunctionHandlerWithContextTest() { - CefRefPtr context = GetContext(); - - class Handler : public CefV8Handler { - public: - Handler() {} - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - CefRefPtr context = CefV8Context::GetCurrentContext(); - EXPECT_TRUE(context.get()); - EXPECT_TRUE(context->IsSame(context_)); - got_execute_.yes(); - return true; - } - - CefRefPtr context_; - TrackCallback got_execute_; - - IMPLEMENT_REFCOUNTING(Handler); - }; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - Handler* handler = new Handler; - CefRefPtr handlerPtr(handler); - handler->context_ = context; - - CefRefPtr func = - CefV8Value::CreateFunction("myfunc", handler); - EXPECT_TRUE(func.get()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - CefV8ValueList args; - - CefRefPtr retval = - func->ExecuteFunctionWithContext(context, NULL, args); - EXPECT_TRUE(handler->got_execute_); - EXPECT_TRUE(retval.get()); - EXPECT_FALSE(func->HasException()); - - handler->context_ = NULL; - - DestroyTest(); - } - - void RunContextEvalTest() { - CefRefPtr context = GetContext(); - - CefRefPtr retval; - CefRefPtr exception; - - EXPECT_TRUE(context->Eval("1+2", retval, exception)); - EXPECT_TRUE(retval.get()); - EXPECT_TRUE(retval->IsInt()); - EXPECT_EQ(3, retval->GetIntValue()); - EXPECT_FALSE(exception.get()); - - DestroyTest(); - } - - void RunContextEvalExceptionTest() { - CefRefPtr context = GetContext(); - - CefRefPtr retval; - CefRefPtr exception; - - EXPECT_FALSE(context->Eval("1+foo", retval, exception)); - EXPECT_FALSE(retval.get()); - EXPECT_TRUE(exception.get()); - - DestroyTest(); - } - - void RunContextEnteredTest() { - CefRefPtr context = GetContext(); - - CefRefPtr retval; - CefRefPtr exception; - - // Test value defined in OnContextCreated - EXPECT_TRUE(context->Eval( - "document.getElementById('f').contentWindow.v8_context_entered_test()", - retval, exception)); - if (exception.get()) - ADD_FAILURE() << exception->GetMessage().c_str(); - - EXPECT_TRUE(retval.get()); - EXPECT_TRUE(retval->IsInt()); - EXPECT_EQ(21, retval->GetIntValue()); - - DestroyTest(); - } - - void RunBindingTest() { - CefRefPtr context = GetContext(); - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - CefRefPtr object = context->GetGlobal(); - EXPECT_TRUE(object.get()); - - // Test value defined in OnContextCreated - CefRefPtr value = object->GetValue("v8_binding_test"); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsInt()); - EXPECT_EQ(12, value->GetIntValue()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunStackTraceTest() { - CefRefPtr context = GetContext(); - - static const char* kFuncName = "myfunc"; - - class Handler : public CefV8Handler { - public: - Handler() {} - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - EXPECT_STREQ(kFuncName, name.ToString().c_str()); - - stack_trace_ = CefV8StackTrace::GetCurrent(10); - - retval = CefV8Value::CreateInt(3); - got_execute_.yes(); - return true; - } - - TrackCallback got_execute_; - CefRefPtr stack_trace_; - - IMPLEMENT_REFCOUNTING(Handler); - }; - - // Enter the V8 context. - EXPECT_TRUE(context->Enter()); - - Handler* handler = new Handler; - CefRefPtr handlerPtr(handler); - - CefRefPtr func = - CefV8Value::CreateFunction(kFuncName, handler); - EXPECT_TRUE(func.get()); - CefRefPtr obj = context->GetGlobal(); - EXPECT_TRUE(obj.get()); - obj->SetValue(kFuncName, func, V8_PROPERTY_ATTRIBUTE_NONE); - - CefRefPtr retval; - CefRefPtr exception; - - EXPECT_TRUE(context->Eval( - "function jsfunc() { return window.myfunc(); }\n" - "jsfunc();", - retval, exception)); - EXPECT_TRUE(retval.get()); - EXPECT_TRUE(retval->IsInt()); - EXPECT_EQ(3, retval->GetIntValue()); - EXPECT_FALSE(exception.get()); - - EXPECT_TRUE(handler->stack_trace_.get()); - EXPECT_EQ(2, handler->stack_trace_->GetFrameCount()); - - CefRefPtr frame; - - frame = handler->stack_trace_->GetFrame(0); - EXPECT_TRUE(frame->GetScriptName().empty()); - EXPECT_TRUE(frame->GetScriptNameOrSourceURL().empty()); - EXPECT_STREQ("jsfunc", frame->GetFunctionName().ToString().c_str()); - EXPECT_EQ(1, frame->GetLineNumber()); - EXPECT_EQ(35, frame->GetColumn()); - EXPECT_TRUE(frame.get()); - EXPECT_TRUE(frame->IsEval()); - EXPECT_FALSE(frame->IsConstructor()); - - frame = handler->stack_trace_->GetFrame(1); - EXPECT_TRUE(frame->GetScriptName().empty()); - EXPECT_TRUE(frame->GetScriptNameOrSourceURL().empty()); - EXPECT_TRUE(frame->GetFunctionName().empty()); - EXPECT_EQ(2, frame->GetLineNumber()); - EXPECT_EQ(1, frame->GetColumn()); - EXPECT_TRUE(frame.get()); - EXPECT_TRUE(frame->IsEval()); - EXPECT_FALSE(frame->IsConstructor()); - - // Exit the V8 context. - EXPECT_TRUE(context->Exit()); - - DestroyTest(); - } - - void RunOnUncaughtExceptionTest() { - test_context_ = - GetBrowser()->GetMainFrame()->GetV8Context(); - GetBrowser()->GetMainFrame()->ExecuteJavaScript( - "window.setTimeout(test, 0);", "about:blank", 0); - } - - void RunOnUncaughtExceptionDevToolsTest() { - test_context_ = - GetBrowser()->GetMainFrame()->GetV8Context(); - GetBrowser()->ShowDevTools(); - } - - void DevToolsLoadHook(CefRefPtr browser) { - EXPECT_TRUE(browser->IsPopup()); - CefRefPtr context = browser->GetMainFrame()->GetV8Context(); - static const char* kFuncName = "DevToolsLoaded"; - - class Handler : public CefV8Handler { - public: - Handler() {} - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - EXPECT_STREQ(kFuncName, name.ToString().c_str()); - if (name == kFuncName) { - EXPECT_TRUE(exception.empty()); - retval = CefV8Value::CreateNull(); - EXPECT_TRUE(retval.get()); - test_handler_->DevToolsLoaded(browser_); - return true; - } - return false; - } - CefRefPtr test_handler_; - CefRefPtr browser_; - IMPLEMENT_REFCOUNTING(Handler); - }; - - EXPECT_TRUE(context->Enter()); - Handler* handler = new Handler; - handler->test_handler_ = this; - handler->browser_ = browser; - CefRefPtr handlerPtr(handler); - CefRefPtr func = - CefV8Value::CreateFunction(kFuncName, handler); - EXPECT_TRUE(func.get()); - EXPECT_TRUE(context->GetGlobal()->SetValue( - kFuncName, func, V8_PROPERTY_ATTRIBUTE_NONE)); - EXPECT_TRUE(context->Exit()); - - // Call DevToolsLoaded() when DevTools window completed loading. - std::string jsCode = "(function(){" - " var oldLoadCompleted = InspectorFrontendAPI.loadCompleted;" - " if (InspectorFrontendAPI._isLoaded) {" - " window.DevToolsLoaded();" - " } else {" - " InspectorFrontendAPI.loadCompleted = function(){" - " oldLoadCompleted.call(InspectorFrontendAPI);" - " window.DevToolsLoaded();" - " };" - " }" - "})();"; - - CefRefPtr retval; - CefRefPtr exception; - EXPECT_TRUE(context->Eval(CefString(jsCode), retval, exception)); - } - - void DevToolsLoaded(CefRefPtr browser) { - EXPECT_TRUE(browser->IsPopup()); - // A call to setCaptureCallStackForUncaughtException(true) is delayed, - // posting a task solves the timing issue. - CefPostTask(TID_UI, - NewCefRunnableMethod(this, &V8TestHandler::DevToolsFullyLoaded)); - // The order of calls will be: - // DevToolsLoaded() - // ScriptController::setCaptureCallStackForUncaughtExceptions(1) - // DevToolsFullyLoaded() - // ScriptController::setCaptureCallStackForUncaughtExceptions(0) - // DevToolsClosed() - } - - void DevToolsFullyLoaded() { - GetBrowser()->CloseDevTools(); - // A call to setCaptureCallStackForUncaughtException(false) is delayed, - // posting a task solves the timing issue. - CefPostTask(TID_UI, - NewCefRunnableMethod(this, &V8TestHandler::DevToolsClosed)); - } - - void DevToolsClosed() { - GetBrowser()->GetMainFrame()->ExecuteJavaScript( - "window.setTimeout(test, 0);", "about:blank", 0); - } - - void OnUncaughtException(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr context, - CefRefPtr exception, - CefRefPtr stackTrace) OVERRIDE { - got_on_uncaught_exception_.yes(); - - if (test_mode_ == V8TEST_ON_UNCAUGHT_EXCEPTION || - test_mode_ == V8TEST_ON_UNCAUGHT_EXCEPTION_DEV_TOOLS) { - EXPECT_TRUE(test_context_->IsSame(context)); - EXPECT_STREQ("Uncaught ReferenceError: asd is not defined", - exception->GetMessage().ToString().c_str()); - std::ostringstream stackFormatted; - for (int i = 0; i < stackTrace->GetFrameCount(); ++i) - stackFormatted << "at " - << stackTrace->GetFrame(i)->GetFunctionName().ToString() - << "() in " << stackTrace->GetFrame(i)->GetScriptName().ToString() - << " on line " << stackTrace->GetFrame(i)->GetLineNumber() << "\n"; - const char* stackFormattedShouldBe = - "at test2() in http://tests/V8Test.OnUncaughtException on line 3\n" - "at test() in http://tests/V8Test.OnUncaughtException on line 2\n"; - EXPECT_STREQ(stackFormattedShouldBe, stackFormatted.str().c_str()); - DestroyTest(); - } - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - if (test_mode_ == V8TEST_ON_UNCAUGHT_EXCEPTION_DEV_TOOLS && - browser->IsPopup()) { - DevToolsLoadHook(browser); - return; - } - std::string url = frame->GetURL(); - if (frame->IsMain() && url != kV8NavTestUrl) - RunTest(test_mode_); - } - - virtual void OnContextCreated(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr context) OVERRIDE { - std::string url = frame->GetURL(); - if (url == kV8ContextChildTestUrl) { - // For V8TEST_CONTEXT_ENTERED - class Handler : public CefV8Handler { - public: - Handler() {} - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) OVERRIDE { - // context for the sub-frame - CefRefPtr context = CefV8Context::GetCurrentContext(); - EXPECT_TRUE(context.get()); - - // entered context should be the same as the main frame context - CefRefPtr entered = CefV8Context::GetEnteredContext(); - EXPECT_TRUE(entered.get()); - EXPECT_TRUE(entered->IsSame(context_)); - - context_ = NULL; - retval = CefV8Value::CreateInt(21); - return true; - } - - CefRefPtr context_; - IMPLEMENT_REFCOUNTING(Handler); - }; - - Handler* handler = new Handler; - CefRefPtr handlerPtr(handler); - - // main frame context - handler->context_ = GetContext(); - - // Function that will be called from the parent frame context. - CefRefPtr func = - CefV8Value::CreateFunction("v8_context_entered_test", handler); - EXPECT_TRUE(func.get()); - - CefRefPtr object = context->GetGlobal(); - EXPECT_TRUE(object.get()); - EXPECT_TRUE(object->SetValue("v8_context_entered_test", func, - V8_PROPERTY_ATTRIBUTE_NONE)); - } else if (url == kV8BindingTestUrl) { - // For V8TEST_BINDING - CefRefPtr object = context->GetGlobal(); - EXPECT_TRUE(object.get()); - EXPECT_TRUE(object->SetValue("v8_binding_test", - CefV8Value::CreateInt(12), - V8_PROPERTY_ATTRIBUTE_NONE)); - } - } - - virtual void OnContextReleased(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr context) OVERRIDE { - std::string url = frame->GetURL(); - if (test_mode_ == V8TEST_CONTEXT_INVALID && url == test_url_) { - test_context_ = context; - test_object_ = CefV8Value::CreateArray(10); - CefPostTask(TID_UI, - NewCefRunnableMethod(this, &V8TestHandler::DestroyTest)); - } - } - - virtual void DestroyTest() OVERRIDE { - if (test_mode_ == V8TEST_CONTEXT_INVALID) { - // Verify that objects related to a particular context are not valid after - // OnContextReleased is called for that context. - EXPECT_FALSE(test_context_->IsValid()); - EXPECT_FALSE(test_object_->IsValid()); - } else if (test_mode_ == V8TEST_ON_UNCAUGHT_EXCEPTION || - test_mode_ == V8TEST_ON_UNCAUGHT_EXCEPTION_DEV_TOOLS) { - EXPECT_TRUE(got_on_uncaught_exception_); - } - - got_destroy_test_.yes(); - TestHandler::DestroyTest(); - } - - // Return the V8 context. - CefRefPtr GetContext() { - CefRefPtr context = - GetBrowser()->GetMainFrame()->GetV8Context(); - EXPECT_TRUE(context.get()); - return context; - } - - V8TestMode test_mode_; - const char* test_url_; - CefRefPtr test_context_; - CefRefPtr test_object_; - - TrackCallback got_destroy_test_; - TrackCallback got_on_uncaught_exception_; -}; - -} // namespace - - -// Helpers for defining V8 tests. -#define V8_TEST_EX(name, test_mode, test_url) \ - TEST(V8Test, name) { \ - CefRefPtr handler = \ - new V8TestHandler(test_mode, test_url); \ - handler->ExecuteTest(); \ - EXPECT_TRUE(handler->got_destroy_test_); \ - } - -#define V8_TEST(name, test_mode) \ - V8_TEST_EX(name, test_mode, kV8TestUrl) - - -// Define the tests. -V8_TEST(NullCreate, V8TEST_NULL_CREATE); -V8_TEST(BoolCreate, V8TEST_BOOL_CREATE); -V8_TEST(IntCreate, V8TEST_INT_CREATE); -V8_TEST(UIntCreate, V8TEST_UINT_CREATE); -V8_TEST(DoubleCreate, V8TEST_DOUBLE_CREATE); -V8_TEST(DateCreate, V8TEST_DATE_CREATE); -V8_TEST(StringCreate, V8TEST_STRING_CREATE); -V8_TEST(ArrayCreate, V8TEST_ARRAY_CREATE); -V8_TEST(ArrayValue, V8TEST_ARRAY_VALUE); -V8_TEST(ObjectCreate, V8TEST_OBJECT_CREATE); -V8_TEST(ObjectUserData, V8TEST_OBJECT_USERDATA); -V8_TEST(ObjectAccessor, V8TEST_OBJECT_ACCESSOR); -V8_TEST(ObjectAccessorException, V8TEST_OBJECT_ACCESSOR_EXCEPTION); -V8_TEST(ObjectAccessorFail, V8TEST_OBJECT_ACCESSOR_FAIL); -V8_TEST(ObjectAccessorReadOnly, V8TEST_OBJECT_ACCESSOR_READONLY); -V8_TEST(ObjectValue, V8TEST_OBJECT_VALUE); -V8_TEST(ObjectValueReadOnly, V8TEST_OBJECT_VALUE_READONLY); -V8_TEST(ObjectValueEnum, V8TEST_OBJECT_VALUE_ENUM); -V8_TEST(ObjectValueDontEnum, V8TEST_OBJECT_VALUE_DONTENUM); -V8_TEST(ObjectValueDelete, V8TEST_OBJECT_VALUE_DELETE); -V8_TEST(ObjectValueDontDelete, V8TEST_OBJECT_VALUE_DONTDELETE); -V8_TEST(ObjectValueEmptyKey, V8TEST_OBJECT_VALUE_EMPTYKEY); -V8_TEST(FunctionCreate, V8TEST_FUNCTION_CREATE); -V8_TEST(FunctionHandler, V8TEST_FUNCTION_HANDLER); -V8_TEST(FunctionHandlerException, V8TEST_FUNCTION_HANDLER_EXCEPTION); -V8_TEST(FunctionHandlerFail, V8TEST_FUNCTION_HANDLER_FAIL); -V8_TEST(FunctionHandlerNoObject, V8TEST_FUNCTION_HANDLER_NO_OBJECT); -V8_TEST(FunctionHandlerWithContext, V8TEST_FUNCTION_HANDLER_WITH_CONTEXT); -V8_TEST(ContextEval, V8TEST_CONTEXT_EVAL); -V8_TEST(ContextEvalException, V8TEST_CONTEXT_EVAL_EXCEPTION); -V8_TEST_EX(ContextEntered, V8TEST_CONTEXT_ENTERED, NULL); -V8_TEST(ContextInvalid, V8TEST_CONTEXT_INVALID); -V8_TEST_EX(Binding, V8TEST_BINDING, kV8BindingTestUrl); -V8_TEST(StackTrace, V8TEST_STACK_TRACE); -V8_TEST(OnUncaughtException, V8TEST_ON_UNCAUGHT_EXCEPTION); -V8_TEST(OnUncaughtExceptionDevTools, V8TEST_ON_UNCAUGHT_EXCEPTION_DEV_TOOLS); - - -namespace { - -// ExternalMemoryAllocation test handler. -class V8ExternalMemTestHandler : public TestHandler { - public: - explicit V8ExternalMemTestHandler(const std::string& code) { - html_ = ""; - } - - virtual void RunTest() OVERRIDE { - const std::string url = "http://tests/run.html"; - AddResource(url, html_, "text/html"); - CreateBrowser(url); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - if (!browser->IsPopup() && frame->IsMain()) { - frame->ExecuteJavaScript("gc();", "", 0); - DestroyTest(); - } - } - - private: - std::string html_; -}; - -// Base class for V8 unit test handlers. -class V8TestV8Handler : public CefV8Handler { - IMPLEMENT_REFCOUNTING(V8TestV8Handler); -}; - -} // namespace - -TEST(V8Test, ExternalMemoryAllocation) { - class Test : public V8TestV8Handler { - public: - static std::string GetExtensionCode() { - std::string code = - "function createObject() {" - " native function createObject();" - " return createObject();" - "}" - "function checkSize(object) {" - " native function checkSize();" - " return checkSize(object);" - "};"; - return code; - } - - static std::string GetTestCode() { - return "checkSize(createObject());"; - } - - Test() - : object_created_(false), - size_checked_(false) { - } - - virtual bool Execute(const CefString& name, - CefRefPtr object, - const CefV8ValueList& arguments, - CefRefPtr& retval, - CefString& exception) { - static const int kTestSize = 999999999; - if (name == "createObject") { - retval = CefV8Value::CreateObject(CefRefPtr()); - object_created_ = - (retval->AdjustExternallyAllocatedMemory(kTestSize) == kTestSize); - return true; - } else if (name == "checkSize") { - size_checked_ = - arguments[0]->GetExternallyAllocatedMemory() == kTestSize; - return true; - } - return false; - } - - bool object_created_; - bool size_checked_; - }; - - Test* test = new Test(); - CefRegisterExtension("v8/externalMemory", test->GetExtensionCode(), test); - - V8ExternalMemTestHandler* test_handler = - new V8ExternalMemTestHandler(test->GetTestCode()); - test_handler->ExecuteTest(); - - ASSERT_TRUE(test->object_created_); - ASSERT_TRUE(test->size_checked_); -} diff --git a/cef1/tests/unittests/web_urlrequest_unittest.cc b/cef1/tests/unittests/web_urlrequest_unittest.cc deleted file mode 100644 index 78b43ebb1..000000000 --- a/cef1/tests/unittests/web_urlrequest_unittest.cc +++ /dev/null @@ -1,523 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework 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 "include/cef_web_urlrequest.h" -#include "tests/unittests/test_handler.h" - -// #define WEB_URLREQUEST_DEBUG - -class TestResults { - public: - TestResults() - : errorCode(0), - contentLength(0), - statusCode(0), - redirectCount(0) { - } - - int errorCode; - size_t contentLength; - int statusCode; - CefString statusText; - CefString contentLengthHeader; - CefString allHeaders; - CefResponse::HeaderMap headerMap; - - int redirectCount; - - TrackCallback - got_redirect, - got_deleted, - got_started, - got_headers, - got_loading, - got_done, - got_progress, - got_abort, - got_error; -}; - -class BrowserTestHandler : public TestHandler { - public: - // Cancel at state WUR_STATE_UNSENT means that no cancellation - // will occur since that state change is never fired. - BrowserTestHandler(TestResults &tr, - cef_weburlrequest_state_t cancelAtState = WUR_STATE_UNSENT) - : cancelAtState_(cancelAtState), - test_results_(tr) { - } - - virtual void RunTest() OVERRIDE { - std::stringstream testHtml; - testHtml << - "" - "

Testing Web Url Request...

" - ""; - - AddResource("http://tests/run.html", testHtml.str(), "text/html"); - CreateBrowser("http://tests/run.html"); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) { - StartTest(); - } - - void TestCompleted() { - DestroyTest(); - } - - virtual void StartTest() = 0; - - cef_weburlrequest_state_t cancelAtState_; - - TestResults& test_results_; -}; - -class TestWebURLRequestClient : public CefWebURLRequestClient { - public: - TestWebURLRequestClient(TestResults& tr, BrowserTestHandler* browser) - : test_results_(tr), - cancelAtState_(WUR_STATE_UNSENT), - browser_(browser) { - } - - virtual ~TestWebURLRequestClient() { - test_results_.got_deleted.yes(); - } - - bool MaybeCancelRequest(CefRefPtr requester, - RequestState state) { - if (cancelAtState_ == state) { -#ifdef WEB_URLREQUEST_DEBUG - printf(" Cancelling at state %d\n", cancelAtState_); -#endif - requester->Cancel(); - return true; - } - return false; - } - - void OnStateChange(CefRefPtr requester, - RequestState state) { -#ifdef WEB_URLREQUEST_DEBUG - printf("OnStateChange(0x%p, %d)\n", requester.get(), state); -#endif - - if (MaybeCancelRequest(requester, state)) - return; - - switch (state) { - case WUR_STATE_STARTED: - test_results_.got_started.yes(); - break; - case WUR_STATE_HEADERS_RECEIVED: - test_results_.got_headers.yes(); - break; - case WUR_STATE_LOADING: - test_results_.got_loading.yes(); - break; - case WUR_STATE_DONE: - test_results_.got_done.yes(); - if ( contents_.length() ) { - size_t len = contents_.length(); - test_results_.contentLength = len; -#ifdef WEB_URLREQUEST_DEBUG - printf("Response: %lu - %s\n", len, contents_.c_str()); -#endif - } - TestCompleted(); - break; - case WUR_STATE_ABORT: - test_results_.got_abort.yes(); - TestCompleted(); - break; - default: - break; - } - } - - void OnRedirect(CefRefPtr requester, - CefRefPtr request, - CefRefPtr response) { -#ifdef WEB_URLREQUEST_DEBUG - printf("OnRedirect(0x%p, 0x%p, 0x%p)\n", - requester.get(), request.get(), response.get()); -#endif - test_results_.got_redirect.yes(); - ++test_results_.redirectCount; - - CefString url = request->GetURL(); -#ifdef WEB_URLREQUEST_DEBUG - printf("URL = %s\n", url.ToString().c_str()); -#endif - } - - void OnHeadersReceived(CefRefPtr requester, - CefRefPtr response) { -#ifdef WEB_URLREQUEST_DEBUG - printf("OnHeadersReceived(0x%p, 0x%p)\n", requester.get(), response.get()); -#endif - - test_results_.statusCode = response->GetStatus(); - test_results_.statusText = response->GetStatusText(); - test_results_.contentLengthHeader = response->GetHeader("Content-Length"); - response->GetHeaderMap(test_results_.headerMap); - } - - void OnData(CefRefPtr requester, const void *data, - int dataLength) { -#ifdef WEB_URLREQUEST_DEBUG - printf("OnData(0x%p, 0x%p, %d)\n", requester.get(), data, dataLength); -#endif - - // Add data to buffer, create if not already - contents_.append(static_cast(data), dataLength); - } - - void TestCompleted() { - browser_->TestCompleted(); - browser_ = NULL; - requester_ = NULL; - Release(); - } - - void OnProgress(CefRefPtr requester, - uint64 bytesSent, - uint64 totalBytesToBeSent) { -#ifdef WEB_URLREQUEST_DEBUG - printf("OnProgress(0x%p, %d, %d)\n", requester.get(), - (unsigned int)bytesSent, (unsigned int)totalBytesToBeSent); -#endif - test_results_.got_progress.yes(); - } - - void OnError(CefRefPtr requester, - CefWebURLRequestClient::ErrorCode errorCode) { -#ifdef WEB_URLREQUEST_DEBUG - printf("Error(0x%p, %d)\n", requester.get(), errorCode); -#endif - test_results_.errorCode = static_cast(errorCode); - test_results_.got_error.yes(); - TestCompleted(); - } - - bool Run(CefRefPtr req, RequestState - cancelAtState = WUR_STATE_UNSENT) { - if ( requester_.get() ) - return false; - - cancelAtState_ = cancelAtState; - request_ = req; - - // Keep ourselves alive... blanced in TestCompleted() when done. - AddRef(); - - requester_ = CefWebURLRequest::CreateWebURLRequest(request_, this); -#ifdef WEB_URLREQUEST_DEBUG - printf("Created requester at address 0x%p\n", requester_.get()); -#endif - - return requester_.get() != NULL; - } - - protected: - TestResults& test_results_; - RequestState cancelAtState_; - - CefRefPtr browser_; - CefRefPtr requester_; - CefRefPtr request_; - std::string contents_; - - IMPLEMENT_REFCOUNTING(TestWebURLRequestClient); -}; - -TEST(WebURLRequestTest, GET) { - class BrowserForTest : public BrowserTestHandler { - public: - explicit BrowserForTest(TestResults &tr) : BrowserTestHandler(tr) { } - - void StartTest() { - CefRefPtr req; - CefRefPtr postdata; - CefRequest::HeaderMap headers; - - req = CefRequest::CreateRequest(); - - CefString url( - "http://search.twitter.com/search.json?result_type=popular&q=webkit"); - CefString method("GET"); - - req->Set(url, method, postdata, headers); - - CefRefPtr handler = - new TestWebURLRequestClient(test_results_, this); - - req->SetFlags((CefRequest::RequestFlags)( - WUR_FLAG_SKIP_CACHE | - WUR_FLAG_REPORT_LOAD_TIMING | - WUR_FLAG_REPORT_RAW_HEADERS | - WUR_FLAG_REPORT_UPLOAD_PROGRESS)); - - ASSERT_TRUE(handler->Run(req)); - } - }; - - TestResults tr; - CefRefPtr browser = new BrowserForTest(tr); - browser->ExecuteTest(); - - EXPECT_TRUE(tr.got_started); - EXPECT_TRUE(tr.got_headers); - EXPECT_TRUE(tr.got_loading); - EXPECT_TRUE(tr.got_done); - EXPECT_TRUE(tr.got_deleted); - EXPECT_FALSE(tr.got_abort); - EXPECT_FALSE(tr.got_error); - EXPECT_FALSE(tr.got_redirect); - EXPECT_FALSE(tr.got_progress); - EXPECT_GT(tr.contentLength, static_cast(0)); - EXPECT_EQ(200, tr.statusCode); -} - -TEST(WebURLRequestTest, POST) { - class BrowserForTest : public BrowserTestHandler { - public: - explicit BrowserForTest(TestResults &tr) : BrowserTestHandler(tr) { } - - void StartTest() { - CefRefPtr req; - CefRefPtr postdata; - CefRefPtr postitem; - CefRequest::HeaderMap headers; - - headers.insert(std::make_pair("Content-Type", - "application/x-www-form-urlencoded")); - - req = CefRequest::CreateRequest(); - - CefString url("http://pastebin.com/api_public.php"); - CefString method("POST"); - - postdata = CefPostData::CreatePostData(); - postitem = CefPostDataElement::CreatePostDataElement(); - - static char posttext[] = - "paste_name=CEF%20Test%20Post&paste_code=testing a post call." - "&paste_expire_date=10M"; - - postitem->SetToBytes(strlen(posttext), posttext); - postdata->AddElement(postitem); - - req->Set(url, method, postdata, headers); - - CefRefPtr handler = - new TestWebURLRequestClient(test_results_, this); - - req->SetFlags((CefRequest::RequestFlags)( - WUR_FLAG_SKIP_CACHE | - WUR_FLAG_REPORT_LOAD_TIMING | - WUR_FLAG_REPORT_RAW_HEADERS | - WUR_FLAG_REPORT_UPLOAD_PROGRESS)); - - ASSERT_TRUE(handler->Run(req)); - } - }; - - TestResults tr; - CefRefPtr browser = new BrowserForTest(tr); - browser->ExecuteTest(); - - EXPECT_TRUE(tr.got_started); - EXPECT_TRUE(tr.got_headers); - EXPECT_TRUE(tr.got_loading); - EXPECT_TRUE(tr.got_done); - EXPECT_TRUE(tr.got_deleted); - EXPECT_FALSE(tr.got_redirect); - EXPECT_TRUE(tr.got_progress); - EXPECT_FALSE(tr.got_error); - EXPECT_FALSE(tr.got_abort); - EXPECT_GT(tr.contentLength, static_cast(0)); - EXPECT_EQ(200, tr.statusCode); -} - -TEST(WebURLRequestTest, BADHOST) { - class BrowserForTest : public BrowserTestHandler { - public: - explicit BrowserForTest(TestResults &tr) : BrowserTestHandler(tr) { } - - void StartTest() { - CefRefPtr req; - CefRefPtr postdata; - CefRefPtr postitem; - CefRequest::HeaderMap headers; - - req = CefRequest::CreateRequest(); - - CefString url("http://this.host.does.not.exist/not/really/here"); - CefString method("GET"); - - req->Set(url, method, postdata, headers); - - CefRefPtr handler = - new TestWebURLRequestClient(test_results_, this); - - req->SetFlags((CefRequest::RequestFlags)( - WUR_FLAG_SKIP_CACHE | - WUR_FLAG_REPORT_LOAD_TIMING | - WUR_FLAG_REPORT_RAW_HEADERS | - WUR_FLAG_REPORT_UPLOAD_PROGRESS)); - - ASSERT_TRUE(handler->Run(req)); - } - }; - - TestResults tr; - CefRefPtr browser = new BrowserForTest(tr); - browser->ExecuteTest(); - - // NOTE: THIS TEST WILL FAIL IF YOUR ISP REDIRECTS YOU TO - // THEIR SEARCH PAGE ON NXDOMAIN ERRORS. - EXPECT_TRUE(tr.got_started); - EXPECT_FALSE(tr.got_headers); - EXPECT_FALSE(tr.got_loading); - EXPECT_FALSE(tr.got_done); - EXPECT_TRUE(tr.got_deleted); - EXPECT_FALSE(tr.got_redirect); - EXPECT_FALSE(tr.got_progress); - EXPECT_FALSE(tr.got_abort); - EXPECT_TRUE(tr.got_error); - EXPECT_EQ(ERR_NAME_NOT_RESOLVED, tr.errorCode); - EXPECT_EQ(static_cast(0), tr.contentLength); - EXPECT_EQ(0, tr.statusCode); -} - -#define COUNTOF_(ar) (sizeof(ar)/sizeof(ar[0])) - -TEST(WebURLRequestTest, CANCEL) { - class BrowserForTest : public BrowserTestHandler { - public: - BrowserForTest(TestResults &tr, cef_weburlrequest_state_t cancelAtState) - : BrowserTestHandler(tr, cancelAtState) { - } - - void StartTest() { - CefRefPtr req; - CefRefPtr postdata; - CefRefPtr postitem; - CefRequest::HeaderMap headers; - - req = CefRequest::CreateRequest(); - - CefString url( - "http://search.twitter.com/search.json?result_type=popular&q=webkit"); - CefString method("GET"); - - req->Set(url, method, postdata, headers); - - CefRefPtr handler = - new TestWebURLRequestClient(test_results_, this); - - req->SetFlags((CefRequest::RequestFlags)( - WUR_FLAG_SKIP_CACHE | - WUR_FLAG_REPORT_LOAD_TIMING | - WUR_FLAG_REPORT_RAW_HEADERS | - WUR_FLAG_REPORT_UPLOAD_PROGRESS)); - - ASSERT_TRUE(handler->Run(req, cancelAtState_)); - } - }; - - cef_weburlrequest_state_t cancelAt[] = { - WUR_STATE_STARTED, - WUR_STATE_HEADERS_RECEIVED - }; - - for (unsigned int i = 0; i < COUNTOF_(cancelAt); ++i) { - TestResults tr; - CefRefPtr browser = new BrowserForTest(tr, cancelAt[i]); - browser->ExecuteTest(); - EXPECT_TRUE(tr.got_abort) << "i = " << i; - EXPECT_TRUE(tr.got_deleted); - } -} - -// Enable this test if you have installed the php test page. -#if 0 - -TEST(WebURLRequestTest, REDIRECT) { - /* // PHP Script for a local server to test this: - // You can run a zwamp server on windows to run this. - // http://sourceforge.net/projects/zwamp/ - - - */ - - - class BrowserForTest : public BrowserTestHandler { - public: - explicit BrowserForTest(TestResults &tr) : BrowserTestHandler(tr) { } - - void StartTest() { - CefRefPtr req; - CefRefPtr postdata; - CefRefPtr postitem; - CefRequest::HeaderMap headers; - - req = CefRequest::CreateRequest(); - - CefString url("http://localhost/cef/redirect.php?max=4"); - CefString method("GET"); - - req->Set(url, method, postdata, headers); - - CefRefPtr handler = - new TestWebURLRequestClient(test_results_, this); - - req->SetFlags((CefRequest::RequestFlags)( - WUR_FLAG_SKIP_CACHE | - WUR_FLAG_REPORT_LOAD_TIMING | - WUR_FLAG_REPORT_RAW_HEADERS | - WUR_FLAG_REPORT_UPLOAD_PROGRESS)); - - ASSERT_TRUE(handler->Run(req, cancelAtState_)); - } - }; - - TestResults tr; - CefRefPtr browser = new BrowserForTest(tr); - browser->ExecuteTest(); - EXPECT_TRUE(tr.got_started); - EXPECT_TRUE(tr.got_headers); - EXPECT_TRUE(tr.got_loading); - EXPECT_TRUE(tr.got_done); - EXPECT_TRUE(tr.got_deleted); - EXPECT_TRUE(tr.got_redirect); - EXPECT_FALSE(tr.got_progress); - EXPECT_FALSE(tr.got_error); - EXPECT_FALSE(tr.got_abort); - EXPECT_GT(tr.contentLength, static_cast(0)); - EXPECT_EQ(200, tr.statusCode); - EXPECT_EQ(3, tr.redirectCount); -} - -#endif // 0 diff --git a/cef1/tests/unittests/xml_reader_unittest.cc b/cef1/tests/unittests/xml_reader_unittest.cc deleted file mode 100644 index fcc85600e..000000000 --- a/cef1/tests/unittests/xml_reader_unittest.cc +++ /dev/null @@ -1,642 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework 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 "include/cef_stream.h" -#include "include/cef_xml_reader.h" -#include "include/wrapper/cef_xml_object.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -char g_test_xml[] = - "\n" - "\n" - "\n" - " \n" - "]>\n" - "\n" - " value A\n" - " \n" - " \n" - " value B1\n" - " data]]>\n" - " &EB;\n" - " this is mixed content &EA;\n" - " \n" - " " - "\n" - "\n"; - -} // namespace - -// Test XML reading -TEST(XmlReaderTest, Read) { - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(g_test_xml, sizeof(g_test_xml) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - // Create the XML reader. - CefRefPtr reader( - CefXmlReader::Create(stream, XML_ENCODING_NONE, - "http://www.example.org/example.xml")); - ASSERT_TRUE(reader.get() != NULL); - - // Move to the processing instruction node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 0); - ASSERT_EQ(reader->GetType(), XML_NODE_PROCESSING_INSTRUCTION); - ASSERT_EQ(reader->GetLocalName(), "my_instruction"); - ASSERT_EQ(reader->GetQualifiedName(), "my_instruction"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "my_value"); - - // Move to the DOCTYPE node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 0); - ASSERT_EQ(reader->GetType(), XML_NODE_DOCUMENT_TYPE); - ASSERT_EQ(reader->GetLocalName(), "my_document"); - ASSERT_EQ(reader->GetQualifiedName(), "my_document"); - ASSERT_FALSE(reader->HasValue()); - - // Move to ns:obj element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 0); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "obj"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:obj"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->HasAttributes()); - ASSERT_EQ(reader->GetAttributeCount(), (size_t)1); - ASSERT_EQ(reader->GetAttribute(0), "http://www.example.org/ns"); - ASSERT_EQ(reader->GetAttribute("xmlns:ns"), "http://www.example.org/ns"); - ASSERT_EQ(reader->GetAttribute("ns", "http://www.w3.org/2000/xmlns/"), - "http://www.example.org/ns"); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objA element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objA"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objA"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the ns:objA value node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_TEXT); - ASSERT_EQ(reader->GetLocalName(), "#text"); - ASSERT_EQ(reader->GetQualifiedName(), "#text"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "value A"); - - // Move to the ns:objA element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objA"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objA"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the comment node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_COMMENT); - ASSERT_EQ(reader->GetLocalName(), "#comment"); - ASSERT_EQ(reader->GetQualifiedName(), "#comment"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), " my comment "); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objB element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objB"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objB_1 element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objB_1"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_1"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the ns:objB_1 value node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_TEXT); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "value B1"); - - // Move to the ns:objB_1 element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objB_1"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_1"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objB_2 element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objB_2"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_2"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the ns:objB_2 value node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_CDATA); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "some
data"); - - // Move to the ns:objB_2 element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objB_2"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_2"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objB_3 element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objB_3"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_3"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the EB entity reference node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_ENTITY_REFERENCE); - ASSERT_EQ(reader->GetLocalName(), "EB"); - ASSERT_EQ(reader->GetQualifiedName(), "EB"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "EB Value"); - - // Move to the ns:objB_3 element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objB_3"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_3"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objB_4 element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objB_4"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_4"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - ASSERT_EQ(reader->GetInnerXml(), "this is mixed content &EA;"); - ASSERT_EQ(reader->GetOuterXml(), - "" - "this is mixed content &EA;"); - - // Move to the element node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "b"); - ASSERT_EQ(reader->GetQualifiedName(), "b"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the text node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 4); - ASSERT_EQ(reader->GetType(), XML_NODE_TEXT); - ASSERT_EQ(reader->GetLocalName(), "#text"); - ASSERT_EQ(reader->GetQualifiedName(), "#text"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "this is"); - - // Move to the element node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "b"); - ASSERT_EQ(reader->GetQualifiedName(), "b"); - - // Move to the text node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_TEXT); - ASSERT_EQ(reader->GetLocalName(), "#text"); - ASSERT_EQ(reader->GetQualifiedName(), "#text"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), " mixed content "); - - // Move to the EA entity reference node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_ENTITY_REFERENCE); - ASSERT_EQ(reader->GetLocalName(), "EA"); - ASSERT_EQ(reader->GetQualifiedName(), "EA"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "EA Value"); - - // Move to the ns:objB_4 element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objB_4"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_4"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objB element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objB"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objC element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objC"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objC"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->IsEmptyElement()); - ASSERT_TRUE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - ASSERT_EQ(reader->GetAttributeCount(), (size_t)2); - ASSERT_EQ(reader->GetAttribute(0), "value C1"); - ASSERT_EQ(reader->GetAttribute("ns:attr1"), "value C1"); - ASSERT_EQ(reader->GetAttribute("attr1", "http://www.example.org/ns"), - "value C1"); - ASSERT_EQ(reader->GetAttribute(1), "value C2"); - ASSERT_EQ(reader->GetAttribute("ns:attr2"), "value C2"); - ASSERT_EQ(reader->GetAttribute("attr2", "http://www.example.org/ns"), - "value C2"); - - // Move to the ns:attr1 attribute. - ASSERT_TRUE(reader->MoveToFirstAttribute()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); - ASSERT_EQ(reader->GetLocalName(), "attr1"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:attr1"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_EQ(reader->GetValue(), "value C1"); - - // Move to the ns:attr2 attribute. - ASSERT_TRUE(reader->MoveToNextAttribute()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); - ASSERT_EQ(reader->GetLocalName(), "attr2"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:attr2"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_EQ(reader->GetValue(), "value C2"); - - // No more attributes. - ASSERT_FALSE(reader->MoveToNextAttribute()); - - // Return to the ns:objC element start node. - ASSERT_TRUE(reader->MoveToCarryingElement()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objC"); - - // Move to the ns:attr1 attribute. - ASSERT_TRUE(reader->MoveToAttribute(0)); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); - ASSERT_EQ(reader->GetLocalName(), "attr1"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:attr1"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_EQ(reader->GetValue(), "value C1"); - - // Return to the ns:objC element start node. - ASSERT_TRUE(reader->MoveToCarryingElement()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objC"); - - // Move to the ns:attr2 attribute. - ASSERT_TRUE(reader->MoveToAttribute("ns:attr2")); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); - ASSERT_EQ(reader->GetLocalName(), "attr2"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:attr2"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_EQ(reader->GetValue(), "value C2"); - - // Move to the ns:attr1 attribute without returning to the ns:objC element. - ASSERT_TRUE(reader->MoveToAttribute("attr1", "http://www.example.org/ns")); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); - ASSERT_EQ(reader->GetLocalName(), "attr1"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:attr1"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_EQ(reader->GetValue(), "value C1"); - - // Move to the ns:objD element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objD"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objD"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the ns:objD element end node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objD"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objD"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node without returning to the ns:objC element. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to ns:obj element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 0); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "obj"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:obj"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_TRUE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - // Strangely, the end node will report if the starting node has attributes - // but will not provide access to them. - ASSERT_TRUE(reader->HasAttributes()); - ASSERT_EQ(reader->GetAttributeCount(), (size_t)0); - - // And we're done. - ASSERT_FALSE(reader->MoveToNextNode()); - - ASSERT_TRUE(reader->Close()); -} - -// Test XML read error handling. -TEST(XmlReaderTest, ReadError) { - char test_str[] = - "\n" - "\n"; - - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(test_str, sizeof(test_str) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - // Create the XML reader. - CefRefPtr reader( - CefXmlReader::Create(stream, XML_ENCODING_NONE, - "http://www.example.org/example.xml")); - ASSERT_TRUE(reader.get() != NULL); - - // Move to the processing instruction node and generate parser error. - ASSERT_FALSE(reader->MoveToNextNode()); - ASSERT_TRUE(reader->HasError()); -} - -// Test XmlObject load behavior. -TEST(XmlReaderTest, ObjectLoad) { - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(g_test_xml, sizeof(g_test_xml) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - // Create the XML reader. - CefRefPtr object(new CefXmlObject("object")); - ASSERT_TRUE(object->Load(stream, XML_ENCODING_NONE, - "http://www.example.org/example.xml", NULL)); - - ASSERT_FALSE(object->HasAttributes()); - ASSERT_TRUE(object->HasChildren()); - ASSERT_EQ(object->GetChildCount(), (size_t)1); - - CefRefPtr obj(object->FindChild("ns:obj")); - ASSERT_TRUE(obj.get()); - ASSERT_TRUE(obj->HasChildren()); - ASSERT_EQ(obj->GetChildCount(), (size_t)4); - - CefRefPtr obj_child(obj->FindChild("ns:objC")); - ASSERT_TRUE(obj_child.get()); - ASSERT_EQ(obj_child->GetName(), "ns:objC"); - ASSERT_FALSE(obj_child->HasChildren()); - ASSERT_FALSE(obj_child->HasValue()); - ASSERT_TRUE(obj_child->HasAttributes()); - - CefXmlObject::ObjectVector obj_children; - ASSERT_EQ(obj->GetChildren(obj_children), (size_t)4); - ASSERT_EQ(obj_children.size(), (size_t)4); - - CefXmlObject::ObjectVector::const_iterator it = obj_children.begin(); - for (int ct = 0; it != obj_children.end(); ++it, ++ct) { - obj_child = *it; - ASSERT_TRUE(obj_child.get()); - if (ct == 0) { - // ns:objA - ASSERT_EQ(obj_child->GetName(), "ns:objA"); - ASSERT_FALSE(obj_child->HasChildren()); - ASSERT_TRUE(obj_child->HasValue()); - ASSERT_FALSE(obj_child->HasAttributes()); - ASSERT_EQ(obj_child->GetValue(), "value A"); - } else if (ct == 1) { - // ns:objB - ASSERT_EQ(obj_child->GetName(), "ns:objB"); - ASSERT_TRUE(obj_child->HasChildren()); - ASSERT_FALSE(obj_child->HasValue()); - ASSERT_FALSE(obj_child->HasAttributes()); - ASSERT_EQ(obj_child->GetChildCount(), (size_t)4); - obj_child = obj_child->FindChild("ns:objB_4"); - ASSERT_TRUE(obj_child.get()); - ASSERT_TRUE(obj_child->HasValue()); - ASSERT_EQ(obj_child->GetValue(), - "this is mixed content EA Value"); - } else if (ct == 2) { - // ns:objC - ASSERT_EQ(obj_child->GetName(), "ns:objC"); - ASSERT_FALSE(obj_child->HasChildren()); - ASSERT_FALSE(obj_child->HasValue()); - ASSERT_TRUE(obj_child->HasAttributes()); - - CefXmlObject::AttributeMap attribs; - ASSERT_EQ(obj_child->GetAttributes(attribs), (size_t)2); - ASSERT_EQ(attribs.size(), (size_t)2); - ASSERT_EQ(attribs["ns:attr1"], "value C1"); - ASSERT_EQ(attribs["ns:attr2"], "value C2"); - - ASSERT_EQ(obj_child->GetAttributeCount(), (size_t)2); - ASSERT_TRUE(obj_child->HasAttribute("ns:attr1")); - ASSERT_EQ(obj_child->GetAttributeValue("ns:attr1"), "value C1"); - ASSERT_TRUE(obj_child->HasAttribute("ns:attr2")); - ASSERT_EQ(obj_child->GetAttributeValue("ns:attr2"), "value C2"); - } else if (ct == 3) { - // ns:objD - ASSERT_EQ(obj_child->GetName(), "ns:objD"); - ASSERT_FALSE(obj_child->HasChildren()); - ASSERT_FALSE(obj_child->HasValue()); - ASSERT_FALSE(obj_child->HasAttributes()); - } - } -} - -// Test XmlObject load error handling behavior. -TEST(XmlReaderTest, ObjectLoadError) { - // Test start/end tag mismatch error. - { - char error_xml[] = "\n\n\n
"; - - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(error_xml, sizeof(error_xml) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - CefString error_str; - - // Create the XML reader. - CefRefPtr object(new CefXmlObject("object")); - ASSERT_FALSE(object->Load(stream, XML_ENCODING_NONE, - "http://www.example.org/example.xml", &error_str)); - ASSERT_EQ(error_str, - "Opening and ending tag mismatch: foo line 2 and obj, line 3"); - } - - // Test value following child error. - { - char error_xml[] = "\n\ndisallowed value\n"; - - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(error_xml, sizeof(error_xml) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - CefString error_str; - - // Create the XML reader. - CefRefPtr object(new CefXmlObject("object")); - ASSERT_FALSE(object->Load(stream, XML_ENCODING_NONE, - "http://www.example.org/example.xml", &error_str)); - ASSERT_EQ(error_str, - "Value following child element, line 4"); - } -} diff --git a/cef1/tests/unittests/zip_reader_unittest.cc b/cef1/tests/unittests/zip_reader_unittest.cc deleted file mode 100644 index 41f83fdde..000000000 --- a/cef1/tests/unittests/zip_reader_unittest.cc +++ /dev/null @@ -1,253 +0,0 @@ -// Copyright (c) 2010 The Chromium Embedded Framework 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 "include/cef_stream.h" -#include "include/cef_zip_reader.h" -#include "include/wrapper/cef_zip_archive.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - - unsigned char g_test_zip[] = { - 0x50, 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x7f, - 0x57, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, - 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x7f, 0x57, 0x3d, 0xf8, 0x47, 0x0c, - 0xc6, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, - 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, - 0x65, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x2e, 0x74, 0x78, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x2e, 0x50, 0x4b, 0x03, 0x04, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x7f, 0x57, 0x3d, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, - 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, - 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, 0x2f, 0x50, - 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x7f, 0x57, - 0x3d, 0x43, 0xe3, 0x11, 0x5f, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, - 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x20, 0x31, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x61, 0x2e, 0x74, - 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, - 0x66, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x41, 0x2e, 0x50, 0x4b, - 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x7f, 0x57, 0x3d, - 0x80, 0xb0, 0x3c, 0x74, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, - 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, - 0x31, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x62, 0x2e, 0x74, 0x78, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x42, 0x2e, 0x50, 0x4b, 0x03, - 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x7f, 0x57, 0x3d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, - 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, - 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, 0x61, 0x2f, 0x50, - 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7f, 0x57, - 0x3d, 0x15, 0xed, 0x04, 0x2c, 0x15, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, - 0x00, 0x2c, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, - 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x20, 0x31, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, 0x61, - 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x61, 0x31, 0x2e, 0x74, 0x78, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x41, 0x31, 0x2e, 0x50, 0x4b, - 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x7f, 0x57, 0x3d, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, - 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, - 0x32, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x80, 0x57, 0x3d, 0x1a, 0x5d, 0x57, 0x5d, 0x14, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, - 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, - 0x64, 0x65, 0x72, 0x20, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x32, - 0x61, 0x2e, 0x74, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x32, 0x41, - 0x2e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x67, 0x7f, 0x57, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, - 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, - 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0x7f, 0x57, 0x3d, 0xf8, 0x47, 0x0c, 0xc6, 0x13, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x74, 0x65, - 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, - 0x69, 0x6c, 0x65, 0x20, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, - 0x02, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x7f, 0x57, - 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, - 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, - 0x65, 0x72, 0x20, 0x31, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x7f, 0x57, 0x3d, 0x43, 0xe3, 0x11, - 0x5f, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xa7, - 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, - 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, - 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x61, 0x2e, 0x74, 0x78, 0x74, - 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x78, 0x7f, 0x57, 0x3d, 0x80, 0xb0, 0x3c, 0x74, 0x14, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x74, 0x65, - 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, - 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, 0x2f, 0x66, 0x69, 0x6c, 0x65, - 0x20, 0x31, 0x62, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x7f, 0x57, 0x3d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x4d, 0x01, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, - 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x20, 0x31, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, 0x61, - 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7c, 0x7f, 0x57, 0x3d, 0x15, 0xed, 0x04, 0x2c, 0x15, 0x00, 0x00, - 0x00, 0x15, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x74, - 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, - 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, 0x2f, 0x66, 0x6f, 0x6c, - 0x64, 0x65, 0x72, 0x20, 0x31, 0x61, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, - 0x31, 0x61, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x7f, 0x57, 0x3d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0xea, 0x01, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, - 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x20, 0x32, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x80, 0x57, 0x3d, 0x1a, 0x5d, 0x57, 0x5d, 0x14, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1e, 0x02, 0x00, - 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, - 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x32, 0x2f, 0x66, - 0x69, 0x6c, 0x65, 0x20, 0x32, 0x61, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, - 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0x9d, 0x02, - 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - -} // namespace - -// Test Zip reading. -TEST(ZipReaderTest, Read) { - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(g_test_zip, sizeof(g_test_zip) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - // Create the Zip reader. - CefRefPtr reader(CefZipReader::Create(stream)); - ASSERT_TRUE(reader.get() != NULL); - - char buff[25]; - - // Walk through the archive contents. - ASSERT_TRUE(reader->MoveToFirstFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/"); - ASSERT_EQ(reader->GetFileSize(), 0); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/file 1.txt"); - ASSERT_EQ(reader->GetFileSize(), 19); - ASSERT_TRUE(reader->OpenFile("")); - ASSERT_EQ(reader->ReadFile(buff, sizeof(buff)), 19); - ASSERT_TRUE(!strncmp(buff, "Contents of file 1.", 19)); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 1/"); - ASSERT_EQ(reader->GetFileSize(), 0); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 1/file 1a.txt"); - ASSERT_EQ(reader->GetFileSize(), 20); - ASSERT_TRUE(reader->OpenFile("")); - ASSERT_EQ(reader->ReadFile(buff, sizeof(buff)), 20); - ASSERT_TRUE(reader->CloseFile()); - ASSERT_TRUE(!strncmp(buff, "Contents of file 1A.", 20)); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 1/file 1b.txt"); - ASSERT_EQ(reader->GetFileSize(), 20); - ASSERT_TRUE(reader->OpenFile("")); - ASSERT_EQ(reader->ReadFile(buff, sizeof(buff)), 20); - ASSERT_TRUE(reader->CloseFile()); - ASSERT_TRUE(!strncmp(buff, "Contents of file 1B.", 20)); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 1/folder 1a/"); - ASSERT_EQ(reader->GetFileSize(), 0); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), - "test_archive/folder 1/folder 1a/file 1a1.txt"); - ASSERT_EQ(reader->GetFileSize(), 21); - ASSERT_TRUE(reader->OpenFile("")); - ASSERT_EQ(reader->ReadFile(buff, sizeof(buff)), 21); - ASSERT_TRUE(reader->CloseFile()); - ASSERT_TRUE(!strncmp(buff, "Contents of file 1A1.", 21)); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 2/"); - ASSERT_EQ(reader->GetFileSize(), 0); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 2/file 2a.txt"); - ASSERT_EQ(reader->GetFileSize(), 20); - ASSERT_TRUE(reader->OpenFile("")); - ASSERT_EQ(reader->ReadFile(buff, sizeof(buff)), 20); - ASSERT_TRUE(reader->CloseFile()); - ASSERT_TRUE(!strncmp(buff, "Contents of file 2A.", 20)); - - ASSERT_FALSE(reader->MoveToNextFile()); - - // Try seeking a particular file - ASSERT_TRUE(reader->MoveToFile("TEST_ARCHIVE/FOLDER 1/FILE 1B.TXT", false)); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 1/file 1b.txt"); - ASSERT_EQ(reader->GetFileSize(), 20); - ASSERT_TRUE(reader->OpenFile("")); - ASSERT_EQ(reader->ReadFile(buff, sizeof(buff)), 20); - ASSERT_TRUE(reader->CloseFile()); - ASSERT_TRUE(!strncmp(buff, "Contents of file 1B.", 20)); - - ASSERT_TRUE(reader->MoveToFile("test_archive/folder 1/file 1b.txt", true)); - ASSERT_FALSE(reader->MoveToFile("test_archive/folder 1/FILE 1B.txt", true)); - - ASSERT_TRUE(reader->Close()); -} - -// Test CefZipArchive object. -TEST(ZipReaderTest, ReadArchive) { - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(g_test_zip, sizeof(g_test_zip) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - // Create the Zip archive object. - CefRefPtr archive(new CefZipArchive()); - - ASSERT_EQ(archive->Load(stream, false), (size_t)5); - - ASSERT_TRUE(archive->HasFile("test_archive/file 1.txt")); - ASSERT_TRUE(archive->HasFile("test_archive/folder 1/file 1a.txt")); - ASSERT_TRUE(archive->HasFile("test_archive/FOLDER 1/file 1b.txt")); - ASSERT_TRUE(archive->HasFile("test_archive/folder 1/folder 1a/file 1a1.txt")); - ASSERT_TRUE(archive->HasFile("test_archive/folder 2/file 2a.txt")); - - // Test content retrieval. - CefRefPtr file; - file = archive->GetFile("test_archive/folder 2/file 2a.txt"); - ASSERT_TRUE(file.get()); - - ASSERT_EQ(file->GetDataSize(), (size_t)20); - ASSERT_TRUE(!strncmp(reinterpret_cast(file->GetData()), - "Contents of file 2A.", 20)); - - // Test stream reading. - CefRefPtr reader(file->GetStreamReader()); - ASSERT_TRUE(reader.get()); - - char buff[8]; - ASSERT_EQ(reader->Read(buff, 1, 8), (size_t)8); - ASSERT_TRUE(!strncmp(buff, "Contents", 8)); - ASSERT_EQ(reader->Read(buff, 1, 8), (size_t)8); - ASSERT_TRUE(!strncmp(buff, " of file", 8)); - ASSERT_EQ(reader->Read(buff, 1, 8), (size_t)4); - ASSERT_TRUE(!strncmp(buff, " 2A.", 4)); - ASSERT_TRUE(reader->Eof()); -} diff --git a/cef1/tools/automate/automate-git.py b/cef1/tools/automate/automate-git.py deleted file mode 100644 index 4afb4d37a..000000000 --- a/cef1/tools/automate/automate-git.py +++ /dev/null @@ -1,404 +0,0 @@ -# Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from optparse import OptionParser -from subprocess import Popen, PIPE, STDOUT -from tempfile import mktemp -import os -import shlex -import shutil -import sys -import urllib - -# default URL values -chromium_url = 'http://git.chromium.org/chromium/src.git' -depot_tools_url = 'http://src.chromium.org/svn/trunk/tools/depot_tools' - -def check_url(url): - """ Check the URL and raise an exception if invalid. """ - if ':' in url[:7]: - parts = url.split(':', 1) - if (parts[0] in ["http", "https", "git"] and \ - parts[1] == urllib.quote(parts[1])): - return url - sys.stderr.write('Invalid URL: '+url+"\n") - raise Exception('Invalid URL: '+url) - -def get_exec_environ(): - env = os.environ - env['PATH'] = depot_tools_dir + os.pathsep + env['PATH'] - return env - -def run(args, **kwargs): - '''Run a command and capture the output iteratively''' - if isinstance(args, str): - args = shlex.split(args.replace('\\', '\\\\')) - cwd = kwargs.get("cwd", os.getcwd()) - quiet = kwargs.get("quiet", False) - print "-> Running '%s' in %s" % (" ".join(args), os.path.relpath(cwd)) - cmd = Popen(args, cwd=cwd, stdout=PIPE, stderr=STDOUT, - env=kwargs.get("env", get_exec_environ()), - shell=(sys.platform == 'win32')) - output = '' - while True: - out = cmd.stdout.read(1) - if out == '' and cmd.poll() != None: - break - output += out - if not quiet: - sys.stdout.write(out) - if cmd.wait() != 0: - raise Exception("Command failed: \"%s\"" % " ".join(args), output) - return output - -def get_current_branch(path): - return run("git rev-parse --abbrev-ref HEAD", cwd=path, quiet=True) - -def get_chromium_compat_rev(cef_url, path, cef_rev): - if not os.path.isdir(path): - path = mktemp() - run("git clone --depth 1 %s %s" % (cef_url, path), quiet = True) - if cef_rev == "None": - cef_rev = get_git_rev(path, get_current_branch(path)) - compat_cmd = "git cat-file -p %s:CHROMIUM_BUILD_COMPATIBILITY.txt" % cef_rev - compat_value = run(compat_cmd, cwd = path, quiet = True) - config = eval(compat_value, {'__builtins__': None}, None) - if not 'chromium_revision' in config: - raise Exception("Missing chromium_revision value") - return str(int(config['chromium_revision'])) - -def get_svn_rev(path, branch): - svn_rev = "None" - cmd = ("git log --grep=^git-svn-id: -n 1 %s" % branch).split() - try: - process = Popen(cmd, cwd=path, stdout = PIPE, stderr = PIPE) - for line in process.stdout: - if line.find("git-svn-id") > 0: - svn_rev = line.split("@")[1].split()[0] - break - except IOError, (errno, strerror): - sys.stderr.write('Failed to read git log: ' + strerror + "\n") - raise - return svn_rev - -def get_git_rev_for_svn_rvn(path, svn_rev): - git_rev = "None" - cmd = ("git log --grep=^git-svn-id:.*@%s --oneline" % svn_rev).split() - try: - process = Popen(cmd, cwd=path, stdout = PIPE, stderr = PIPE) - git_rev = process.communicate()[0].split()[0] - except IOError, (errno, strerror): - sys.stderr.write('Failed to read git log: ' + strerror + "\n") - raise - return git_rev - -def get_git_rev(path, branch): - git_rev = "None" - cmd = ("git describe --always %s" % branch).split() - try: - process = Popen(cmd, cwd=path, stdout = PIPE, stderr = PIPE) - git_rev = process.communicate()[0].strip() - except IOError, (errno, strerror): - sys.stderr.write('Failed to read git log: ' + strerror + "\n") - raise - return git_rev - -def get_git_origin(path): - git_origin = "None" - get_origin_cmd = "git remote show origin -n".split() - try: - process = Popen(get_origin_cmd, cwd=path, stdout = PIPE, stderr = PIPE) - for line in process.stdout: - if line.startswith(" Fetch URL: "): - git_origin = line.replace(" Fetch URL: ", "").strip() - break - except IOError, (errno, strerror): - sys.stderr.write('Failed to read git log: ' + strerror + "\n") - raise - return git_origin - -def get_checkout_info(path, fetch_latest = True): - """ Retrieves the origin URL, git HEAD revision and last SVN revision """ - url = 'None' - origin_svn_rev = 'None' - origin_git_rev = 'None' - local_svn_rev = 'None' - local_git_rev = 'None' - if os.path.isdir(path): - if fetch_latest: - run("git fetch", cwd = path, quiet = True) - url = get_git_origin(path) - branch = get_current_branch(path) - origin_svn_rev = get_svn_rev(path, "origin/%s" % branch) - origin_git_rev = get_git_rev(path, "origin/%s" % branch) - local_svn_rev = get_svn_rev(path, branch) - local_git_rev = get_git_rev(path, branch) - return { - 'url' : url, - 'local' : { - 'svn-revision' : local_svn_rev, - 'git-revision' : local_git_rev - }, - 'origin' : { - 'svn-revision' : origin_svn_rev, - 'git-revision' : origin_git_rev - } - } - -def onerror(func, path, exc_info): - """ - Error handler for ``shutil.rmtree``. - - If the error is due to an access error (read only file) - it attempts to add write permission and then retries. - - If the error is for another reason it re-raises the error. - - Usage : ``shutil.rmtree(path, onerror=onerror)`` - """ - import stat - if not os.access(path, os.W_OK): - # Is the error an access error ? - os.chmod(path, stat.S_IWUSR) - func(path) - else: - raise - -# cannot be loaded as a module -if __name__ != "__main__": - sys.stderr.write('This file cannot be loaded as a module!') - sys.exit() - -# parse command-line options -desc = """ -This utility implements automation for the download, update, build and -distribution of CEF. -""" - -parser = OptionParser(description=desc) -parser.add_option('--url', dest='url', - help='CEF source URL') -parser.add_option('--download-dir', dest='downloaddir', metavar='DIR', - help='download directory with no spaces [required]') -parser.add_option('--revision', dest='revision', - help='CEF source revision') -parser.add_option('--force-config', - action='store_true', dest='forceconfig', default=False, - help='force Chromium configuration') -parser.add_option('--force-clean', - action='store_true', dest='forceclean', default=False, - help='force revert of all Chromium changes, deletion of '+\ - 'all unversioned files including the CEF folder and '+\ - 'trigger the force-update, force-build and '+\ - 'force-distrib options') -parser.add_option('--force-update', - action='store_true', dest='forceupdate', default=False, - help='force Chromium and CEF update') -parser.add_option('--force-build', - action='store_true', dest='forcebuild', default=False, - help='force CEF debug and release builds') -parser.add_option('--force-distrib', - action='store_true', dest='forcedistrib', default=False, - help='force creation of CEF binary distribution') -parser.add_option('--no-debug-build', - action='store_true', dest='nodebugbuild', default=False, - help="don't perform the CEF debug build") -parser.add_option('--no-release-build', - action='store_true', dest='noreleasebuild', default=False, - help="don't perform the CEF release build") -parser.add_option('--no-distrib', - action='store_true', dest='nodistrib', default=False, - help="don't create the CEF binary distribution") -(options, args) = parser.parse_args() - -# the downloaddir and url options are required -if options.downloaddir is None: - print "ERROR: Download directory is required" - parser.print_help(sys.stderr) - sys.exit() -if options.url is None: - print "ERROR: CEF URL is required" - parser.print_help(sys.stderr) - sys.exit() - -cef_url = check_url(options.url) -download_dir = os.path.abspath(options.downloaddir) -if not os.path.exists(download_dir): - # create the download directory - os.makedirs(download_dir) - -# Test the operating system. -platform = ''; -if sys.platform == 'win32': - platform = 'windows' -elif sys.platform == 'darwin': - platform = 'macosx' -elif sys.platform.startswith('linux'): - platform = 'linux' - -# set the expected script extension -if platform == 'windows': - script_ext = '.bat' -else: - script_ext = '.sh' - -# check if the "depot_tools" directory exists -depot_tools_dir = os.path.join(download_dir, 'depot_tools') -if not os.path.exists(depot_tools_dir): - # checkout depot_tools - run('svn checkout %s %s' % (depot_tools_url, depot_tools_dir), - cwd = download_dir, quiet = True) - -chromium_dir = os.path.join(download_dir, 'chromium') -if not os.path.exists(chromium_dir): - # create the "chromium" directory - os.makedirs(chromium_dir) - -chromium_src_dir = os.path.join(chromium_dir, 'src') -cef_src_dir = os.path.join(chromium_src_dir, 'cef') -cef_tools_dir = os.path.join(cef_src_dir, 'tools') - -# retrieve the current CEF URL and revision -info = get_checkout_info(cef_src_dir) -cef_rev = info['origin']['git-revision'] -if not options.revision is None: - cef_rev = str(options.revision) -current_cef_url = info['url'] -current_cef_rev = info['local']['git-revision'] - -# retrieve the compatible Chromium revision -chromium_rev = get_chromium_compat_rev(cef_url, cef_src_dir, cef_rev) - -# retrieve the current Chromium URL and revision -info = get_checkout_info(chromium_src_dir, False) -current_chromium_url = info['url'] -current_chromium_rev = info['local']['svn-revision'] - -# test if the CEF URL changed -cef_url_changed = current_cef_url != cef_url -print "-- CEF URL: %s" % current_cef_url -if cef_url_changed: - print "\t-> CHANGED TO: %s" % cef_url - -# test if the CEF revision changed -cef_rev_changed = current_cef_rev != cef_rev -print "-- CEF Revision: %s" % current_cef_rev -if cef_url_changed: - print "\t-> CHANGED TO: %s" % cef_rev - -# test if the Chromium URL changed -chromium_url_changed = current_chromium_url != chromium_url -print "-- Chromium URL: %s" % current_chromium_url -if cef_url_changed: - print "\t-> CHANGED TO: %s" % chromium_url - -# test if the Chromium revision changed -chromium_rev_changed = current_chromium_rev != chromium_rev -print "-- Chromium Revision: %s" % current_chromium_rev -if cef_url_changed: - print "\t-> CHANGED TO: %s" % chromium_rev - -# true if anything changed -any_changed = chromium_url_changed or chromium_rev_changed or \ - cef_url_changed or cef_rev_changed -if not any_changed: - print "*** NO CHANGE ***" - -if chromium_url_changed or options.forceconfig: - # run gclient config to create the .gclient file - run('gclient config %s --git-deps' % chromium_url, cwd = chromium_dir) - - path = os.path.join(chromium_dir, '.gclient') - if not os.path.exists(path): - raise Exception('.gclient file was not created') - - # read the resulting .gclient file - fp = open(path, 'r') - data = fp.read() - fp.close() - - # populate "custom_deps" section - data = data.replace('"custom_deps" : {', '"custom_deps" : {'+\ - "\n "+'"src/third_party/WebKit/LayoutTests": None,'+\ - "\n "+'"src/chrome_frame/tools/test/reference_build/chrome": None,'+\ - "\n "+'"src/chrome/tools/test/reference_build/chrome_mac": None,'+\ - "\n "+'"src/chrome/tools/test/reference_build/chrome_win": None,'+\ - "\n "+'"src/chrome/tools/test/reference_build/chrome_linux": None,') - - # write the new .gclient file - fp = open(path, 'w') - fp.write(data) - fp.close() - -if options.forceclean: - if os.path.exists(chromium_src_dir): - # revert all Chromium changes and delete all unversioned files - run('gclient revert -n', cwd = chromium_dir) - - # remove the build output directories - output_dirs = [] - if platform == 'windows': - output_dirs.append(os.path.join(chromium_src_dir, 'build\\Debug')) - output_dirs.append(os.path.join(chromium_src_dir, 'build\\Release')) - elif platform == 'macosx': - output_dirs.append(os.path.join(chromium_src_dir, 'xcodebuild')) - elif platform == 'linux': - output_dirs.append(os.path.join(chromium_src_dir, 'out')) - - for output_dir in output_dirs: - if os.path.exists(output_dir): - shutil.rmtree(output_dir, onerror=onerror) - - # force update, build and distrib steps - options.forceupdate = True - options.forcebuild = True - options.forcedistrib = True - -if chromium_url_changed or chromium_rev_changed or options.forceupdate: - # download/update the Chromium source cod - fetch_rev = "HEAD" - if os.path.isdir(chromium_src_dir): - fetch_rev = get_git_rev_for_svn_rvn( - chromium_src_dir, current_chromium_rev) - run('gclient sync --jobs 8 -n --force --revision=src@%s' % fetch_rev, - cwd = chromium_dir) - checkout_rev = get_git_rev_for_svn_rvn(chromium_src_dir, chromium_rev) - run('gclient sync --jobs 8 --revision=src@%s' % checkout_rev, - cwd = chromium_dir) - -if not os.path.exists(cef_src_dir) or cef_url_changed: - if cef_url_changed and os.path.exists(cef_src_dir): - # delete the cef directory (it will be re-downloaded) - shutil.rmtree(cef_src_dir) - # download the CEF source code - run("git clone %s %s" % (cef_url, cef_src_dir)) -elif cef_rev_changed or options.forceupdate: - # update the CEF source code - stashed = run("git stash", cwd = cef_src_dir).find( - "No local changes to save") < 0 - ref = cef_rev - if ref == "None": - ref = "origin/%s" % get_current_branch(cef_src_dir) - run("git fetch origin", cwd = cef_src_dir) - run("git reset --hard %s" % ref, cwd = cef_src_dir) - if stashed: - run("git stash pop", cwd = cef_src_dir) - -if any_changed or options.forceupdate: - # create CEF projects - path = os.path.join(cef_src_dir, 'cef_create_projects' + script_ext) - run(path, cwd = cef_src_dir, quiet = True) - -if any_changed or options.forcebuild: - path = os.path.join(cef_tools_dir, 'build_projects' + script_ext) - if not options.nodebugbuild: - run(path +' Debug', cwd = cef_tools_dir) - if not options.noreleasebuild: - run(path +' Release', cwd = cef_tools_dir) - -if any_changed or options.forcedistrib: - if not options.nodistrib: - # make CEF binary distribution - path = os.path.join(cef_tools_dir, 'make_distrib' + script_ext) - run(path, cwd = cef_tools_dir) diff --git a/cef1/tools/automate/automate.README.txt b/cef1/tools/automate/automate.README.txt deleted file mode 100644 index b897af4c0..000000000 --- a/cef1/tools/automate/automate.README.txt +++ /dev/null @@ -1,99 +0,0 @@ -Chromium Embedded Framework (CEF) Automation Tool -------------------------------------------------------------------------------- - -Document Last Updated: October 10, 2011 - - -OVERVIEW --------- - -The CEF Automation Tool can perform the following actions in an automated manner: - -1. Download/update the Chromium and CEF source code. -2. Build the CEF Debug and Release targets. -3. Create the CEF binary distribution package. - - -SETUP ------ - -1. Install Subversion [1] and Python [2]. Make sure the bin directories for both - programs are discoverable via your system PATH configuration. On Windows - install CppDoc [3] in the default location (assumes a 64bit version of - Windows 7). - -2. Install build tools. On Windows install Visual Studio 2008 or newer and all - required prerequisite software [4]. On Mac install Xcode 3.2 or newer. - -3. Configure the GYP environment. On Windows set the GYP_MSVS_VERSION - environment variable to "2008" or "2010" depending on which version of Visual - Studio you're building with. On Mac Lion set the GYP_DEFINES environment - variable to 'mac_sdk=10.6'. - -4. Checkout the "automate" folder to a location on your hard drive. For the - trunk version of CEF you can use the following command: - - svn checkout http://chromiumembedded.googlecode.com/svn/trunk/cef1/tools/automate /path/to/automate - -5. Run the automate.py script at whatever interval is appropriate (for each - CEF commit, once per day, once per week, etc): - - python /path/to/automate/automate.py --download-dir=/path/to/download - - -HOW IT WORKS ------------- - -The automate.py script performs the following actions in the download directory -specified by the "--download-dir" flag. This path value must contain no spaces. - -1. Retrieve the Chromium URL and revision associated with a CEF URL and - revision. A specific CEF URL and revision can be specified using the "--url" - and "--revision" flags. Otherwise, the current CEF trunk URL [7] and HEAD - revision will be used. The Chromium URL and revision are retrieved by - querying the SVN repository for a CHROMIUM_BUILD_COMPATIBILITY.txt file. - -2. If a "depot_tools" folder does not already exist download depot_tools [5]. - The depot_tools folder will be added to the beginning of the PATH to support - execution of the below steps. - -3. If a "chromium" folder does not already exist create it and configure - gclient [6] using the Chromium URL retrieved in step 1. To force execution of - this step use the "--force-config" flag. - -4. If the "--force-clean" flag is specified all Chromium changes will be - reverted, all unversioned files including the CEF folder will be deleted and - steps 6-10 will be triggered automatically. - -5. If both Chromium and CEF are already at the correct URL and revision the - script will exit at this point. To force execution of steps 6-8 use the - "--force-update" flag. To force execution of step 9 use the "--force-build" - flag. To force execution of step 10 use the "--force-distrib" flag. - -6. Use gclient [6] to update the Chromium source code to the correct revision. - -7. If a "chromium/src/cef" folder does not already exist download the CEF source - code at the correct revision. Otherwise, update CEF source code to the - correct revision. - -8. Run the "chromium/src/cef/cef_create_projects.[sh|bat]" script to apply CEF - patches and generate CEF project files. - -9. Run the "chromium/src/cef/tools/build_projects.[sh|bat]" script twice; once - to build the Debug target and once to build the Release target. - -10.Run the "chromium/src/cef/tools/make_distrib.[sh|bat]" script to build the - binary distribution package. The resulting package will be output in a - "chromium/src/cef/binary_distrib/cef_binary_rXXX_[windows|macosx]" folder. - - -REFERENCES ----------- - -[1] http://subversion.apache.org/ -[2] http://www.python.org/ -[3] http://www.cppdoc.com/ -[4] http://dev.chromium.org/developers/how-tos/build-instructions-windows -[5] http://dev.chromium.org/developers/how-tos/depottools -[6] http://dev.chromium.org/developers/how-tos/get-the-code -[7] http://chromiumembedded.googlecode.com/svn/trunk/cef1 diff --git a/cef1/tools/automate/automate.py b/cef1/tools/automate/automate.py deleted file mode 100644 index e68b9b6e3..000000000 --- a/cef1/tools/automate/automate.py +++ /dev/null @@ -1,480 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from optparse import OptionParser -import os -import re -import shlex -import shutil -import subprocess -import sys -import urllib - -# default URL values -cef_url = 'http://chromiumembedded.googlecode.com/svn/trunk/cef1' -depot_tools_url = 'http://src.chromium.org/svn/trunk/tools/depot_tools' - -def run(command_line, working_dir, depot_tools_dir=None): - # add depot_tools to the path - env = os.environ - if not depot_tools_dir is None: - env['PATH'] = depot_tools_dir+os.pathsep+env['PATH'] - - sys.stdout.write('-------- Running "'+command_line+'" in "'+\ - working_dir+'"...'+"\n") - if not options.dryrun: - args = shlex.split(command_line.replace('\\', '\\\\')) - return subprocess.check_call(args, cwd=working_dir, env=env, - shell=(sys.platform == 'win32')) - -def check_url(url): - """ Check the URL and raise an exception if invalid. """ - if ':' in url[:7]: - parts = url.split(':', 1) - if (parts[0] == 'http' or parts[0] == 'https') and \ - parts[1] == urllib.quote(parts[1]): - return url - sys.stderr.write('Invalid URL: '+url+"\n") - raise Exception('Invalid URL: '+url) - -def get_svn_info(path): - """ Retrieves the URL and revision from svn info. """ - url = 'None' - rev = 'None' - if path[0:4] == 'http' or os.path.exists(path): - try: - stream = os.popen('svn info '+path) - for line in stream: - if line[0:4] == "URL:": - url = check_url(line[5:-1]) - elif line[0:9] == "Revision:": - rev = str(int(line[10:-1])) - except IOError, (errno, strerror): - sys.stderr.write('Failed to read svn info: '+strerror+"\n") - raise - return {'url': url, 'revision': rev} - -def onerror(func, path, exc_info): - """ - Error handler for ``shutil.rmtree``. - - If the error is due to an access error (read only file) - it attempts to add write permission and then retries. - - If the error is for another reason it re-raises the error. - - Usage : ``shutil.rmtree(path, onerror=onerror)`` - """ - import stat - if not os.access(path, os.W_OK): - # Is the error an access error ? - os.chmod(path, stat.S_IWUSR) - func(path) - else: - raise - -# cannot be loaded as a module -if __name__ != "__main__": - sys.stderr.write('This file cannot be loaded as a module!') - sys.exit() - -# parse command-line options -disc = """ -This utility implements automation for the download, update, build and -distribution of CEF. -""" - -parser = OptionParser(description=disc) -parser.add_option('--download-dir', dest='downloaddir', metavar='DIR', - help='download directory with no spaces [required]') -parser.add_option('--revision', dest='revision', type="int", - help='CEF source revision') -parser.add_option('--url', dest='url', - help='CEF source URL') -parser.add_option('--depot-tools', dest='depottools', metavar='DIR', - help='download directory for depot_tools', default='') -parser.add_option('--force-config', - action='store_true', dest='forceconfig', default=False, - help='force Chromium configuration') -parser.add_option('--force-clean', - action='store_true', dest='forceclean', default=False, - help='force revert of all Chromium changes, deletion of '+\ - 'all unversioned files including the CEF folder and '+\ - 'trigger the force-update, force-build and '+\ - 'force-distrib options') -parser.add_option('--force-update', - action='store_true', dest='forceupdate', default=False, - help='force Chromium and CEF update') -parser.add_option('--force-build', - action='store_true', dest='forcebuild', default=False, - help='force CEF debug and release builds') -parser.add_option('--force-distrib', - action='store_true', dest='forcedistrib', default=False, - help='force creation of CEF binary distribution') -parser.add_option('--no-debug-build', - action='store_true', dest='nodebugbuild', default=False, - help="don't perform the CEF debug build") -parser.add_option('--no-release-build', - action='store_true', dest='noreleasebuild', default=False, - help="don't perform the CEF release build") -parser.add_option('--no-distrib', - action='store_true', dest='nodistrib', default=False, - help="don't create any CEF binary distribution") -parser.add_option('--minimal-distrib', - action='store_true', dest='minimaldistrib', default=False, - help='create a minimal CEF binary distribution') -parser.add_option('--minimal-distrib-only', - action='store_true', dest='minimaldistribonly', default=False, - help='create a minimal CEF binary distribution only') -parser.add_option('--client-distrib', - action='store_true', dest='clientdistrib', default=False, - help='create a client CEF binary distribution') -parser.add_option('--client-distrib-only', - action='store_true', dest='clientdistribonly', default=False, - help='create a client CEF binary distribution only') -parser.add_option('--no-distrib-docs', - action='store_true', dest='nodistribdocs', default=False, - help="don't create CEF documentation") -parser.add_option('--no-distrib-archive', - action='store_true', dest='nodistribarchive', default=False, - help="don't create archives for output directories") -parser.add_option('--ninja-build', - action='store_true', dest='ninjabuild', default=False, - help="build using ninja") -parser.add_option('--dry-run', - action='store_true', dest='dryrun', default=False, - help="output commands without executing them") -(options, args) = parser.parse_args() - -# the downloaddir option is required -if options.downloaddir is None: - parser.print_help(sys.stderr) - sys.exit() - -if (options.noreleasebuild and (options.minimaldistrib or options.minimaldistribonly or \ - options.clientdistrib or options.clientdistribonly)) or \ - (options.minimaldistribonly and options.clientdistribonly): - print 'Invalid combination of options' - parser.print_help(sys.stderr) - sys.exit() - -# script directory -script_dir = os.path.dirname(__file__) - -if not options.url is None: - # set the CEF URL - cef_url = check_url(options.url) - -if not options.revision is None: - # set the CEF revision - cef_rev = str(options.revision) -else: - # retrieve the CEF revision from the remote repo - info = get_svn_info(cef_url) - cef_rev = info['revision'] - if cef_rev == 'None': - sys.stderr.write('No SVN info for: '+cef_url+"\n") - raise Exception('No SVN info for: '+cef_url) - -# Retrieve the Chromium URL and revision from the CEF repo -compat_url = cef_url + "/CHROMIUM_BUILD_COMPATIBILITY.txt?r="+cef_rev - -release_url = None -chromium_url = None -chromium_rev = None - -try: - # Read the remote URL contents - handle = urllib.urlopen(compat_url) - compat_value = handle.read().strip() - handle.close() - - # Parse the contents - config = eval(compat_value, {'__builtins__': None}, None) - - if 'release_url' in config: - # building from a release - release_url = check_url(config['release_url']) - else: - # building from chromium src - if not 'chromium_url' in config: - raise Exception("Missing chromium_url value") - if not 'chromium_revision' in config: - raise Exception("Missing chromium_revision value") - - chromium_url = check_url(config['chromium_url']) - chromium_rev = str(int(config['chromium_revision'])) -except Exception, e: - sys.stderr.write('Failed to read URL and revision information from '+ \ - compat_url+"\n") - raise - -download_dir = os.path.abspath(options.downloaddir) -if not os.path.exists(download_dir): - # create the download directory - os.makedirs(download_dir) - -# Test the operating system. -platform = ''; -if sys.platform == 'win32': - platform = 'windows' -elif sys.platform == 'darwin': - platform = 'macosx' -elif sys.platform.startswith('linux'): - platform = 'linux' - -# set the expected script extension -if platform == 'windows': - script_ext = '.bat' -else: - script_ext = '.sh' - -# check if the "depot_tools" directory exists -if options.depottools != '': - depot_tools_dir = os.path.abspath(options.depottools) -else: - depot_tools_dir = os.path.join(download_dir, 'depot_tools') -if not os.path.exists(depot_tools_dir): - # checkout depot_tools - run('svn checkout '+depot_tools_url+' '+depot_tools_dir, download_dir) - -# check if the "chromium" directory exists -chromium_dir = os.path.join(download_dir, 'chromium') -if not os.path.exists(chromium_dir): - # create the "chromium" directory - os.makedirs(chromium_dir) - -chromium_src_dir = os.path.join(chromium_dir, 'src') -cef_src_dir = os.path.join(chromium_src_dir, 'cef') -cef_tools_dir = os.path.join(cef_src_dir, 'tools') - -# retrieve the current CEF URL and revision -info = get_svn_info(cef_src_dir) -current_cef_url = info['url'] -current_cef_rev = info['revision'] - -if release_url is None: - # retrieve the current Chromium URL and revision - info = get_svn_info(chromium_src_dir) - current_chromium_url = info['url'] - current_chromium_rev = info['revision'] - -# test if the CEF URL changed -cef_url_changed = current_cef_url != cef_url -sys.stdout.write('CEF URL: '+current_cef_url+"\n") -if cef_url_changed: - sys.stdout.write(' -> CHANGED TO: '+cef_url+"\n") - -# test if the CEF revision changed -cef_rev_changed = current_cef_rev != cef_rev -sys.stdout.write('CEF Revision: '+current_cef_rev+"\n") -if cef_rev_changed: - sys.stdout.write(' -> CHANGED TO: '+cef_rev+"\n") - -release_url_changed = False -chromium_url_changed = False -chromium_rev_changed = False - -if release_url is None: - # test if the Chromium URL changed - chromium_url_changed = current_chromium_url != chromium_url - sys.stdout.write('Chromium URL: '+current_chromium_url+"\n") - if chromium_url_changed: - sys.stdout.write(' -> CHANGED TO: '+chromium_url+"\n") - - # test if the Chromium revision changed - chromium_rev_changed = current_chromium_rev != chromium_rev - sys.stdout.write('Chromium Revision: '+current_chromium_rev+"\n") - if chromium_rev_changed: - sys.stdout.write(' -> CHANGED TO: '+chromium_rev+"\n") -else: - # test if the release URL changed - current_release_url = 'None' - - path = os.path.join(chromium_dir, '.gclient') - if os.path.exists(path): - # read the .gclient file - fp = open(path, 'r') - data = fp.read() - fp.close() - - # Parse the contents - config_dict = {} - try: - exec(data, config_dict) - current_release_url = config_dict['solutions'][0]['url'] - except Exception, e: - sys.stderr.write('Failed to parse existing .glient file.\n') - raise - - release_url_changed = current_release_url != release_url - sys.stdout.write('Release URL: '+current_release_url+"\n") - if release_url_changed: - sys.stdout.write(' -> CHANGED TO: '+release_url+"\n") - -# true if anything changed -any_changed = release_url_changed or chromium_url_changed or \ - chromium_rev_changed or cef_url_changed or cef_rev_changed -if not any_changed: - sys.stdout.write("No changes.\n") - -if release_url_changed or chromium_url_changed or options.forceconfig: - if release_url is None: - url = chromium_url - else: - url = release_url - - # run gclient config to create the .gclient file - run('gclient config '+url, chromium_dir, depot_tools_dir) - - if not options.dryrun: - path = os.path.join(chromium_dir, '.gclient') - if not os.path.exists(path): - sys.stderr.write(".gclient file was not created\n") - raise Exception('.gclient file was not created') - - # read the resulting .gclient file - fp = open(path, 'r') - data = fp.read() - fp.close() - - custom_deps = \ - "\n "+'"src/third_party/WebKit/LayoutTests": None,'+\ - "\n "+'"src/chrome_frame/tools/test/reference_build/chrome": None,'+\ - "\n "+'"src/chrome/tools/test/reference_build/chrome_mac": None,'+\ - "\n "+'"src/chrome/tools/test/reference_build/chrome_win": None,'+\ - "\n "+'"src/chrome/tools/test/reference_build/chrome_linux": None,' - - if not release_url is None: - # TODO: Read the DEPS file and exclude all non-src directories. - custom_deps += \ - "\n "+'"chromeos": None,'+\ - "\n "+'"depot_tools": None,' - - # populate "custom_deps" section - data = data.replace('"custom_deps" : {', '"custom_deps" : {'+custom_deps) - - # write the new .gclient file - fp = open(path, 'w') - fp.write(data) - fp.close() - -if options.forceclean: - if os.path.exists(chromium_src_dir): - # revert all Chromium changes and delete all unversioned files - run('gclient revert -n', chromium_dir, depot_tools_dir) - - if not options.dryrun: - # remove the build output directories - output_dirs = [] - if platform == 'windows': - output_dirs.append(os.path.join(cef_src_dir, 'build\\Debug')) - output_dirs.append(os.path.join(cef_src_dir, 'build\\Release')) - elif platform == 'macosx': - output_dirs.append(os.path.join(chromium_src_dir, 'xcodebuild')) - elif platform == 'linux': - output_dirs.append(os.path.join(chromium_src_dir, 'out')) - - if options.ninjabuild: - output_dirs.append(os.path.join(chromium_src_dir, 'out')) - - for output_dir in output_dirs: - if os.path.exists(output_dir): - shutil.rmtree(output_dir, onerror=onerror) - - # force update, build and distrib steps - options.forceupdate = True - options.forcebuild = True - options.forcedistrib = True - -if release_url is None: - if chromium_url_changed or chromium_rev_changed or options.forceupdate: - # download/update the Chromium source code - run('gclient sync --revision src@'+chromium_rev+' --jobs 8 --force', \ - chromium_dir, depot_tools_dir) -elif release_url_changed or options.forceupdate: - # download/update the release source code - run('gclient sync --jobs 8 --force', chromium_dir, depot_tools_dir) - -if not os.path.exists(cef_src_dir) or cef_url_changed: - if not options.dryrun and cef_url_changed and os.path.exists(cef_src_dir): - # delete the cef directory (it will be re-downloaded) - shutil.rmtree(cef_src_dir) - - # download the CEF source code - run('svn checkout '+cef_url+' -r '+cef_rev+' '+cef_src_dir, download_dir) -elif cef_rev_changed or options.forceupdate: - # update the CEF source code - run('svn update -r '+cef_rev+' '+cef_src_dir, download_dir) - -if any_changed or options.forceupdate: - # create CEF projects - if options.ninjabuild: - os.environ['GYP_GENERATORS'] = 'ninja' - path = os.path.join(cef_src_dir, 'cef_create_projects'+script_ext) - run(path, cef_src_dir, depot_tools_dir) - -if any_changed or options.forcebuild: - if options.ninjabuild: - command = 'ninja -C ' - target = ' cefclient' - if not options.nodebugbuild: - # make CEF Debug build - run(command + os.path.join('out', 'Debug') + target, chromium_src_dir, depot_tools_dir) - - if not options.noreleasebuild: - # make CEF Release build - run(command + os.path.join('out', 'Release') + target, chromium_src_dir, depot_tools_dir) - else: - path = os.path.join(cef_tools_dir, 'build_projects'+script_ext) - - if not options.nodebugbuild: - # make CEF Debug build - run(path+' Debug', cef_tools_dir, depot_tools_dir) - - if not options.noreleasebuild: - # make CEF Release build - run(path+' Release', cef_tools_dir, depot_tools_dir) - -if (any_changed or options.forcedistrib) and not options.nodistrib: - # determine the requested distribution types - distrib_types = [] - if options.minimaldistribonly: - distrib_types.append('minimal') - elif options.clientdistribonly: - distrib_types.append('client') - else: - distrib_types.append('standard') - if options.minimaldistrib: - distrib_types.append('minimal') - if options.clientdistrib: - distrib_types.append('client') - - first_type = True - - # create the requested distribution types - for type in distrib_types: - path = os.path.join(cef_tools_dir, 'make_distrib'+script_ext) - if options.nodebugbuild or options.noreleasebuild or type != 'standard': - path = path + ' --allow-partial' - if options.ninjabuild: - path = path + ' --ninja-build' - - if type == 'minimal': - path = path + ' --minimal' - elif type == 'client': - path = path + ' --client' - - if first_type: - if options.nodistribdocs: - path = path + ' --no-docs' - if options.nodistribarchive: - path = path + ' --no-archive' - first_type = False - else: - # don't create the symbol archives or documentation more than once - path = path + ' --no-symbols --no-docs' - - # create the distribution - run(path, cef_tools_dir, depot_tools_dir) diff --git a/cef1/tools/build_projects.bat b/cef1/tools/build_projects.bat deleted file mode 100644 index e8e2ed99f..000000000 --- a/cef1/tools/build_projects.bat +++ /dev/null @@ -1,48 +0,0 @@ -@echo off -set RC= -setlocal - -if "%1" == "" ( -echo ERROR: Please specify a build target: Debug or Release -set ERRORLEVEL=1 -goto end -) - -if "%2" == "" ( -set PROJECT_NAME=cefclient -) else ( -set PROJECT_NAME=%2 -) - -echo Configuring Visual Studio environment... -if "%GYP_MSVS_VERSION%" == "2008" ( -call "%VS90COMNTOOLS%vsvars32.bat" -set PROJECT_EXT=.vcproj -) else ( -call "%VS100COMNTOOLS%vsvars32.bat" -set PROJECT_EXT=.vcxproj -set CEF_MSBUILD_PATH=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe -) - -if exist "%CEF_MSBUILD_PATH%" ( -"%CEF_MSBUILD_PATH%" /v:m /p:Configuration=%1;Platform=Win32 /t:"%PROJECT_NAME%" ..\cef.sln -) else if exist "%DevEnvDir%\devenv.com" ( -echo Building %1 target for %PROJECT_NAME% project... -"%DevEnvDir%\devenv.com" /build %1 ..\cef.sln /project %PROJECT_NAME%%PROJECT_EXT% -) else if exist "%VCINSTALLDIR%\vcpackages\vcbuild.exe" ( -echo Building %1 target for all projects... -"%VCINSTALLDIR%\vcpackages\vcbuild.exe" ..\cef.sln "%1|Win32" -) else ( -echo ERROR: Cannot find Visual Studio builder -set ERRORLEVEL=1 -) - -:end -endlocal & set RC=%ERRORLEVEL% -goto omega - -:returncode -exit /B %RC% - -:omega -call :returncode %RC% diff --git a/cef1/tools/build_projects.sh b/cef1/tools/build_projects.sh deleted file mode 100755 index 13eade15d..000000000 --- a/cef1/tools/build_projects.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -if [ -z "$1" ]; then - echo "ERROR: Please specify a build target: Debug or Release" -else - if [ -z "$2" ]; then - PROJECT_NAME='cefclient' - else - PROJECT_NAME=$2 - fi - if [ `uname` = "Linux" ]; then - pushd ../../ - make -j16 $PROJECT_NAME BUILDTYPE=$1 - popd - else - xcodebuild -project ../cef.xcodeproj -configuration $1 -target "$PROJECT_NAME" - fi -fi diff --git a/cef1/tools/cef_parser.py b/cef1/tools/cef_parser.py deleted file mode 100644 index 722ac4b19..000000000 --- a/cef1/tools/cef_parser.py +++ /dev/null @@ -1,1849 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from date_util import * -from file_util import * -import os -import re -import shutil -import string -import sys -import textwrap -import time - - -def notify(msg): - """ Display a message. """ - sys.stdout.write(' NOTE: '+msg+'\n') - -def wrap_text(text, indent = '', maxchars = 80): - """ Wrap the text to the specified number of characters. If - necessary a line will be broken and wrapped after a word. - """ - result = '' - lines = textwrap.wrap(text, maxchars - len(indent)) - for line in lines: - result += indent+line+'\n' - return result - -def wrap_code(code, indent = ' ', maxchars = 80, splitchars = '(=,'): - """ Wrap the code lines to the specified number of characters. If - necessary a line will be broken and wrapped after one of the split - characters. - """ - output = '' - - # normalize line endings - code = code.replace("\r\n", "\n") - - # break the code chunk into lines - lines = string.split(code, '\n') - for line in lines: - if len(line) <= maxchars: - # line is short enough that it doesn't need to be wrapped - output += line + '\n' - continue - - # retrieve the whitespace at the beginning of the line for later use - # as padding - ws = '' - for char in line: - if char.isspace(): - ws += char - else: - break - - # iterate over all characters in the string keeping track of where the - # last valid break character was found and wrapping the line - # accordingly - lastsplit = 0 - nextsplit = -1 - splitct = 0 - pos = 0 - for char in line: - if splitchars.find(char) >= 0: - # a new split position has been found - nextsplit = pos - size = pos - lastsplit + 1 - if splitct > 0: - size += len(ws) + len(indent) - if size >= maxchars: - # the line is too long - section = line[lastsplit:nextsplit+1] - if len(section) > 0: - # output the line portion between the last split and the - # next split - if splitct > 0: - # start a new line and trim the line section - output += '\n'+ws+indent - section = string.strip(section) - output += section - lastsplit = nextsplit + 1 - splitct += 1 - pos += 1 - if len(line) - lastsplit > 0: - # output the remainder of the line - section = line[lastsplit:] - if splitct > 0: - # start a new line and trim the line section - output += '\n'+ws+indent - section = string.strip(section) - output += section - output += '\n' - - return output - -def get_capi_file_name(cppname): - """ Convert a C++ header file name to a C API header file name. """ - return cppname[:-2]+'_capi.h' - -def get_capi_name(cppname, isclassname, prefix = None): - """ Convert a C++ CamelCaps name to a C API underscore name. """ - result = '' - lastchr = '' - for chr in cppname: - # add an underscore if the current character is an upper case letter - # and the last character was a lower case letter - if len(result) > 0 and not chr.isdigit() \ - and string.upper(chr) == chr \ - and not string.upper(lastchr) == lastchr: - result += '_' - result += string.lower(chr) - lastchr = chr - - if isclassname: - result += '_t' - - if not prefix is None: - if prefix[0:3] == 'cef': - # if the prefix name is duplicated in the function name - # remove that portion of the function name - subprefix = prefix[3:] - pos = result.find(subprefix) - if pos >= 0: - result = result[0:pos]+ result[pos+len(subprefix):] - result = prefix+'_'+result - - return result - -def get_prev_line(body, pos): - """ Retrieve the start and end positions and value for the line immediately - before the line containing the specified position. - """ - end = string.rfind(body, '\n', 0, pos) - start = body.rfind('\n', 0, end)+1 - line = body[start:end] - return { 'start' : start, 'end' : end, 'line' : line } - -def get_comment(body, name): - """ Retrieve the comment for a class or function. """ - result = [] - - pos = body.find(name) - while pos > 0: - data = get_prev_line(body, pos) - line = string.strip(data['line']) - pos = data['start'] - if len(line) == 0: - # check if the next previous line is a comment - prevdata = get_prev_line(body, pos) - if string.strip(prevdata['line'])[0:2] == '//': - result.append(None) - else: - break - elif line[0:2] == '/*' or line[-2:] == '*/': - continue - elif line[0:2] == '//': - # keep the comment line including any leading spaces - result.append(line[2:]) - else: - break - - result.reverse() - return result - -def format_comment(comment, indent, translate_map = None, maxchars = 80): - """ Return the comments array as a formatted string. """ - result = '' - wrapme = '' - hasemptyline = False - for line in comment: - # if the line starts with a leading space, remove that space - if not line is None and len(line) > 0 and line[0:1] == ' ': - line = line[1:] - didremovespace = True - else: - didremovespace = False - - if line is None or len(line) == 0 or line[0:1] == ' ' \ - or line[0:1] == '/': - # the previous paragraph, if any, has ended - if len(wrapme) > 0: - if not translate_map is None: - # apply the translation - for key in translate_map.keys(): - wrapme = wrapme.replace(key, translate_map[key]) - # output the previous paragraph - result += wrap_text(wrapme, indent+'// ', maxchars) - wrapme = '' - - if not line is None: - if len(line) == 0 or line[0:1] == ' ' or line[0:1] == '/': - # blank lines or anything that's further indented should be - # output as-is - result += indent+'//' - if len(line) > 0: - if didremovespace: - result += ' '+line - else: - result += line - result += '\n' - else: - # add to the current paragraph - wrapme += line+' ' - else: - # output an empty line - hasemptyline = True - result += '\n' - - if len(wrapme) > 0: - if not translate_map is None: - # apply the translation - for key in translate_map.keys(): - wrapme = wrapme.replace(key, translate_map[key]) - # output the previous paragraph - result += wrap_text(wrapme, indent+'// ', maxchars) - - if hasemptyline: - # an empty line means a break between comments, so the comment is - # probably a section heading and should have an extra line before it - result = '\n' + result - return result - -def format_translation_changes(old, new): - """ Return a comment stating what is different between the old and new - function prototype parts. - """ - changed = False - result = '' - - # normalize C API attributes - oldargs = [x.replace('struct _', '') for x in old['args']] - oldretval = old['retval'].replace('struct _', '') - newargs = [x.replace('struct _', '') for x in new['args']] - newretval = new['retval'].replace('struct _', '') - - # check if the prototype has changed - oldset = set(oldargs) - newset = set(newargs) - if len(oldset.symmetric_difference(newset)) > 0: - changed = True - result += '\n // WARNING - CHANGED ATTRIBUTES' - - # in the implementation set only - oldonly = oldset.difference(newset) - for arg in oldonly: - result += '\n // REMOVED: '+arg - - # in the current set only - newonly = newset.difference(oldset) - for arg in newonly: - result += '\n // ADDED: '+arg - - # check if the return value has changed - if oldretval != newretval: - changed = True - result += '\n // WARNING - CHANGED RETURN VALUE'+ \ - '\n // WAS: '+old['retval']+ \ - '\n // NOW: '+new['retval'] - - if changed: - result += '\n #pragma message("Warning: "__FILE__": '+new['name']+ \ - ' prototype has changed")\n' - - return result - -def format_translation_includes(body): - """ Return the necessary list of includes based on the contents of the - body. - """ - result = '' - - if body.find('cef_build_revision()') > 0: - result += '#include "include/cef_version.h"\n' - - # identify what CppToC classes are being used - p = re.compile('([A-Za-z0-9_]{1,})CppToC') - list = sorted(set(p.findall(body))) - for item in list: - result += '#include "libcef_dll/cpptoc/'+ \ - get_capi_name(item[3:], False)+'_cpptoc.h"\n' - - # identify what CToCpp classes are being used - p = re.compile('([A-Za-z0-9_]{1,})CToCpp') - list = sorted(set(p.findall(body))) - for item in list: - result += '#include "libcef_dll/ctocpp/'+ \ - get_capi_name(item[3:], False)+'_ctocpp.h"\n' - - if body.find('transfer_') > 0: - result += '#include "libcef_dll/transfer_util.h"\n' - - return result - -def str_to_dict(str): - """ Convert a string to a dictionary. If the same key has multiple values - the values will be stored in a list. """ - dict = {} - parts = string.split(str, ',') - for part in parts: - part = string.strip(part) - if len(part) == 0: - continue - sparts = string.split(part, '=') - if len(sparts) > 2: - raise Exception('Invalid dictionary pair format: '+part) - name = string.strip(sparts[0]) - if len(sparts) == 2: - val = string.strip(sparts[1]) - else: - val = True - if name in dict: - # a value with this name already exists - curval = dict[name] - if not isinstance(curval, list): - # convert the string value to a list - dict[name] = [curval] - dict[name].append(val) - else: - dict[name] = val - return dict - -def dict_to_str(dict): - """ Convert a dictionary to a string. """ - str = [] - for name in dict.keys(): - if not isinstance(dict[name], list): - if dict[name] is True: - # currently a bool value - str.append(name) - else: - # currently a string value - str.append(name+'='+dict[name]) - else: - # currently a list value - for val in dict[name]: - str.append(name+'='+val) - return string.join(str, ',') - - -# regex for matching comment-formatted attributes -_cre_attrib = '/\*--cef\(([A-Za-z0-9_ ,=:\n]{0,})\)--\*/' -# regex for matching class and function names -_cre_cfname = '([A-Za-z0-9_]{1,})' -# regex for matching function return values -_cre_retval = '([A-Za-z0-9_<>:,\*\&]{1,})' -# regex for matching typedef value and name combination -_cre_typedef = '([A-Za-z0-9_<>:,\*\& ]{1,})' -# regex for matching function return value and name combination -_cre_func = '([A-Za-z][A-Za-z0-9_<>:,\*\& ]{1,})' -# regex for matching virtual function modifiers -_cre_vfmod = '([A-Za-z0-9_]{0,})' -# regex for matching arbitrary whitespace -_cre_space = '[\s]{1,}' - -# Simple translation types. Format is: -# 'cpp_type' : ['capi_type', 'capi_default_value'] -_simpletypes = { - 'void' : ['void', ''], - 'void*' : ['void*', 'NULL'], - 'int' : ['int', '0'], - 'int32' : ['int32', '0'], - 'uint32' : ['uint32', '0'], - 'int64' : ['int64', '0'], - 'uint64' : ['uint64', '0'], - 'double' : ['double', '0'], - 'long' : ['long', '0'], - 'unsigned long' : ['unsigned long', '0'], - 'long long' : ['long long', '0'], - 'size_t' : ['size_t', '0'], - 'time_t' : ['time_t', '0'], - 'bool' : ['int', '0'], - 'char* const': ['char* const', 'NULL'], - 'CefCursorHandle' : ['cef_cursor_handle_t', 'NULL'], - 'CefWindowHandle' : ['cef_window_handle_t', 'NULL'], - 'CefRect' : ['cef_rect_t', 'CefRect()'], - 'CefThreadId' : ['cef_thread_id_t', 'TID_UI'], - 'CefTime' : ['cef_time_t', 'CefTime()'], -} - -def get_function_impls(content, ident): - """ Retrieve the function parts from the specified contents as a set of - return value, name, arguments and body. Ident must occur somewhere in - the value. - """ - # extract the functions - p = re.compile('\n'+_cre_func+'\((.*?)\)([A-Za-z0-9_\s]{0,})'+ - '\{(.*?)\n\}', - re.MULTILINE | re.DOTALL) - list = p.findall(content) - - # build the function map with the function name as the key - result = [] - for retval, argval, vfmod, body in list: - if retval.find(ident) < 0: - # the identifier was not found - continue - - # remove the identifier - retval = string.replace(retval, ident, '') - retval = string.strip(retval) - - # retrieve the function name - parts = string.split(retval, ' ') - name = parts[-1] - del parts[-1] - retval = string.join(parts, ' ') - - # parse the arguments - args = [] - for v in string.split(argval, ','): - v = string.strip(v) - if len(v) > 0: - args.append(v) - - result.append({ - 'retval' : string.strip(retval), - 'name' : name, - 'args' : args, - 'vfmod' : string.strip(vfmod), - 'body' : body - }) - - return result - -def get_next_function_impl(existing, name): - result = None - for item in existing: - if item['name'] == name: - result = item - existing.remove(item) - break - return result - -def get_copyright(): - result = \ -"""// Copyright (c) $YEAR$ The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool. If making changes by -// hand only do so within the body of existing method and function -// implementations. See the translator.README.txt file in the tools directory -// for more information. -// - -""" - # add the copyright year - return result.replace('$YEAR$', get_year()) - - -class obj_header: - """ Class representing a C++ header file. """ - - def __init__(self): - self.filenames = [] - self.typedefs = [] - self.funcs = [] - self.classes = [] - - def add_directory(self, directory): - """ Add all header files from the specified directory. """ - files = get_files(os.path.join(directory, '*.h')) - for file in files: - self.add_file(file) - - def add_file(self, filepath): - """ Add a header file. """ - - filename = os.path.split(filepath)[1] - added = False - - # read the input file into memory - data = read_file(filepath) - - # remove space from between template definition end brackets - data = data.replace("> >", ">>") - - # extract global typedefs - p = re.compile('\ntypedef'+_cre_space+_cre_typedef+';', - re.MULTILINE | re.DOTALL) - list = p.findall(data) - if len(list) > 0: - # build the global typedef objects - for value in list: - pos = value.rfind(' ') - if pos < 0: - raise Exception('Invalid typedef: '+value) - alias = value[pos+1:] - value = value[:pos] - self.typedefs.append(obj_typedef(self, filename, value, alias)) - - # extract global functions - p = re.compile('\n'+_cre_attrib+'\n'+_cre_func+'\((.*?)\)', - re.MULTILINE | re.DOTALL) - list = p.findall(data) - if len(list) > 0: - added = True - - # build the global function objects - for attrib, retval, argval in list: - comment = get_comment(data, retval+'('+argval+');') - self.funcs.append(obj_function(self, filename, attrib, retval, - argval, comment)) - - # extract forward declarations - p = re.compile('\nclass'+_cre_space+_cre_cfname+';') - forward_declares = p.findall(data) - - # extract classes - p = re.compile('\n'+_cre_attrib+ - '\nclass'+_cre_space+_cre_cfname+_cre_space+ - ':'+_cre_space+'public'+_cre_space+'virtual'+ - _cre_space+'CefBase'+_cre_space+ - '{(.*?)};', re.MULTILINE | re.DOTALL) - list = p.findall(data) - if len(list) > 0: - added = True - - # build the class objects - for attrib, name, body in list: - comment = get_comment(data, name+' : public virtual CefBase') - self.classes.append( - obj_class(self, filename, attrib, name, body, comment, - forward_declares)) - - if added: - # a global function or class was read from the header file - self.filenames.append(filename) - - def __repr__(self): - result = '' - - if len(self.typedefs) > 0: - strlist = [] - for cls in self.typedefs: - strlist.append(str(cls)) - result += string.join(strlist, "\n") + "\n\n" - - if len(self.funcs) > 0: - strlist = [] - for cls in self.funcs: - strlist.append(str(cls)) - result += string.join(strlist, "\n") + "\n\n" - - if len(self.classes) > 0: - strlist = [] - for cls in self.classes: - strlist.append(str(cls)) - result += string.join(strlist, "\n") - - return result - - def get_file_names(self): - """ Return the array of header file names. """ - return self.filenames - - def get_typedefs(self): - """ Return the array of typedef objects. """ - return self.typedefs - - def get_funcs(self, filename = None): - """ Return the array of function objects. """ - if filename is None: - return self.funcs - else: - # only return the functions in the specified file - res = [] - for func in self.funcs: - if func.get_file_name() == filename: - res.append(func) - return res - - def get_classes(self, filename = None): - """ Return the array of class objects. """ - if filename is None: - return self.classes - else: - # only return the classes in the specified file - res = [] - for cls in self.classes: - if cls.get_file_name() == filename: - res.append(cls) - return res - - def get_class(self, classname, defined_structs = None): - """ Return the specified class or None if not found. """ - for cls in self.classes: - if cls.get_name() == classname: - return cls - elif not defined_structs is None: - defined_structs.append(cls.get_capi_name()) - return None - - def get_class_names(self): - """ Returns the names of all classes in this object. """ - result = [] - for cls in self.classes: - result.append(cls.get_name()) - return result - - def get_types(self, list): - """ Return a dictionary mapping data types to analyzed values. """ - for cls in self.typedefs: - cls.get_types(list) - - for cls in self.classes: - cls.get_types(list) - - def get_alias_translation(self, alias): - """ Return a translation of alias to value based on typedef - statements. """ - for cls in self.typedefs: - if cls.alias == alias: - return cls.value - return None - - def get_analysis(self, value, named = True): - """ Return an analysis of the value based the header file context. """ - return obj_analysis([self], value, named) - - def get_defined_structs(self): - """ Return a list of names already defined structure names. """ - return ['cef_print_info_t', 'cef_window_info_t', 'cef_base_t'] - - def get_capi_translations(self): - """ Return a dictionary that maps C++ terminology to C API terminology. - """ - # strings that will be changed in C++ comments - map = { - 'class' : 'structure', - 'Class' : 'Structure', - 'interface' : 'structure', - 'Interface' : 'Structure', - 'true' : 'true (1)', - 'false' : 'false (0)', - 'empty' : 'NULL', - 'method' : 'function' - } - - # add mappings for all classes and functions - funcs = self.get_funcs() - for func in funcs: - map[func.get_name()+'()'] = func.get_capi_name()+'()' - - classes = self.get_classes() - for cls in classes: - map[cls.get_name()] = cls.get_capi_name() - - funcs = cls.get_virtual_funcs() - for func in funcs: - map[func.get_name()+'()'] = func.get_capi_name()+'()' - - funcs = cls.get_static_funcs() - for func in funcs: - map[func.get_name()+'()'] = func.get_capi_name()+'()' - - return map - - -class obj_class: - """ Class representing a C++ class. """ - - def __init__(self, parent, filename, attrib, name, body, comment, - forward_declares): - if not isinstance(parent, obj_header): - raise Exception('Invalid parent object type') - - self.parent = parent - self.filename = filename - self.attribs = str_to_dict(attrib) - self.name = name - self.comment = comment - self.forward_declares = forward_declares - - # extract typedefs - p = re.compile('\n'+_cre_space+'typedef'+_cre_space+_cre_typedef+';', - re.MULTILINE | re.DOTALL) - list = p.findall(body) - - # build the typedef objects - self.typedefs = [] - for value in list: - pos = value.rfind(' ') - if pos < 0: - raise Exception('Invalid typedef: '+value) - alias = value[pos+1:] - value = value[:pos] - self.typedefs.append(obj_typedef(self, filename, value, alias)) - - # extract static functions - p = re.compile('\n'+_cre_space+_cre_attrib+'\n'+_cre_space+'static'+ - _cre_space+_cre_func+'\((.*?)\)', - re.MULTILINE | re.DOTALL) - list = p.findall(body) - - # build the static function objects - self.staticfuncs = [] - for attrib, retval, argval in list: - comment = get_comment(body, retval+'('+argval+')') - self.staticfuncs.append( - obj_function_static(self, attrib, retval, argval, comment)) - - # extract virtual functions - p = re.compile('\n'+_cre_space+_cre_attrib+'\n'+_cre_space+'virtual'+ - _cre_space+_cre_func+'\((.*?)\)'+_cre_space+_cre_vfmod, - re.MULTILINE | re.DOTALL) - list = p.findall(body) - - # build the virtual function objects - self.virtualfuncs = [] - for attrib, retval, argval, vfmod in list: - comment = get_comment(body, retval+'('+argval+')') - self.virtualfuncs.append( - obj_function_virtual(self, attrib, retval, argval, comment, - vfmod)) - - def __repr__(self): - result = '/* '+dict_to_str(self.attribs)+' */ class '+self.name+"\n{" - - if len(self.typedefs) > 0: - result += "\n\t" - strlist = [] - for cls in self.typedefs: - strlist.append(str(cls)) - result += string.join(strlist, "\n\t") - - if len(self.staticfuncs) > 0: - result += "\n\t" - strlist = [] - for cls in self.staticfuncs: - strlist.append(str(cls)) - result += string.join(strlist, "\n\t") - - if len(self.virtualfuncs) > 0: - result += "\n\t" - strlist = [] - for cls in self.virtualfuncs: - strlist.append(str(cls)) - result += string.join(strlist, "\n\t") - - result += "\n};\n" - return result - - def get_file_name(self): - """ Return the C++ header file name. """ - return self.filename - - def get_capi_file_name(self): - """ Return the CAPI header file name. """ - return get_capi_file_name(self.filename) - - def get_name(self): - """ Return the class name. """ - return self.name - - def get_capi_name(self): - """ Return the CAPI structure name for this class. """ - return get_capi_name(self.name, True) - - def get_comment(self): - """ Return the class comment as an array of lines. """ - return self.comment - - def get_forward_declares(self): - """ Return the list of classes that are forward declared for this - class. """ - return self.forward_declares - - def get_attribs(self): - """ Return all attributes as a dictionary. """ - return self.attribs - - def has_attrib(self, name): - """ Return true if the specified attribute exists. """ - return name in self.attribs - - def get_attrib(self, name): - """ Return the first or only value for specified attribute. """ - if name in self.attribs: - if isinstance(self.attribs[name], list): - # the value is a list - return self.attribs[name][0] - else: - # the value is a string - return self.attribs[name] - return None - - def get_attrib_list(self, name): - """ Return all values for specified attribute as a list. """ - if name in self.attribs: - if isinstance(self.attribs[name], list): - # the value is already a list - return self.attribs[name] - else: - # convert the value to a list - return [self.attribs[name]] - return None - - def get_typedefs(self): - """ Return the array of typedef objects. """ - return self.typedefs - - def has_typedef_alias(self, alias): - """ Returns true if the specified typedef alias is defined in the scope - of this class declaration. """ - for typedef in self.typedefs: - if typedef.get_alias() == alias: - return True - return False - - def get_static_funcs(self): - """ Return the array of static function objects. """ - return self.staticfuncs - - def get_virtual_funcs(self): - """ Return the array of virtual function objects. """ - return self.virtualfuncs - - def get_types(self, list): - """ Return a dictionary mapping data types to analyzed values. """ - for cls in self.typedefs: - cls.get_types(list) - - for cls in self.staticfuncs: - cls.get_types(list) - - for cls in self.virtualfuncs: - cls.get_types(list) - - def get_alias_translation(self, alias): - for cls in self.typedefs: - if cls.alias == alias: - return cls.value - return None - - def get_analysis(self, value, named = True): - """ Return an analysis of the value based on the class definition - context. - """ - return obj_analysis([self, self.parent], value, named) - - def is_library_side(self): - """ Returns true if the class is implemented by the library. """ - return self.attribs['source'] == 'library' - - def is_client_side(self): - """ Returns true if the class is implemented by the client. """ - return self.attribs['source'] == 'client' - - -class obj_typedef: - """ Class representing a typedef statement. """ - - def __init__(self, parent, filename, value, alias): - if not isinstance(parent, obj_header) \ - and not isinstance(parent, obj_class): - raise Exception('Invalid parent object type') - - self.parent = parent - self.filename = filename - self.alias = alias - self.value = self.parent.get_analysis(value, False) - - def __repr__(self): - return 'typedef '+self.value.get_type()+' '+self.alias+';' - - def get_file_name(self): - """ Return the C++ header file name. """ - return self.filename - - def get_capi_file_name(self): - """ Return the CAPI header file name. """ - return get_capi_file_name(self.filename) - - def get_alias(self): - """ Return the alias. """ - return self.alias - - def get_value(self): - """ Return an analysis of the value based on the class or header file - definition context. - """ - return self.value - - def get_types(self, list): - """ Return a dictionary mapping data types to analyzed values. """ - name = self.value.get_type() - if not name in list: - list[name] = self.value - - -class obj_function: - """ Class representing a function. """ - - def __init__(self, parent, filename, attrib, retval, argval, comment): - self.parent = parent - self.filename = filename - self.attribs = str_to_dict(attrib) - self.retval = obj_argument(self, retval) - self.name = self.retval.remove_name() - self.comment = comment - - # build the argument objects - self.arguments = [] - arglist = string.split(argval, ',') - for arg in arglist: - arg = string.strip(arg) - if len(arg) > 0: - argument = obj_argument(self, arg) - if argument.needs_attrib_count_func() and \ - argument.get_attrib_count_func() is None: - raise Exception("A 'count_func' attribute is required "+ \ - "for the '"+argument.get_name()+ \ - "' parameter to "+self.get_qualified_name()) - self.arguments.append(argument) - - if self.retval.needs_attrib_default_retval() and \ - self.retval.get_attrib_default_retval() is None: - raise Exception("A 'default_retval' attribute is required for "+ \ - self.get_qualified_name()) - - def __repr__(self): - return '/* '+dict_to_str(self.attribs)+' */ '+self.get_cpp_proto() - - def get_file_name(self): - """ Return the C++ header file name. """ - return self.filename - - def get_capi_file_name(self): - """ Return the CAPI header file name. """ - return get_capi_file_name(self.filename) - - def get_name(self): - """ Return the function name. """ - return self.name - - def get_qualified_name(self): - """ Return the fully qualified function name. """ - if isinstance(self.parent, obj_header): - # global function - return self.name - else: - # member function - return self.parent.get_name()+'::'+self.name - - def get_capi_name(self, prefix = None): - """ Return the CAPI function name. """ - if 'capi_name' in self.attribs: - return self.attribs['capi_name'] - return get_capi_name(self.name, False, prefix) - - def get_comment(self): - """ Return the function comment as an array of lines. """ - return self.comment - - def get_attribs(self): - """ Return all attributes as a dictionary. """ - return self.attribs - - def has_attrib(self, name): - """ Return true if the specified attribute exists. """ - return name in self.attribs - - def get_attrib(self, name): - """ Return the first or only value for specified attribute. """ - if name in self.attribs: - if isinstance(self.attribs[name], list): - # the value is a list - return self.attribs[name][0] - else: - # the value is a string - return self.attribs[name] - return None - - def get_attrib_list(self, name): - """ Return all values for specified attribute as a list. """ - if name in self.attribs: - if isinstance(self.attribs[name], list): - # the value is already a list - return self.attribs[name] - else: - # convert the value to a list - return [self.attribs[name]] - return None - - def get_retval(self): - """ Return the return value object. """ - return self.retval - - def get_arguments(self): - """ Return the argument array. """ - return self.arguments - - def get_types(self, list): - """ Return a dictionary mapping data types to analyzed values. """ - for cls in self.arguments: - cls.get_types(list) - - def get_capi_parts(self, defined_structs = [], prefix = None): - """ Return the parts of the C API function definition. """ - retval = '' - dict = self.retval.get_type().get_capi(defined_structs) - if dict['format'] == 'single': - retval = dict['value'] - - name = self.get_capi_name(prefix) - args = [] - - if isinstance(self, obj_function_virtual): - # virtual functions get themselves as the first argument - str = 'struct _'+self.parent.get_capi_name()+'* self' - if isinstance(self, obj_function_virtual) and self.is_const(): - # const virtual functions get const self pointers - str = 'const '+str - args.append(str) - - if len(self.arguments) > 0: - for cls in self.arguments: - type = cls.get_type() - dict = type.get_capi(defined_structs) - if dict['format'] == 'single': - args.append(dict['value']) - elif dict['format'] == 'multi-arg': - # add an additional argument for the size of the array - type_name = type.get_name() - if type.is_const(): - # for const arrays pass the size argument by value - args.append('size_t '+type_name+'Count') - else: - # for non-const arrays pass the size argument by address - args.append('size_t* '+type_name+'Count') - args.append(dict['value']) - - return { 'retval' : retval, 'name' : name, 'args' : args } - - def get_capi_proto(self, defined_structs = [], prefix = None): - """ Return the prototype of the C API function. """ - parts = self.get_capi_parts(defined_structs, prefix) - result = parts['retval']+' '+parts['name']+ \ - '('+string.join(parts['args'], ', ')+')' - return result - - def get_cpp_parts(self, isimpl = False): - """ Return the parts of the C++ function definition. """ - retval = str(self.retval) - name = self.name - - args = [] - if len(self.arguments) > 0: - for cls in self.arguments: - args.append(str(cls)) - - if isimpl and isinstance(self, obj_function_virtual): - # enumeration return values must be qualified with the class name - # if the type is defined in the class declaration scope. - type = self.get_retval().get_type() - if type.is_result_struct() and type.is_result_struct_enum() and \ - self.parent.has_typedef_alias(retval): - retval = self.parent.get_name()+'::'+retval - - return { 'retval' : retval, 'name' : name, 'args' : args } - - def get_cpp_proto(self, classname = None): - """ Return the prototype of the C++ function. """ - parts = self.get_cpp_parts() - result = parts['retval']+' ' - if not classname is None: - result += classname+'::' - result += parts['name']+'('+string.join(parts['args'], ', ')+')' - if isinstance(self, obj_function_virtual) and self.is_const(): - result += ' const' - return result - - def is_same_side(self, other_class_name): - """ Returns true if this function is on the same side (library or - client) and the specified class. """ - if isinstance(self.parent, obj_class): - # this function is part of a class - this_is_library_side = self.parent.is_library_side() - header = self.parent.parent - else: - # this function is global - this_is_library_side = True - header = self.parent - - if other_class_name == 'CefBase': - other_is_library_side = False - else: - other_class = header.get_class(other_class_name) - if other_class is None: - raise Exception('Unknown class: '+other_class_name) - other_is_library_side = other_class.is_library_side() - - return other_is_library_side == this_is_library_side - - -class obj_function_static(obj_function): - """ Class representing a static function. """ - - def __init__(self, parent, attrib, retval, argval, comment): - if not isinstance(parent, obj_class): - raise Exception('Invalid parent object type') - obj_function.__init__(self, parent, parent.filename, attrib, retval, - argval, comment) - - def __repr__(self): - return 'static '+obj_function.__repr__(self)+';' - - def get_capi_name(self, prefix = None): - """ Return the CAPI function name. """ - if prefix is None: - # by default static functions are prefixed with the class name - prefix = get_capi_name(self.parent.get_name(), False) - return obj_function.get_capi_name(self, prefix) - -class obj_function_virtual(obj_function): - """ Class representing a virtual function. """ - - def __init__(self, parent, attrib, retval, argval, comment, vfmod): - if not isinstance(parent, obj_class): - raise Exception('Invalid parent object type') - obj_function.__init__(self, parent, parent.filename, attrib, retval, - argval, comment) - if vfmod == 'const': - self.isconst = True - else: - self.isconst = False - - def __repr__(self): - return 'virtual '+obj_function.__repr__(self)+';' - - def is_const(self): - """ Returns true if the method declaration is const. """ - return self.isconst - - -class obj_argument: - """ Class representing a function argument. """ - - def __init__(self, parent, argval): - if not isinstance(parent, obj_function): - raise Exception('Invalid parent object type') - - self.parent = parent - self.type = self.parent.parent.get_analysis(argval) - - def __repr__(self): - result = '' - if self.type.is_const(): - result += 'const ' - result += self.type.get_type() - if self.type.is_byref(): - result += '&' - elif self.type.is_byaddr(): - result += '*' - if self.type.has_name(): - result += ' '+self.type.get_name() - return result - - def get_name(self): - """ Return the name for this argument. """ - return self.type.get_name() - - def remove_name(self): - """ Remove and return the name value. """ - name = self.type.get_name() - self.type.name = None - return name - - def get_type(self): - """ Return an analysis of the argument type based on the class - definition context. - """ - return self.type - - def get_types(self, list): - """ Return a dictionary mapping data types to analyzed values. """ - name = self.type.get_type() - if not name in list: - list[name] = self.type - - def needs_attrib_count_func(self): - """ Returns true if this argument requires a 'count_func' attribute. """ - # A 'count_func' attribute is required for non-const non-string vector - # attribute types - return self.type.has_name() and \ - self.type.is_result_vector() and \ - not self.type.is_result_vector_string() and \ - not self.type.is_const() - - def get_attrib_count_func(self): - """ Returns the count function for this argument. """ - # The 'count_func' attribute value format is name:function - if not self.parent.has_attrib('count_func'): - return None - name = self.type.get_name() - vals = self.parent.get_attrib_list('count_func') - for val in vals: - parts = string.split(val, ':') - if len(parts) != 2: - raise Exception("Invalid 'count_func' attribute value for "+ \ - self.parent.get_qualified_name()+': '+val) - if string.strip(parts[0]) == name: - return string.strip(parts[1]) - return None - - def needs_attrib_default_retval(self): - """ Returns true if this argument requires a 'default_retval' attribute. - """ - # A 'default_retval' attribute is required for enumeration return value - # types. - return not self.type.has_name() and \ - self.type.is_result_struct() and \ - self.type.is_result_struct_enum() - - def get_attrib_default_retval(self): - """ Returns the defualt return value for this argument. """ - return self.parent.get_attrib('default_retval') - - def get_arg_type(self): - """ Returns the argument type as defined in translator.README.txt. """ - if not self.type.has_name(): - raise Exception('Cannot be called for retval types') - - # simple or enumeration type - if (self.type.is_result_simple() and \ - self.type.get_type() != 'bool') or \ - (self.type.is_result_struct() and \ - self.type.is_result_struct_enum()): - if self.type.is_byref(): - if self.type.is_const(): - return 'simple_byref_const' - return 'simple_byref' - elif self.type.is_byaddr(): - return 'simple_byaddr' - return 'simple_byval' - - # boolean type - if self.type.get_type() == 'bool': - if self.type.is_byref(): - return 'bool_byref' - elif self.type.is_byaddr(): - return 'bool_byaddr' - return 'bool_byval' - - # structure type - if self.type.is_result_struct() and self.type.is_byref(): - if self.type.is_const(): - return 'struct_byref_const' - return 'struct_byref' - - # string type - if self.type.is_result_string() and self.type.is_byref(): - if self.type.is_const(): - return 'string_byref_const' - return 'string_byref' - - # refptr type - if self.type.is_result_refptr(): - same_side = self.parent.is_same_side(self.type.get_refptr_type()) - if self.type.is_byref(): - if same_side: - return 'refptr_same_byref' - return 'refptr_diff_byref' - if same_side: - return 'refptr_same' - return 'refptr_diff' - - - if self.type.is_result_vector(): - # all vector types must be passed by reference - if not self.type.is_byref(): - return 'invalid' - - if self.type.is_result_vector_string(): - # string vector type - if self.type.is_const(): - return 'string_vec_byref_const' - return 'string_vec_byref' - - if self.type.is_result_vector_simple(): - if self.type.get_vector_type() != 'bool': - # simple/enumeration vector types - if self.type.is_const(): - return 'simple_vec_byref_const' - return 'simple_vec_byref' - - # boolean vector types - if self.type.is_const(): - return 'bool_vec_byref_const' - return 'bool_vec_byref' - - if self.type.is_result_vector_refptr(): - # refptr vector types - same_side = self.parent.is_same_side(self.type.get_refptr_type()) - if self.type.is_const(): - if same_side: - return 'refptr_vec_same_byref_const' - return 'refptr_vec_diff_byref_const' - if same_side: - return 'refptr_vec_same_byref' - return 'refptr_vec_diff_byref' - - - # string single map type - if self.type.is_result_map_single(): - if not self.type.is_byref(): - return 'invalid' - if self.type.is_const(): - return 'string_map_single_byref_const' - return 'string_map_single_byref' - - # string multi map type - if self.type.is_result_map_multi(): - if not self.type.is_byref(): - return 'invalid' - if self.type.is_const(): - return 'string_map_multi_byref_const' - return 'string_map_multi_byref' - - return 'invalid' - - def get_retval_type(self): - """ Returns the retval type as defined in translator.README.txt. """ - if self.type.has_name(): - raise Exception('Cannot be called for argument types') - - # unsupported modifiers - if self.type.is_const() or self.type.is_byref() or \ - self.type.is_byaddr(): - return 'invalid' - - # void types don't have a return value - if self.type.get_type() == 'void': - return 'none' - - if (self.type.is_result_simple() and \ - self.type.get_type() != 'bool') or \ - (self.type.is_result_struct() and self.type.is_result_struct_enum()): - return 'simple' - - if self.type.get_type() == 'bool': - return 'bool' - - if self.type.is_result_string(): - return 'string' - - if self.type.is_result_refptr(): - if self.parent.is_same_side(self.type.get_refptr_type()): - return 'refptr_same' - else: - return 'refptr_diff' - - return 'invalid' - - def get_retval_default(self, for_capi): - """ Returns the default return value based on the retval type. """ - # start with the default retval attribute, if any. - retval = self.get_attrib_default_retval() - if not retval is None: - if for_capi: - # apply any appropriate C API translations. - if retval == 'true': - return '1' - if retval == 'false': - return '0' - return retval - - # next look at the retval type value. - type = self.get_retval_type() - if type == 'simple': - return self.get_type().get_result_simple_default() - elif type == 'bool': - if for_capi: - return '0' - return 'false' - elif type == 'string': - if for_capi: - return 'NULL' - return 'CefString()' - elif type == 'refptr_same' or type == 'refptr_diff': - return 'NULL' - - return '' - -class obj_analysis: - """ Class representing an analysis of a data type value. """ - - def __init__(self, scopelist, value, named): - self.value = value - self.result_type = 'unknown' - self.result_value = None - self.result_default = None - self.refptr_type = None - - # parse the argument string - partlist = string.split(string.strip(value)) - - if named == True: - # extract the name value - self.name = partlist[-1] - del partlist[-1] - else: - self.name = None - - if len(partlist) == 0: - raise Exception('Invalid argument value: '+value) - - # check const status - if partlist[0] == 'const': - self.isconst = True - del partlist[0] - else: - self.isconst = False - - # combine the data type - self.type = string.join(partlist, ' ') - - # extract the last character of the data type - endchar = self.type[-1] - - # check if the value is passed by reference - if endchar == '&': - self.isbyref = True - self.type = self.type[:-1] - else: - self.isbyref = False - - # check if the value is passed by address - if endchar == '*': - self.isbyaddr = True - self.type = self.type[:-1] - else: - self.isbyaddr = False - - # see if the value is directly identifiable - if self._check_advanced(self.type) == True: - return - - # not identifiable, so look it up - translation = None - for scope in scopelist: - if not isinstance(scope, obj_header) \ - and not isinstance(scope, obj_class): - raise Exception('Invalid scope object type') - translation = scope.get_alias_translation(self.type) - if not translation is None: - break - - if translation is None: - raise Exception('Failed to translate type: '+self.type) - - # the translation succeeded so keep the result - self.result_type = translation.result_type - self.result_value = translation.result_value - - def _check_advanced(self, value): - # check for vectors - if value.find('std::vector') == 0: - self.result_type = 'vector' - val = string.strip(value[12:-1]) - self.result_value = [ - self._get_basic(val) - ] - self.result_value[0]['vector_type'] = val - return True - - # check for maps - if value.find('std::map') == 0: - self.result_type = 'map' - vals = string.split(value[9:-1], ',') - if len(vals) == 2: - self.result_value = [ - self._get_basic(string.strip(vals[0])), - self._get_basic(string.strip(vals[1])) - ] - return True - - # check for multimaps - if value.find('std::multimap') == 0: - self.result_type = 'multimap' - vals = string.split(value[14:-1], ',') - if len(vals) == 2: - self.result_value = [ - self._get_basic(string.strip(vals[0])), - self._get_basic(string.strip(vals[1])) - ] - return True - - # check for basic types - basic = self._get_basic(value) - if not basic is None: - self.result_type = basic['result_type'] - self.result_value = basic['result_value'] - if 'refptr_type' in basic: - self.refptr_type = basic['refptr_type'] - if 'result_default' in basic: - self.result_default = basic['result_default'] - return True - - return False - - def _get_basic(self, value): - # check for string values - if value == "CefString": - return { - 'result_type' : 'string', - 'result_value' : None - } - - # check for simple direct translations - if value in _simpletypes.keys(): - return { - 'result_type' : 'simple', - 'result_value' : _simpletypes[value][0], - 'result_default' : _simpletypes[value][1], - } - - # check if already a C API structure - if value[-2:] == '_t': - return { - 'result_type' : 'structure', - 'result_value' : value - } - - # check for CEF reference pointers - p = re.compile('^CefRefPtr<(.*?)>$', re.DOTALL) - list = p.findall(value) - if len(list) == 1: - return { - 'result_type' : 'refptr', - 'result_value' : get_capi_name(list[0], True)+'*', - 'refptr_type' : list[0] - } - - # check for CEF structure types - if value[0:3] == 'Cef' and value[-4:] != 'List': - return { - 'result_type' : 'structure', - 'result_value' : get_capi_name(value, True) - } - - return None - - def __repr__(self): - return '('+self.result_type+') '+str(self.result_value) - - def has_name(self): - """ Returns true if a name value exists. """ - return (not self.name is None) - - def get_name(self): - """ Return the name. """ - return self.name - - def get_value(self): - """ Return the C++ value (type + name). """ - return self.value - - def get_type(self): - """ Return the C++ type. """ - return self.type - - def get_refptr_type(self): - """ Return the C++ class type referenced by a CefRefPtr. """ - if self.is_result_vector() and self.is_result_vector_refptr(): - # return the vector RefPtr type - return self.result_value[0]['refptr_type'] - # return the basic RefPtr type - return self.refptr_type - - def get_vector_type(self): - """ Return the C++ class type referenced by a std::vector. """ - if self.is_result_vector(): - return self.result_value[0]['vector_type'] - return None - - def is_const(self): - """ Returns true if the argument value is constant. """ - return self.isconst - - def is_byref(self): - """ Returns true if the argument is passed by reference. """ - return self.isbyref - - def is_byaddr(self): - """ Returns true if the argument is passed by address. """ - return self.isbyaddr - - def is_result_simple(self): - """ Returns true if this is a simple argument type. """ - return (self.result_type == 'simple') - - def get_result_simple_type_root(self): - """ Return the simple structure or basic type name. """ - return self.result_value - - def get_result_simple_type(self): - """ Return the simple type. """ - result = '' - if self.is_const(): - result += 'const ' - result += self.result_value - if self.is_byaddr() or self.is_byref(): - result += '*' - return result - - def get_result_simple_default(self): - """ Return the default value fo the basic type. """ - return self.result_default - - def is_result_refptr(self): - """ Returns true if this is a reference pointer type. """ - return (self.result_type == 'refptr') - - def get_result_refptr_type_root(self): - """ Return the refptr type structure name. """ - return self.result_value[:-1] - - def get_result_refptr_type(self, defined_structs = []): - """ Return the refptr type. """ - result = '' - if not self.result_value[:-1] in defined_structs: - result += 'struct _' - result += self.result_value - if self.is_byref() or self.is_byaddr(): - result += '*' - return result - - def is_result_struct(self): - """ Returns true if this is a structure type. """ - return (self.result_type == 'structure') - - def is_result_struct_enum(self): - """ Returns true if this struct type is likely an enumeration. """ - # structure values that are passed by reference or address must be - # structures and not enumerations - if not self.is_byref() and not self.is_byaddr(): - return True - return False - - def get_result_struct_type(self, defined_structs = []): - """ Return the structure or enumeration type. """ - result = '' - is_enum = self.is_result_struct_enum() - if not is_enum: - if self.is_const(): - result += 'const ' - if not self.result_value in defined_structs: - result += 'struct _' - else: - result += 'enum ' - result += self.result_value - if not is_enum: - result += '*' - return result - - def is_result_string(self): - """ Returns true if this is a string type. """ - return (self.result_type == 'string') - - def get_result_string_type(self): - """ Return the string type. """ - if not self.has_name(): - # Return values are string structs that the user must free. Use - # the name of the structure as a hint. - return 'cef_string_userfree_t' - elif not self.is_const() and (self.is_byref() or self.is_byaddr()): - # Parameters passed by reference or address. Use the normal - # non-const string struct. - return 'cef_string_t*' - # Const parameters use the const string struct. - return 'const cef_string_t*' - - def is_result_vector(self): - """ Returns true if this is a vector type. """ - return (self.result_type == 'vector') - - def is_result_vector_string(self): - """ Returns true if this is a string vector. """ - return self.result_value[0]['result_type'] == 'string' - - def is_result_vector_simple(self): - """ Returns true if this is a string vector. """ - return self.result_value[0]['result_type'] == 'simple' - - def is_result_vector_refptr(self): - """ Returns true if this is a string vector. """ - return self.result_value[0]['result_type'] == 'refptr' - - def get_result_vector_type_root(self): - """ Return the vector structure or basic type name. """ - return self.result_value[0]['result_value'] - - def get_result_vector_type(self, defined_structs = []): - """ Return the vector type. """ - if not self.has_name(): - raise Exception('Cannot use vector as a return type') - - type = self.result_value[0]['result_type'] - value = self.result_value[0]['result_value'] - - result = {} - if type == 'string': - result['value'] = 'cef_string_list_t' - result['format'] = 'single' - return result - - if type == 'simple': - str = value - if self.is_const(): - str += ' const' - str += '*' - result['value'] = str - elif type == 'refptr': - str = '' - if not value[:-1] in defined_structs: - str += 'struct _' - str += value - if self.is_const(): - str += ' const' - str += '*' - result['value'] = str - else: - raise Exception('Unsupported vector type: '+type) - - # vector values must be passed as a value array parameter - # and a size parameter - result['format'] = 'multi-arg' - return result - - def is_result_map(self): - """ Returns true if this is a map type. """ - return (self.result_type == 'map' or self.result_type == 'multimap') - - def is_result_map_single(self): - """ Returns true if this is a single map type. """ - return (self.result_type == 'map') - - def is_result_map_multi(self): - """ Returns true if this is a multi map type. """ - return (self.result_type == 'multimap') - - def get_result_map_type(self, defined_structs = []): - """ Return the map type. """ - if not self.has_name(): - raise Exception('Cannot use map as a return type') - if self.result_value[0]['result_type'] == 'string' \ - and self.result_value[1]['result_type'] == 'string': - if self.result_type == 'map': - return { - 'value' : 'cef_string_map_t', - 'format' : 'single' - } - elif self.result_type == 'multimap': - return { - 'value' : 'cef_string_multimap_t', - 'format' : 'multi' - } - raise Exception('Only mappings of strings to strings are supported') - - def get_capi(self, defined_structs = []): - """ Format the value for the C API. """ - result = '' - format = 'single' - if self.is_result_simple(): - result += self.get_result_simple_type() - elif self.is_result_refptr(): - result += self.get_result_refptr_type(defined_structs) - elif self.is_result_struct(): - result += self.get_result_struct_type(defined_structs) - elif self.is_result_string(): - result += self.get_result_string_type() - elif self.is_result_map(): - resdict = self.get_result_map_type(defined_structs) - if resdict['format'] == 'single' or resdict['format'] == 'multi': - result += resdict['value'] - else: - raise Exception('Unsupported map type') - elif self.is_result_vector(): - resdict = self.get_result_vector_type(defined_structs) - if resdict['format'] != 'single': - format = resdict['format'] - result += resdict['value'] - - if self.has_name(): - result += ' '+self.get_name() - - return {'format' : format, 'value' : result} - - -# test the module -if __name__ == "__main__": - import pprint - import sys - - # verify that the correct number of command-line arguments are provided - if len(sys.argv) != 2: - sys.stderr.write('Usage: '+sys.argv[0]+' ') - sys.exit() - - pp = pprint.PrettyPrinter(indent=4) - - # create the header object - header = obj_header() - header.add_directory(sys.argv[1]) - - # output the type mapping - types = {} - header.get_types(types) - pp.pprint(types) - sys.stdout.write('\n') - - # output the parsed C++ data - sys.stdout.write(wrap_code(str(header), '\t')) - - # output the C API formatted data - defined_names = header.get_defined_structs() - result = '' - - # global functions - funcs = header.get_funcs() - if len(funcs) > 0: - for func in funcs: - result += func.get_capi_proto(defined_names)+';\n' - result += '\n' - - classes = header.get_classes() - for cls in classes: - # virtual functions are inside a structure - result += 'struct '+cls.get_capi_name()+'\n{\n' - funcs = cls.get_virtual_funcs() - if len(funcs) > 0: - for func in funcs: - result += '\t'+func.get_capi_proto(defined_names)+';\n' - result += '}\n\n' - - defined_names.append(cls.get_capi_name()) - - # static functions become global - funcs = cls.get_static_funcs() - if len(funcs) > 0: - for func in funcs: - result += func.get_capi_proto(defined_names)+';\n' - result += '\n' - sys.stdout.write(wrap_code(result, '\t')) diff --git a/cef1/tools/check_revision.py b/cef1/tools/check_revision.py deleted file mode 100644 index e9334dca2..000000000 --- a/cef1/tools/check_revision.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from file_util import * -from optparse import OptionParser -from svn_util import * -import sys - -# cannot be loaded as a module -if __name__ != "__main__": - sys.stderr.write('This file cannot be loaded as a module!') - sys.exit() - - -# parse command-line options -disc = """ -This utility checks that the correct Chromium revision is being used. -""" - -parser = OptionParser(description=disc) -parser.add_option('-q', '--quiet', - action='store_true', dest='quiet', default=False, - help='do not output detailed status information') -(options, args) = parser.parse_args() - -# The CEF root directory is the parent directory of _this_ script. -cef_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) - -# Retrieve the CEF SVN info. -cef_info = get_svn_info(cef_dir) -if not options.quiet: - sys.stdout.write('Using CEF revision '+cef_info['revision']+' @ '+\ - cef_info['url']+"\n") - -# Retrieve the Chromium SVN info. -src_dir = os.path.join(cef_dir, os.pardir) -chromium_info = get_svn_info(src_dir) -if not options.quiet: - sys.stdout.write('Using Chromium revision '+chromium_info['revision']+' @ '+\ - chromium_info['url']+"\n") - -# Parse the compatibility file contents. -compat_file = os.path.join(cef_dir, 'CHROMIUM_BUILD_COMPATIBILITY.txt') -config = eval(read_file(compat_file), {'__builtins__': None}, None) - -error = False - -if 'release_url' in config: - current_release_url = None - path = os.path.join(os.path.join(src_dir, os.pardir), '.gclient') - if os.path.exists(path): - # read the .gclient file - fp = open(path, 'r') - data = fp.read() - fp.close() - - # Parse the contents - config_dict = {} - try: - exec(data, config_dict) - current_release_url = config_dict['solutions'][0]['url'] - except Exception, e: - sys.stderr.write('Failed to parse existing .glient file.\n') - raise - - if not options.quiet: - sys.stdout.write('Using Chromium release '+current_release_url+"\n") - - if current_release_url != config['release_url']: - error = True - sys.stderr.write("\nWARNING: Incorrect Chromium release URL; found "+\ - current_release_url+', expected '+config['release_url']+"\n") -else: - if chromium_info['url'] != config['chromium_url']: - error = True - sys.stderr.write("\nWARNING: Incorrect Chromium URL; found "+\ - chromium_info['url']+', expected '+config['chromium_url']+"\n") - - if chromium_info['revision'] != config['chromium_revision']: - error = True - sys.stderr.write("\nWARNING: Incorrect Chromium revision; found "+\ - chromium_info['revision']+', expected '+config['chromium_revision']+"\n") - -if error: - sys.stderr.write("\nPlease see CHROMIUM_BUILD_COMPATIBILITY.txt for "\ - "instructions.\n") diff --git a/cef1/tools/check_style.bat b/cef1/tools/check_style.bat deleted file mode 100644 index 43612cf91..000000000 --- a/cef1/tools/check_style.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -..\..\third_party\python_26\python.exe check_style.py %* diff --git a/cef1/tools/check_style.py b/cef1/tools/check_style.py deleted file mode 100644 index d734e76fb..000000000 --- a/cef1/tools/check_style.py +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright (c) 2012 The Chromium Embedded Framework Authors. -# Portions copyright (c) 2011 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 os, re, string, sys -from file_util import * -import git_util as git -import svn_util as svn - -# script directory -script_dir = os.path.dirname(__file__) - -# CEF root directory -cef_dir = os.path.abspath(os.path.join(script_dir, os.pardir)) - -# Valid extensions for files we want to lint. -DEFAULT_LINT_WHITELIST_REGEX = r"(.*\.cpp|.*\.cc|.*\.h)" -DEFAULT_LINT_BLACKLIST_REGEX = r"$^" - -try: - # depot_tools may already be in the import path. - import cpplint - import cpplint_chromium -except ImportError, e: - # Search the PATH environment variable to find the depot_tools folder. - depot_tools = None; - paths = os.environ.get('PATH').split(os.pathsep) - for path in paths: - if os.path.exists(os.path.join(path, 'cpplint_chromium.py')): - depot_tools = path - break - - if depot_tools is None: - print >> sys.stderr, 'Error: could not find depot_tools in PATH.' - sys.exit(2) - - # Add depot_tools to import path. - sys.path.append(depot_tools) - import cpplint - import cpplint_chromium - -# The default implementation of FileInfo.RepositoryName looks for the top-most -# directory that contains a .git or .svn folder. This is a problem for CEF -# because the CEF root folder (which may have an arbitrary name) lives inside -# the Chromium src folder. Reimplement in a dumb but sane way. -def patch_RepositoryName(self): - fullname = self.FullName() - project_dir = os.path.dirname(fullname) - if os.path.exists(fullname): - root_dir = project_dir - while os.path.basename(project_dir) != "src": - project_dir = os.path.dirname(project_dir) - prefix = os.path.commonprefix([root_dir, project_dir]) - components = fullname[len(prefix) + 1:].split('/') - return string.join(["cef"] + components[1:], '/') - return fullname - -def check_style(args, white_list = None, black_list = None): - """ Execute cpplint with the specified arguments. """ - - # Apply patches. - cpplint.FileInfo.RepositoryName = patch_RepositoryName - - # Process cpplint arguments. - filenames = cpplint.ParseArguments(args) - - if not white_list: - white_list = DEFAULT_LINT_WHITELIST_REGEX - white_regex = re.compile(white_list) - if not black_list: - black_list = DEFAULT_LINT_BLACKLIST_REGEX - black_regex = re.compile(black_list) - - extra_check_functions = [cpplint_chromium.CheckPointerDeclarationWhitespace] - - for filename in filenames: - if white_regex.match(filename): - if black_regex.match(filename): - print "Ignoring file %s" % filename - else: - cpplint.ProcessFile(filename, cpplint._cpplint_state.verbose_level, - extra_check_functions) - else: - print "Skipping file %s" % filename - - print "Total errors found: %d\n" % cpplint._cpplint_state.error_count - return 1 - -def get_changed_files(): - """ Retrieve the list of changed files. """ - try: - return svn.get_changed_files(cef_dir) - except: - return git.get_changed_files(cef_dir) - -if __name__ == "__main__": - # Start with the default parameters. - args = [ - # * Disable the 'build/class' test because it errors uselessly with C - # structure pointers and template declarations. - # * Disable the 'runtime/references' test because CEF allows non-const - # arguments passed by reference. - # * Disable the 'runtime/sizeof' test because it has a high number of - # false positives and adds marginal value. - '--filter=-build/class,-runtime/references,-runtime/sizeof', - ] - - # Add anything passed on the command-line. - args += sys.argv[1:] - - # Pre-process the arguments before passing to the linter. - new_args = [] - changed = [] - for arg in args: - if arg == '--changed': - # Add any changed files. - changed = get_changed_files() - elif arg[:2] == '--' or not os.path.isdir(arg): - # Pass argument unchanged. - new_args.append(arg) - else: - # Add all files in the directory. - new_args += get_files(os.path.join(arg, '*')) - - if len(changed) > 0: - new_args += changed - - check_style(new_args) diff --git a/cef1/tools/check_style.sh b/cef1/tools/check_style.sh deleted file mode 100755 index 3a38a6ab7..000000000 --- a/cef1/tools/check_style.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -python check_style.py $@ diff --git a/cef1/tools/date_util.py b/cef1/tools/date_util.py deleted file mode 100644 index c19af17b4..000000000 --- a/cef1/tools/date_util.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework 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 datetime - -def get_year(): - """ Returns the current year. """ - return str(datetime.datetime.now().year) - -def get_date(): - """ Returns the current date. """ - return datetime.datetime.now().strftime('%B %d, %Y') diff --git a/cef1/tools/distrib/README-TRANSFER.txt b/cef1/tools/distrib/README-TRANSFER.txt deleted file mode 100644 index 6843cc201..000000000 --- a/cef1/tools/distrib/README-TRANSFER.txt +++ /dev/null @@ -1,5 +0,0 @@ -Files in this directory have been copied from other locations in the Chromium -source tree. They have been modified only to the extent necessary to work in -the CEF Binary Distribution directory structure. Below is a listing of the -original file locations. - diff --git a/cef1/tools/distrib/README.client.txt b/cef1/tools/distrib/README.client.txt deleted file mode 100644 index 650c078a0..000000000 --- a/cef1/tools/distrib/README.client.txt +++ /dev/null @@ -1,12 +0,0 @@ -CONTENTS --------- - -Release Contains a release build of the cefclient sample application. - - -USAGE ------ - -Please visit the CEF Website for additional usage information. - -http://code.google.com/p/chromiumembedded diff --git a/cef1/tools/distrib/README.footer.txt b/cef1/tools/distrib/README.footer.txt deleted file mode 100644 index 8c7685d7a..000000000 --- a/cef1/tools/distrib/README.footer.txt +++ /dev/null @@ -1,6 +0,0 @@ -LICENSING ---------- - -The CEF project is BSD licensed. Please read the LICENSE.txt file included with -this binary distribution for licensing terms and conditions. Other software -included in this distribution is provided under other licenses. diff --git a/cef1/tools/distrib/README.header.txt b/cef1/tools/distrib/README.header.txt deleted file mode 100644 index 541d23a6b..000000000 --- a/cef1/tools/distrib/README.header.txt +++ /dev/null @@ -1,12 +0,0 @@ -Chromium Embedded Framework (CEF) $DISTRIB_TYPE$ Binary Distribution for $PLATFORM$ -------------------------------------------------------------------------------- - -Date: $DATE$ - -CEF Version: $CEF_VER$ -CEF URL: $CEF_URL$@$CEF_REV$ - -Chromium Verison: $CHROMIUM_VER$ -Chromium URL: $CHROMIUM_URL$@$CHROMIUM_REV$ - -$DISTRIB_DESC$ diff --git a/cef1/tools/distrib/cefclient.gyp b/cef1/tools/distrib/cefclient.gyp deleted file mode 100644 index 586565852..000000000 --- a/cef1/tools/distrib/cefclient.gyp +++ /dev/null @@ -1,237 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -{ - 'variables': { - 'chromium_code': 1, - 'linux_use_gold_binary': 0, - 'linux_use_gold_flags': 0, - 'conditions': [ - [ 'OS=="mac"', { - # Don't use clang with CEF binary releases due to Chromium tree structure dependency. - 'clang': 0, - }], - ['sysroot!=""', { - 'pkg-config': './pkg-config-wrapper "<(sysroot)" "<(target_arch)"', - }, { - 'pkg-config': 'pkg-config' - }], - ] - }, - 'includes': [ - # Bring in the source file lists for cefclient. - 'cef_paths2.gypi', - ], - 'targets': [ - { - 'target_name': 'cefclient', - 'type': 'executable', - 'mac_bundle': 1, - 'msvs_guid': '6617FED9-C5D4-4907-BF55-A90062A6683F', - 'dependencies': [ - 'libcef_dll_wrapper', - ], - 'defines': [ - 'USING_CEF_SHARED', - ], - 'include_dirs': [ - '.', - ], - 'sources': [ - '<@(includes_common)', - '<@(includes_wrapper)', - '<@(cefclient_sources_common)', - ], - 'mac_bundle_resources': [ - '<@(cefclient_bundle_resources_mac)', - ], - 'mac_bundle_resources!': [ - # TODO(mark): Come up with a fancier way to do this (mac_info_plist?) - # that automatically sets the correct INFOPLIST_FILE setting and adds - # the file to a source group. - 'cefclient/mac/Info.plist', - ], - 'xcode_settings': { - 'INFOPLIST_FILE': 'cefclient/mac/Info.plist', - # Target build path. - 'SYMROOT': 'xcodebuild', - }, - 'conditions': [ - ['OS=="win"', { - 'actions': [ - { - 'action_name': 'copy_resources', - 'msvs_cygwin_shell': 0, - 'inputs': [], - 'outputs': [ - '<(PRODUCT_DIR)/copy_resources.stamp', - ], - 'action': [ - 'xcopy /efy', - 'Resources\*', - '$(OutDir)', - ], - }, - { - 'action_name': 'copy_libraries', - 'msvs_cygwin_shell': 0, - 'inputs': [], - 'outputs': [ - '<(PRODUCT_DIR)/copy_resources.stamp', - ], - 'action': [ - 'xcopy /efy', - '$(ConfigurationName)\*.dll', - '$(OutDir)', - ], - }, - ], - 'msvs_settings': { - 'VCLinkerTool': { - # Set /SUBSYSTEM:WINDOWS. - 'SubSystem': '2', - 'EntryPointSymbol' : 'wWinMainCRTStartup', - }, - }, - 'link_settings': { - 'libraries': [ - '-lcomctl32.lib', - '-lshlwapi.lib', - '-lrpcrt4.lib', - '-lopengl32.lib', - '-lglu32.lib', - '-l$(ConfigurationName)/libcef.lib' - ], - }, - 'sources': [ - '<@(includes_win)', - '<@(cefclient_sources_win)', - ], - }], - [ 'OS=="mac"', { - 'product_name': 'cefclient', - 'copies': [ - { - # Add library dependencies to the bundle. - 'destination': '<(PRODUCT_DIR)/cefclient.app/Contents/MacOS/', - 'files': [ - '$(CONFIGURATION)/libcef.dylib', - ], - }, - { - # Add other resources to the bundle. - 'destination': '<(PRODUCT_DIR)/cefclient.app/Contents/', - 'files': [ - 'Resources/', - ], - }, - ], - 'link_settings': { - 'libraries': [ - '$(SDKROOT)/System/Library/Frameworks/AppKit.framework', - '$(SDKROOT)/System/Library/Frameworks/OpenGL.framework', - '$(CONFIGURATION)/libcef.dylib' - ], - }, - 'sources': [ - '<@(includes_mac)', - '<@(cefclient_sources_mac)', - ], - }], - [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', { - 'copies': [ - { - 'destination': '<(PRODUCT_DIR)/files', - 'files': [ - '<@(cefclient_bundle_resources_linux)', - ], - }, - { - 'destination': '<(PRODUCT_DIR)/', - 'files': [ - 'Resources/chrome.pak', - 'Resources/devtools_resources.pak', - 'Resources/locales/', - '$(BUILDTYPE)/libcef.so', - ], - }, - ], - 'dependencies': [ - 'gtk', - ], - 'link_settings': { - 'ldflags': [ - # Look for libcef.so in the current directory. Path can also be - # specified using the LD_LIBRARY_PATH environment variable. - '-Wl,-rpath,.', - ], - 'libraries': [ - "$(BUILDTYPE)/libcef.so", - ], - }, - 'sources': [ - '<@(includes_linux)', - '<@(cefclient_sources_linux)', - ], - }], - ], - }, - { - 'target_name': 'libcef_dll_wrapper', - 'type': 'static_library', - 'msvs_guid': 'A9D6DC71-C0DC-4549-AEA0-3B15B44E86A9', - 'defines': [ - 'USING_CEF_SHARED', - ], - 'include_dirs': [ - '.', - ], - 'sources': [ - '<@(includes_common)', - '<@(includes_capi)', - '<@(includes_wrapper)', - '<@(libcef_dll_wrapper_sources_common)', - ], - 'xcode_settings': { - # Target build path. - 'SYMROOT': 'xcodebuild', - }, - 'conditions': [ - [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', { - 'dependencies': [ - 'gtk', - ], - }], - ], - }, - ], - 'conditions': [ - [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', { - 'targets': [ - { - 'target_name': 'gtk', - 'type': 'none', - 'variables': { - # gtk requires gmodule, but it does not list it as a dependency - # in some misconfigured systems. - 'gtk_packages': 'gmodule-2.0 gtk+-2.0 gthread-2.0', - }, - 'direct_dependent_settings': { - 'cflags': [ - '$(shell <(pkg-config) --cflags <(gtk_packages))', - ], - }, - 'link_settings': { - 'ldflags': [ - '$(shell <(pkg-config) --libs-only-L --libs-only-other <(gtk_packages))', - ], - 'libraries': [ - '$(shell <(pkg-config) --libs-only-l <(gtk_packages))', - ], - }, - }, - ], - }], # OS=="linux" or OS=="freebsd" or OS=="openbsd" - ], -} diff --git a/cef1/tools/distrib/linux/README.minimal.txt b/cef1/tools/distrib/linux/README.minimal.txt deleted file mode 100644 index abe1d2224..000000000 --- a/cef1/tools/distrib/linux/README.minimal.txt +++ /dev/null @@ -1,17 +0,0 @@ -CONTENTS --------- - -Release Contains libcef.so and other components required to run the release - version of CEF-based applications. By default these files should be - placed in the same directory as the executable. - -Resources Contains resources required by libcef.so. By default these files - should be placed in the same directory as libcef.so. - - -USAGE ------ - -Please visit the CEF Website for additional usage information. - -http://code.google.com/p/chromiumembedded diff --git a/cef1/tools/distrib/linux/README.redistrib.txt b/cef1/tools/distrib/linux/README.redistrib.txt deleted file mode 100644 index df1c5a832..000000000 --- a/cef1/tools/distrib/linux/README.redistrib.txt +++ /dev/null @@ -1,31 +0,0 @@ -REDISTRIBUTION --------------- - -This binary distribution contains the below components. Components listed under -the "required" section must be redistributed with all applications using CEF. -Components listed under the "optional" section may be excluded if the related -features will not be used. - -Required components: - -* CEF core library - libcef.so - -Optional components: - -* Localized resources - locales/ - Note: Contains localized strings for WebKit UI controls. A .pak file is loaded - from this folder based on the value of environment variables which are read - with the following precedence order: LANGUAGE, LC_ALL, LC_MESSAGES and LANG. - Only configured locales need to be distributed. If no locale is configured the - default locale of "en-US" will be used. Locale file loading can be disabled - completely using CefSettings.pack_loading_disabled. The locales folder path - can be customized using CefSettings.locales_dir_path. - -* Other resources - chrome.pak - devtools_resources.pak - Note: Contains WebKit image and inspector resources. Pack file loading can be - disabled completely using CefSettings.pack_loading_disabled. The resources - directory path can be customized using CefSettings.resources_dir_path. diff --git a/cef1/tools/distrib/linux/README.standard.txt b/cef1/tools/distrib/linux/README.standard.txt deleted file mode 100644 index 223b8de7d..000000000 --- a/cef1/tools/distrib/linux/README.standard.txt +++ /dev/null @@ -1,34 +0,0 @@ -CONTENTS --------- - -cefclient Contains the cefclient sample application configured to build - using the files in this distribution. - -Debug Contains libcef.so and other components required to run the debug - version of CEF-based applications. By default these files should be - placed in the same directory as the executable and will be copied - there as part of the build process. - -include Contains all required CEF header files. - -libcef_dll Contains the source code for the libcef_dll_wrapper static library - that all applications using the CEF C++ API must link against. - -Release Contains libcef.so and other components required to run the release - version of CEF-based applications. By default these files should be - placed in the same directory as the executable and will be copied - there as part of the build process. - -Resources Contains resources required by libcef.so. By default these files - should be placed in the same directory as libcef.so and will be - copied there as part of the build process. - - -USAGE ------ - -Run 'build.sh Debug' to build the cefclient target in Debug mode. - -Please visit the CEF Website for additional usage information. - -http://code.google.com/p/chromiumembedded diff --git a/cef1/tools/distrib/linux/build.sh b/cef1/tools/distrib/linux/build.sh deleted file mode 100755 index c291839ac..000000000 --- a/cef1/tools/distrib/linux/build.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -if [ -z "$1" ]; then - echo "ERROR: Please specify a build target: Debug or Release" -else - make -j8 cefclient BUILDTYPE=$1 -fi - - diff --git a/cef1/tools/distrib/mac/README.minimal.txt b/cef1/tools/distrib/mac/README.minimal.txt deleted file mode 100644 index ca029178e..000000000 --- a/cef1/tools/distrib/mac/README.minimal.txt +++ /dev/null @@ -1,17 +0,0 @@ -CONTENTS --------- - -Release Contains libcef.dylib and other components required to run the - release version of CEF-based applications. - -Resources Contains images and resources required by applications using CEF. - The contents of this folder should be transferred to the - Contents/Resources folder in the app bundle. - - -USAGE ------ - -Please visit the CEF Website for additional usage information. - -http://code.google.com/p/chromiumembedded diff --git a/cef1/tools/distrib/mac/README.redistrib.txt b/cef1/tools/distrib/mac/README.redistrib.txt deleted file mode 100644 index 57d386029..000000000 --- a/cef1/tools/distrib/mac/README.redistrib.txt +++ /dev/null @@ -1,33 +0,0 @@ -REDISTRIBUTION --------------- - -This binary distribution contains the below components. Components listed under -the "required" section must be redistributed with all applications using CEF. -Components listed under the "optional" section may be excluded if the related -features will not be used. - -Required components: - -* CEF core library - libcef.dylib - -* Cursor resources - Resources/*.png - Resources/*.tiff - -Optional components: - -* Localized resources - Resources/*.lproj/ - Note: Contains localized strings for WebKit UI controls. A .pak file is loaded - from this folder based on the CefSettings.locale value. Only configured - locales need to be distributed. If no locale is configured the default locale - of "en" will be used. Locale file loading can be disabled completely using - CefSettings.pack_loading_disabled. - -* Other resources - Resources/chrome.pak - Resources/devtools_resources.pak - Note: Contains WebKit image and inspector resources. Pack file loading can be - disabled completely using CefSettings.pack_loading_disabled. The resources - directory path can be customized using CefSettings.resources_dir_path. diff --git a/cef1/tools/distrib/mac/README.standard.txt b/cef1/tools/distrib/mac/README.standard.txt deleted file mode 100644 index a37501cf8..000000000 --- a/cef1/tools/distrib/mac/README.standard.txt +++ /dev/null @@ -1,36 +0,0 @@ -CONTENTS --------- - -cefclient Contains the cefclient sample application configured to build - using the files in this distribution. - -Debug Contains libcef.dylib and other components required to run the debug - version of CEF-based applications. - -include Contains all required CEF header files. - -libcef_dll Contains the source code for the libcef_dll_wrapper static library - that all applications using the CEF C++ API must link against. - -Release Contains libcef.dylib and other components required to run the - release version of CEF-based applications. - -Resources Contains images and resources required by applications using CEF. - The contents of this folder should be transferred to the - Contents/Resources folder in the app bundle. - -tools Scripts that perform post-processing on Mac release targets. - - -USAGE ------ - -Xcode 3 and 4: Open the cefclient.xcodeproj project and build. - -When using Xcode 4.2 or newer you will need to change the "Compiler for -C/C++/Objective-C" setting to "LLVM GCC 4.2" under "Build Settings" for -each target. - -Please visit the CEF Website for additional usage information. - -http://code.google.com/p/chromiumembedded diff --git a/cef1/tools/distrib/mac/transfer.cfg b/cef1/tools/distrib/mac/transfer.cfg deleted file mode 100644 index a4b9f2900..000000000 --- a/cef1/tools/distrib/mac/transfer.cfg +++ /dev/null @@ -1,29 +0,0 @@ -# Additional handling of transfer files. -# target: Target location relative to the target release directory. This -# value is required. -# source: Source location relative to the CEF root directory. This value -# is optional. If specified the target will be copied to this location -# and a TRANSFER-README.txt file will be created. -# post-process: Post-processing operation to perform. This value is -# optional and may be any one of the following: -# 'normalize_headers': Replace fully-qualified project header paths with -# the optionally specified 'new_header_path' value. - -[ - { - 'source' : '../build/mac/change_mach_o_flags_from_xcode.sh', - 'target' : 'tools/change_mach_o_flags_from_xcode.sh', - }, - { - 'source' : '../build/mac/change_mach_o_flags.py', - 'target' : 'tools/change_mach_o_flags.py', - }, - { - 'source' : '../build/mac/strip_from_xcode', - 'target' : 'tools/strip_from_xcode', - }, - { - 'source' : '../build/mac/strip_save_dsym', - 'target' : 'tools/strip_save_dsym', - }, -] diff --git a/cef1/tools/distrib/transfer.cfg b/cef1/tools/distrib/transfer.cfg deleted file mode 100644 index a4dcd42eb..000000000 --- a/cef1/tools/distrib/transfer.cfg +++ /dev/null @@ -1,64 +0,0 @@ -# Additional handling of transfer files. -# target: Target location relative to the target release directory. This -# value is required. -# source: Source location relative to the CEF root directory. This value -# is optional. If specified the target will be copied to this location -# and a TRANSFER-README.txt file will be created. -# post-process: Post-processing operation to perform. This value is -# optional and may be any one of the following: -# 'normalize_headers': Replace fully-qualified project header paths with -# the optionally specified 'new_header_path' value. - -[ - { - 'source' : '../base/basictypes.h', - 'target' : 'include/internal/npapi/basictypes.h', - 'post-process' : 'normalize_headers', - }, - { - 'source' : '../build/build_config.h', - 'target' : 'include/internal/npapi/build_config.h', - 'post-process' : 'normalize_headers', - }, - { - 'source' : '../third_party/npapi/bindings/npapi.h', - 'target' : 'include/internal/npapi/npapi.h', - 'post-process' : 'normalize_headers', - }, - { - 'source' : '../third_party/npapi/bindings/npapi_extensions.h', - 'target' : 'include/internal/npapi/npapi_extensions.h', - 'post-process' : 'normalize_headers', - }, - { - 'source' : '../third_party/npapi/bindings/npfunctions.h', - 'target' : 'include/internal/npapi/npfunctions.h', - 'post-process' : 'normalize_headers', - }, - { - 'source' : '../third_party/npapi/bindings/nphostapi.h', - 'target' : 'include/internal/npapi/nphostapi.h', - 'post-process' : 'normalize_headers', - }, - { - 'source' : '../third_party/npapi/bindings/npruntime.h', - 'target' : 'include/internal/npapi/npruntime.h', - 'post-process' : 'normalize_headers', - }, - { - 'source' : '../third_party/npapi/bindings/nptypes.h', - 'target' : 'include/internal/npapi/nptypes.h', - 'post-process' : 'normalize_headers', - }, - { - 'source' : '../base/port.h', - 'target' : 'include/internal/npapi/port.h', - 'post-process' : 'normalize_headers', - }, - { - 'source' : None, - 'target' : 'include/internal/cef_nplugin_types.h', - 'post-process' : 'normalize_headers', - 'new_header_path' : 'include/internal/npapi/', - }, -] \ No newline at end of file diff --git a/cef1/tools/distrib/win/README.minimal.txt b/cef1/tools/distrib/win/README.minimal.txt deleted file mode 100644 index ac450fbd2..000000000 --- a/cef1/tools/distrib/win/README.minimal.txt +++ /dev/null @@ -1,19 +0,0 @@ -CONTENTS --------- - -Release Contains libcef.dll, libcef.lib and other components required to - build and run the release version of CEF-based applications. By - default these files should be placed in the same directory as the - executable. - -Resources Contains resources required by libcef.dll. By default these files - should be placed in the same directory as libcef.dll. By default - these files should be placed in the same directory as libcef.dll. - - -USAGE ------ - -Please visit the CEF Website for additional usage information. - -http://code.google.com/p/chromiumembedded diff --git a/cef1/tools/distrib/win/README.redistrib.txt b/cef1/tools/distrib/win/README.redistrib.txt deleted file mode 100644 index f769623e1..000000000 --- a/cef1/tools/distrib/win/README.redistrib.txt +++ /dev/null @@ -1,43 +0,0 @@ -REDISTRIBUTION --------------- - -This binary distribution contains the below components. Components listed under -the "required" section must be redistributed with all applications using CEF. -Components listed under the "optional" section may be excluded if the related -features will not be used. - -Required components: - -* CEF core library - libcef.dll - -* Unicode support - icudt.dll - -Optional components: - -* Localized resources - locales/ - Note: Contains localized strings for WebKit UI controls. A .pak file is loaded - from this folder based on the CefSettings.locale value. Only configured - locales need to be distributed. If no locale is configured the default locale - of "en-US" will be used. Locale file loading can be disabled completely using - CefSettings.pack_loading_disabled. The locales folder path can be customized - using CefSettings.locales_dir_path. - -* Other resources - devtools_resources.pak - Note: Contains WebKit image and inspector resources. Pack file loading can be - disabled completely using CefSettings.pack_loading_disabled. The resources - directory path can be customized using CefSettings.resources_dir_path. - -* Angle and Direct3D support - d3dcompiler_43.dll - d3dx9_43.dll - libEGL.dll - libGLESv2.dll - Note: Without these components the default ANGLE_IN_PROCESS graphics - implementation for HTML5 accelerated content like 2D canvas, 3D CSS and - WebGL will not function. To use the desktop GL graphics implementation which - does not require these components (and does not work on all systems) set - CefSettings.graphics_implementation to DESKTOP_IN_PROCESS. diff --git a/cef1/tools/distrib/win/README.standard.txt b/cef1/tools/distrib/win/README.standard.txt deleted file mode 100644 index b8b072d35..000000000 --- a/cef1/tools/distrib/win/README.standard.txt +++ /dev/null @@ -1,46 +0,0 @@ -CONTENTS --------- - -cefclient Contains the cefclient sample application configured to build - using the files in this distribution. - -Debug Contains libcef.dll, libcef.lib and other components required to - build and run the debug version of CEF-based applications. By - default these files should be placed in the same directory as the - executable and will be copied there as part of the build process. - -include Contains all required CEF header files. - -libcef_dll Contains the source code for the libcef_dll_wrapper static library - that all applications using the CEF C++ API must link against. - -Release Contains libcef.dll, libcef.lib and other components required to - build and run the release version of CEF-based applications. By - default these files should be placed in the same directory as the - executable and will be copied there as part of the build process. - -Resources Contains resources required by libcef.dll. By default these files - should be placed in the same directory as libcef.dll. By default - these files should be placed in the same directory as libcef.dll - and will be copied there as part of the build process. - - -USAGE ------ - -Visual Studio 2012 and Visual Studio 2010: - Open the cefclient2010.sln solution in Visual Studio and build. - -Visual Studio 2008: - Open the cefclient2008.sln solution in Visual Studio and build. - -Visual Studio 2005: - 1. Open the cefclient.vcproj and libcef_dll_wrapper.vcproj files in a text - editor. Change Version="9.00" to Version="8.00". - 2. Open the cefclient2005.sln file in a text editor. Change "Version 9.00" to - "Version 8.00". - 3. Open the cefclient2005.sln solution in Visual Studio and build. - -Please visit the CEF Website for additional usage information. - -http://code.google.com/p/chromiumembedded diff --git a/cef1/tools/distrib/win/d3dcompiler_43.dll b/cef1/tools/distrib/win/d3dcompiler_43.dll deleted file mode 100644 index ab9616191fa73b5f624b85d430b3ee95d3e3c278..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2106216 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

opkKgG?0H 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⁣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

IQ{+flxV&>Y-3RLd|51PS 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

)q-qrZC9o-JHS<*-3OqV`f*mtXPT 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⪚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

=PIn;pVSmOr?pz#>!KG=EUGvWtWB$#K=XV;7T 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 z

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 P7Bbj^zjM)+Hmew9qB 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 Y9LGUMU6Q8Q9~1rwT&*96XbI-< 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ð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

ock!nbCmN@?4TPod-AE87r*s1|~kxA$P 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

FUYK|+S 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%0D$e2RdVk}Ibic0Qa>dU%7M{W@Wz@z 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

    N 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 -k6q`zwj&qyP8j`(#bJGRdDw=C)K#R7HiP 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
      <^ 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 z z2qrm)JJEqNSF@-!;pepDYClnrxNPW=Mri`l%V@ordveDm971$f4&>|;RHWvOEum}A zl&zjs>o8SmD2yk~xuTNSgfeq_O0j0fN1pi|zc2g_08|kGsI))zh%Q6svmOEWW!xz< zey$#U2ZC)qQUq*B9zc^U@-w5h4rrUHAFm>_6xH-A}Tb&}{ z_6TTj83&ILma;#N#}2$_N#R&1LP@Y=whYk4n2WIVUnUF9-Kb|XLJgwF!hBx`g2w7J zJ>Gkl_%2HggrxOl9LT-WUc0d#I^i%SgMj9U$zW7})6T@-8IDH{_q=}7f3oevnaNe> zl|P+`#GG?b{S{V~b*jW&|fNBggTyksrUXSBaraTw~Ls-jS4 z&I!R1l-V{xrRmc)sABOtCuto{+&^YK77C>Z$#E>9S3%dYBJ`JFJ~Y)ZkqcR*_5vaO zrW00lSTjG((qqmO=}`=pm0R<%x{L~CWfZx>&=Up!43o8zWFc0(ojgiZUDQ_Ity4SZ zBteL40%o*FGiuLkvu<{;h30-5_=_q1kQo1sDFyiZI63@JOzF=(1^gJ++YN)S{zupR z%^&bHtw7|G57STLTpvl!Sl9G|B0>+GY8SC$ue-JGJ`}r^++Bg;=Mj3hKJ}=)MxBZq zbz29O>9g4*cT*y%nyE5?L!zoIa0Pwh6xRTIYU4wDO6Bj|V42 z?+j+fF6cj)UEWYXU_R-hz3Cn>ARjyoTM5Sc6pbx7rtlx)+za6~gQ zo=h5yoG_A>SAMCkPE`bAW?Frw%hRWke6IA3OtOvSRAX{jDg;w*|DIF4$eZ0sL&EY% zf^wqTi>mgXGz(sBbN7_)Gy`*5&?5>$P0R54!MKLEY|9he&n2Mc#;e##v6(tX9Q!!* z$YU*J1UMQX77l1zA#kyOW64InXICM))9T8{m2PLJFKsqP8YJ_s<{231Ozkw+n2;=p z-LFCbYJA-gj08%3FvOn|AA~ieXi{W@;ref{g^z?I(7SfQjMPA=<#UH`U*SX!cm#oz zKz6_ckR0d`u<`(TToDQv_?HIn?B?g<6cDsK%z${Wy3aSIpL zN1DK1)lVI7AY-QpiKq(q65c~uvG;3u?8pxv)vI!f*Du>&;IX2l(_!sqZ9T|dc)7OA zQEwt8>tRDSgfz2cW&-{`rDZ1;$L`So1K3kc+g5#lkGS^+5Rp!QgU$w9l zG%=Chp{B^*OBJbwjQj06jpFjl!%SakZMIqy$wsGbo;}g17n@p<*4Q^rKfihxXSzu_ zyD`=RH$&fFlbc1az8l_b=I~7{_~?Fl4I#uNrD+Lw*;C0Se6(L&w>dw-0GQspI5WS_ z-8pLT(q^c$=u!KXz!uu8hUW)jM@8`XNHtYPci)T z!232C0)e-aqUpc%ZS!pqTssF#gJk-;pr-7f$K^kmE@7u-vymj zqQZ3VhBlF@>@xLwUGKEu4T#e25CK$RJ46)Ngx^qE;In6bTlbquWKEcLYn>Xsp>=H& z?7S&=1CDoW1W|r{Ds}i&InkWiO!)08+`!-DfFl{A55A?P+vGF^9p|#OTeditiEqom za%rSQD?up?@rme41H6R`uXR{gf8Nt}^Mg{hFFL$f_+f@chqeyooAm0*!$}SJQhiom zixV+o`|lV>YWN!$*(Q=rTwcNvto;v|L(1CH16EQXwmvCamkK%kLO+~OVGaxmbCy{D zV3J`g$;SwaS00UrxN!`2UWUfmywh*U?iKIlpH#0|y)_Kmn~SnaecCxb5;VQ{Bw<-D c%I$%L=j3~h?0ZzWAsnGv13RqWfuMkX2e#cLF#rGn diff --git a/cef1/tools/file_util.py b/cef1/tools/file_util.py deleted file mode 100644 index 52175cfa8..000000000 --- a/cef1/tools/file_util.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from glob import iglob -import os -import shutil -import sys -import time - -def read_file(name, normalize = True): - """ Read a file. """ - try: - f = open(name, 'r') - # read the data - data = f.read() - if normalize: - # normalize line endings - data = data.replace("\r\n", "\n") - return data - except IOError, (errno, strerror): - sys.stderr.write('Failed to read file '+name+': '+strerror) - raise - else: - f.close() - -def write_file(name, data): - """ Write a file. """ - try: - f = open(name, 'w') - # write the data - f.write(data) - except IOError, (errno, strerror): - sys.stderr.write('Failed to write file '+name+': '+strerror) - raise - else: - f.close() - -def path_exists(name): - """ Returns true if the path currently exists. """ - return os.path.exists(name) - -def backup_file(name): - """ Rename the file to a name that includes the current time stamp. """ - move_file(name, name+'.'+time.strftime('%Y-%m-%d-%H-%M-%S')) - -def copy_file(src, dst, quiet = True): - """ Copy a file. """ - try: - shutil.copy(src, dst) - if not quiet: - sys.stdout.write('Transferring '+src+' file.\n') - except IOError, (errno, strerror): - sys.stderr.write('Failed to copy file from '+src+' to '+dst+': '+strerror) - raise - -def move_file(src, dst, quiet = True): - """ Move a file. """ - try: - shutil.move(src, dst) - if not quiet: - sys.stdout.write('Moving '+src+' file.\n') - except IOError, (errno, strerror): - sys.stderr.write('Failed to move file from '+src+' to '+dst+': '+strerror) - raise - -def copy_files(src_glob, dst_folder, quiet = True): - """ Copy multiple files. """ - for fname in iglob(src_glob): - dst = os.path.join(dst_folder, os.path.basename(fname)) - if os.path.isdir(fname): - copy_dir(fname, dst, quiet) - else: - copy_file(fname, dst, quiet) - -def remove_file(name, quiet = True): - """ Remove the specified file. """ - try: - if path_exists(name): - os.remove(name) - if not quiet: - sys.stdout.write('Removing '+name+' file.\n') - except IOError, (errno, strerror): - sys.stderr.write('Failed to remove file '+name+': '+strerror) - raise - -def copy_dir(src, dst, quiet = True): - """ Copy a directory tree. """ - try: - remove_dir(dst, quiet) - shutil.copytree(src, dst) - if not quiet: - sys.stdout.write('Transferring '+src+' directory.\n') - except IOError, (errno, strerror): - sys.stderr.write('Failed to copy directory from '+src+' to '+dst+': '+strerror) - raise - -def remove_dir(name, quiet = True): - """ Remove the specified directory. """ - try: - if path_exists(name): - shutil.rmtree(name) - if not quiet: - sys.stdout.write('Removing '+name+' directory.\n') - except IOError, (errno, strerror): - sys.stderr.write('Failed to remove directory '+name+': '+strerror) - raise - -def make_dir(name, quiet = True): - """ Create the specified directory. """ - try: - if not path_exists(name): - if not quiet: - sys.stdout.write('Creating '+name+' directory.\n') - os.makedirs(name) - except IOError, (errno, strerror): - sys.stderr.write('Failed to create directory '+name+': '+strerror) - raise - -def get_files(search_glob): - """ Returns all files matching the search glob. """ - return iglob(search_glob) - -def read_version_file(file, args): - """ Read and parse a version file (key=value pairs, one per line). """ - lines = read_file(file).split("\n") - for line in lines: - parts = line.split('=', 1) - if len(parts) == 2: - args[parts[0]] = parts[1] diff --git a/cef1/tools/gclient_hook.py b/cef1/tools/gclient_hook.py deleted file mode 100644 index f79c67645..000000000 --- a/cef1/tools/gclient_hook.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. -# Portions copyright (c) 2006-2008 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. - -from gclient_util import * -import os, sys - -# The CEF root directory is the parent directory of _this_ script. -cef_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) - -print "\nChecking CEF and Chromium revisions..." -gyper = [ 'python', 'tools/check_revision.py' ] -RunAction(cef_dir, gyper) - -print "\nGenerating CEF version header file..." -gyper = [ 'python', 'tools/make_version_header.py', - '--header', 'include/cef_version.h', - '--version', '../chrome/VERSION' ] -RunAction(cef_dir, gyper) - -print "\nPatching build configuration and source files for CEF..." -patcher = [ 'python', 'tools/patcher.py', - '--patch-config', 'patch/patch.cfg' ]; -RunAction(cef_dir, patcher) - -print "\nGenerating CEF project files..." -os.environ['CEF_DIRECTORY'] = os.path.basename(cef_dir); -gyper = [ 'python', 'tools/gyp_cef', 'cef.gyp', '-I', 'cef.gypi' ] -RunAction(cef_dir, gyper) diff --git a/cef1/tools/gclient_util.py b/cef1/tools/gclient_util.py deleted file mode 100644 index 300841456..000000000 --- a/cef1/tools/gclient_util.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. -# Portions copyright (c) 2011 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 os, sys - -try: - # depot_tools may already be in the import path. - import gclient_utils -except ImportError, e: - # Search the PATH environment variable to find the depot_tools folder. - depot_tools = None; - paths = os.environ.get('PATH').split(os.pathsep) - for path in paths: - if os.path.exists(os.path.join(path, 'gclient_utils.py')): - depot_tools = path - break - - if depot_tools is None: - print >> sys.stderr, 'Error: could not find depot_tools in PATH.' - sys.exit(2) - - # Add depot_tools to import path. - sys.path.append(depot_tools) - import gclient_utils - -# Copied from gclient.py python code. -def RunAction(dir, command): - """Runs the action.""" - if command[0] == 'python': - # If the hook specified "python" as the first item, the action is a - # Python script. Run it by starting a new copy of the same - # interpreter. - command[0] = sys.executable - - try: - gclient_utils.CheckCallAndFilterAndHeader( - command, cwd=dir, always=True) - except gclient_utils.Error, e: - # Use a discrete exit status code of 2 to indicate that a hook action - # failed. Users of this script may wish to treat hook action failures - # differently from VC failures. - print >> sys.stderr, 'Error: %s' % str(e) - sys.exit(2) diff --git a/cef1/tools/git_util.py b/cef1/tools/git_util.py deleted file mode 100644 index a641c83fa..000000000 --- a/cef1/tools/git_util.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file - -from subprocess import Popen, PIPE - -def get_svn_revision(path=".", branch="master"): - svn_rev = "None" - cmd = ("git log --grep=^git-svn-id: -n 1 %s" % branch).split() - try: - process = Popen(cmd, cwd=path, stdout = PIPE, stderr = PIPE) - for line in process.stdout: - if line.find("git-svn-id") > 0: - svn_rev = line.split("@")[1].split()[0] - break - except IOError, (errno, strerror): - sys.stderr.write('Failed to read git log: ' + strerror + "\n") - raise - return svn_rev - -def get_changed_files(path="."): - """ Retrieves the list of changed files. """ - # not implemented - return [] diff --git a/cef1/tools/gyp_cef b/cef1/tools/gyp_cef deleted file mode 100755 index 4ccdb64e5..000000000 --- a/cef1/tools/gyp_cef +++ /dev/null @@ -1,156 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2011 The Chromium Embedded Framework Authors. -# Portions copyright (c) 2011 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. - -# This script is wrapper for CEF/Chromium that adds some support for how GYP -# is invoked by Chromium beyond what can be done in the gclient hooks. - -import glob -import os -import shlex -import subprocess -import sys - -# The CEF root directory is the parent directory of _this_ script. -cef_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) - -# The Chromium source directory is the parent directory of CEF. -chrome_src = os.path.abspath(os.path.join(cef_dir, os.pardir)) - -sys.path.insert(0, os.path.join(chrome_src, 'tools', 'gyp', 'pylib')) -import gyp - -# Add paths so that pymod_do_main(...) can import files. -sys.path.insert(1, os.path.join(chrome_src, 'tools', 'grit')) -sys.path.insert(1, os.path.join(chrome_src, 'chrome', 'tools', 'build')) -sys.path.insert(1, os.path.join(chrome_src, 'third_party', 'WebKit', - 'Source', 'WebCore', 'WebCore.gyp', 'scripts')) - -# On Windows, Psyco shortens warm runs of build/gyp_chromium by about -# 20 seconds on a z600 machine with 12 GB of RAM, from 90 down to 70 -# seconds. Conversely, memory usage of build/gyp_chromium with Psyco -# maxes out at about 158 MB vs. 132 MB without it. -# -# Psyco uses native libraries, so we need to load a different -# installation depending on which OS we are running under. It has not -# been tested whether using Psyco on our Mac and Linux builds is worth -# it (the GYP running time is a lot shorter, so the JIT startup cost -# may not be worth it). -if sys.platform == 'win32': - try: - sys.path.insert(0, os.path.join(chrome_src, 'third_party', 'psyco_win32')) - import psyco - except: - psyco = None -else: - psyco = None - -def apply_gyp_environment(file_path=None): - """ - Reads in a *.gyp_env file and applies the valid keys to os.environ. - """ - if not file_path or not os.path.exists(file_path): - return - file_contents = open(file_path).read() - try: - file_data = eval(file_contents, {'__builtins__': None}, None) - except SyntaxError, e: - e.filename = os.path.abspath(file_path) - raise - supported_vars = ( 'CHROMIUM_GYP_SYNTAX_CHECK', - 'GYP_DEFINES', - 'GYP_GENERATOR_FLAGS', - 'GYP_GENERATOR_OUTPUT', ) - for var in supported_vars: - val = file_data.get(var) - if val: - if var in os.environ: - print 'INFO: Environment value for "%s" overrides value in %s.' % ( - var, os.path.abspath(file_path) - ) - else: - os.environ[var] = val - -def additional_include_files(args=[]): - """ - Returns a list of additional (.gypi) files to include, without - duplicating ones that are already specified on the command line. - """ - # Determine the include files specified on the command line. - # This doesn't cover all the different option formats you can use, - # but it's mainly intended to avoid duplicating flags on the automatic - # makefile regeneration which only uses this format. - specified_includes = set() - for arg in args: - if arg.startswith('-I') and len(arg) > 2: - specified_includes.add(os.path.realpath(arg[2:])) - - result = [] - def AddInclude(path): - if os.path.realpath(path) not in specified_includes: - result.append(path) - - # Always include common.gypi. - AddInclude(os.path.join(chrome_src, 'build', 'common.gypi')) - - # Optionally add supplemental .gypi files if present. - supplements = glob.glob(os.path.join(chrome_src, '*', 'supplement.gypi')) - for supplement in supplements: - AddInclude(supplement) - - return result - -if __name__ == '__main__': - args = sys.argv[1:] - - # Use the Psyco JIT if available. - if psyco: - psyco.profile() - print "Enabled Psyco JIT." - - # Fall back on hermetic python if we happen to get run under cygwin. - # TODO(bradnelson): take this out once this issue is fixed: - # http://code.google.com/p/gyp/issues/detail?id=177 - if sys.platform == 'cygwin': - python_dir = os.path.join(chrome_src, 'third_party', 'python_26') - env = os.environ.copy() - env['PATH'] = python_dir + os.pathsep + env.get('PATH', '') - p = subprocess.Popen( - [os.path.join(python_dir, 'python.exe')] + sys.argv, - env=env, shell=False) - p.communicate() - sys.exit(p.returncode) - - if 'SKIP_CHROMIUM_GYP_ENV' not in os.environ: - # Update the environment based on chromium.gyp_env - gyp_env_path = os.path.join(os.path.dirname(chrome_src), 'chromium.gyp_env') - apply_gyp_environment(gyp_env_path) - - args.extend(['-I' + i for i in additional_include_files(args)]) - - # There shouldn't be a circular dependency relationship between .gyp files, - # but in Chromium's .gyp files, on non-Mac platforms, circular relationships - # currently exist. The check for circular dependencies is currently - # bypassed on other platforms, but is left enabled on the Mac, where a - # violation of the rule causes Xcode to misbehave badly. - # TODO(mark): Find and kill remaining circular dependencies, and remove this - # option. http://crbug.com/35878. - # TODO(tc): Fix circular dependencies in ChromiumOS then add linux2 to the - # list. - if sys.platform not in ('darwin',): - args.append('--no-circular-check') - - # If CHROMIUM_GYP_SYNTAX_CHECK is set to 1, it will invoke gyp with --check - # to enfore syntax checking. - syntax_check = os.environ.get('CHROMIUM_GYP_SYNTAX_CHECK') - if syntax_check and int(syntax_check): - args.append('--check') - - print 'Updating projects from gyp files...' - sys.stdout.flush() - - # Off we go... - sys.exit(gyp.main(args)) diff --git a/cef1/tools/make_capi_header.py b/cef1/tools/make_capi_header.py deleted file mode 100644 index b0b667a59..000000000 --- a/cef1/tools/make_capi_header.py +++ /dev/null @@ -1,174 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from cef_parser import * -from date_util import * - -def make_capi_global_funcs(funcs, defined_names, translate_map, indent): - result = '' - first = True - for func in funcs: - comment = func.get_comment() - if first or len(comment) > 0: - result += '\n'+format_comment(comment, indent, translate_map); - if func.get_retval().get_type().is_result_string(): - result += indent+'// The resulting string must be freed by calling cef_string_userfree_free().\n' - result += wrap_code(indent+'CEF_EXPORT '+ - func.get_capi_proto(defined_names)+';') - if first: - first = False - return result - -def make_capi_member_funcs(funcs, defined_names, translate_map, indent): - result = '' - first = True - for func in funcs: - comment = func.get_comment() - if first or len(comment) > 0: - result += '\n'+format_comment(comment, indent, translate_map) - if func.get_retval().get_type().is_result_string(): - result += indent+'// The resulting string must be freed by calling cef_string_userfree_free().\n' - parts = func.get_capi_parts() - result += wrap_code(indent+parts['retval']+' (CEF_CALLBACK *'+ - parts['name']+')('+ - string.join(parts['args'], ', ')+');') - if first: - first = False - return result - -def make_capi_header(header, filename): - # structure names that have already been defined - defined_names = header.get_defined_structs() - - # map of strings that will be changed in C++ comments - translate_map = header.get_capi_translations() - - # header string - result = \ -"""// Copyright (c) $YEAR$ Marshall A. Greenblatt. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the names of its contributors may be used to endorse -// or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT -// OWNER OR 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. -// -// --------------------------------------------------------------------------- -// -// This file was generated by the CEF translator tool and should not edited -// by hand. See the translator.README.txt file in the tools directory for -// more information. -// - -#ifndef $GUARD$ -#define $GUARD$ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "include/capi/cef_base_capi.h" - -""" - # output global functions - funcs = header.get_funcs(filename) - if len(funcs) > 0: - result += make_capi_global_funcs(funcs, defined_names, translate_map, '') - - # output classes - classes = header.get_classes(filename) - for cls in classes: - # virtual functions are inside the structure - classname = cls.get_capi_name() - result += '\n'+format_comment(cls.get_comment(), '', translate_map); - result += 'typedef struct _'+classname+ \ - ' {\n ///\n // Base structure.\n ///\n cef_base_t base;\n' - funcs = cls.get_virtual_funcs() - result += make_capi_member_funcs(funcs, defined_names, - translate_map, ' ') - result += '} '+classname+';\n\n' - - defined_names.append(cls.get_capi_name()) - - # static functions become global - funcs = cls.get_static_funcs() - if len(funcs) > 0: - result += make_capi_global_funcs(funcs, defined_names, - translate_map, '')+'\n' - - # footer string - result += \ -""" -#ifdef __cplusplus -} -#endif - -#endif // $GUARD$ -""" - - # add the copyright year - result = result.replace('$YEAR$', get_year()) - # add the guard string - guard = 'CEF_INCLUDE_CAPI_'+string.upper(filename.replace('.', '_capi_'))+'_' - result = result.replace('$GUARD$', guard) - - return result - - -def write_capi_header(header, filepath, backup): - capi_path = get_capi_file_name(filepath) - if path_exists(capi_path): - oldcontents = read_file(capi_path) - else: - oldcontents = '' - - filename = os.path.split(filepath)[1] - newcontents = make_capi_header(header, filename) - if newcontents != oldcontents: - if backup and oldcontents != '': - backup_file(capi_path) - write_file(capi_path, newcontents) - return True - - return False - - -# test the module -if __name__ == "__main__": - import sys - - # verify that the correct number of command-line arguments are provided - if len(sys.argv) < 2: - sys.stderr.write('Usage: '+sys.argv[0]+' ') - sys.exit() - - # create the header object - header = obj_header() - header.add_file(sys.argv[1]) - - # dump the result to stdout - filename = os.path.split(sys.argv[1])[1] - sys.stdout.write(make_capi_header(header, filename)) diff --git a/cef1/tools/make_cppdocs.bat b/cef1/tools/make_cppdocs.bat deleted file mode 100644 index f18e3b090..000000000 --- a/cef1/tools/make_cppdocs.bat +++ /dev/null @@ -1,18 +0,0 @@ -@echo off -setlocal - -if "%1"=="" ( -set CPPDOC_EXE="C:\Program Files (x86)\richfeit\CppDoc\CppDoc.exe" -set CPPDOC_REV="XXX" -) else ( -set CPPDOC_EXE="C:\Program Files (x86)\richfeit\CppDoc\cppdoc_cmd.exe" -set CPPDOC_REV="%1" -) - -if not exist %CPPDOC_EXE% ( -echo ERROR: Please install CppDoc from http://www.cppdoc.com/ -) else ( -%CPPDOC_EXE% -overwrite -title="CEF C++ API Docs - Revision %CPPDOC_REV%" -footer="" -namespace-as-project -comment-format="///;//;///" -classdir=projects -module="cppdoc-standard" -extensions=h -languages="c=cpp,cc=cpp,cpp=cpp,cs=csharp,cxx=cpp,h=cpp,hpp=cpp,hxx=cpp,java=java" -D"OS_WIN" -D"USING_CEF_SHARED" -D"__cplusplus" -D"CEF_STRING_TYPE_UTF16" -enable-author=false -enable-deprecations=true -enable-since=true -enable-version=false -file-links-for-globals=false -generate-deprecations-list=false -generate-hierarchy=true -header-background-dark="#ccccff" -header-background-light="#eeeeff" -include-private=false -include-protected=true -index-file-base=index -overview-html=overview.html -reduce-summary-font=true -selected-text-background=navy -selected-text-foreground=white -separate-index-pages=false -show-cppdoc-version=false -show-timestamp=false -summary-html=project.html -suppress-details=false -suppress-frames-links=false -table-background=white -wrap-long-lines=false ..\include #cef_runnable.h #cef_tuple.h #capi "..\docs\index.html" -) - -endlocal \ No newline at end of file diff --git a/cef1/tools/make_cpptoc_header.py b/cef1/tools/make_cpptoc_header.py deleted file mode 100644 index 4f930e224..000000000 --- a/cef1/tools/make_cpptoc_header.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from cef_parser import * - -def make_cpptoc_header(header, clsname): - cls = header.get_class(clsname) - if cls is None: - raise Exception('Class does not exist: '+clsname) - - dllside = cls.is_library_side() - defname = string.upper(get_capi_name(clsname[3:], False)) - capiname = cls.get_capi_name() - - result = get_copyright() - - result += '#ifndef CEF_LIBCEF_DLL_CPPTOC_'+defname+'_CPPTOC_H_\n'+ \ - '#define CEF_LIBCEF_DLL_CPPTOC_'+defname+'_CPPTOC_H_\n' + \ - '#pragma once\n' - - if dllside: - result += """ -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED -""" - else: - result += """ -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED -""" - - # include the headers for this class - result += '\n#include "include/'+cls.get_file_name()+'"\n' \ - '#include "include/capi/'+cls.get_capi_file_name()+'"\n' - - # include headers for any forward declared classes that are not in the same file - declares = cls.get_forward_declares() - for declare in declares: - dcls = header.get_class(declare) - if dcls.get_file_name() != cls.get_file_name(): - result += '#include "include/'+dcls.get_file_name()+'"\n' \ - '#include "include/capi/'+dcls.get_capi_file_name()+'"\n' - - result += """#include "libcef_dll/cpptoc/cpptoc.h" - -// Wrap a C++ class with a C structure. -""" - - if dllside: - result += '// This class may be instantiated and accessed DLL-side only.\n' - else: - result += '// This class may be instantiated and accessed wrapper-side only.\n' - - result += 'class '+clsname+'CppToC\n'+ \ - ' : public CefCppToC<'+clsname+'CppToC, '+clsname+', '+capiname+'> {\n'+ \ - ' public:\n'+ \ - ' explicit '+clsname+'CppToC('+clsname+'* cls);\n'+ \ - ' virtual ~'+clsname+'CppToC() {}\n'+ \ - '};\n\n' - - if dllside: - result += '#endif // BUILDING_CEF_SHARED\n' - else: - result += '#endif // USING_CEF_SHARED\n' - - result += '#endif // CEF_LIBCEF_DLL_CPPTOC_'+defname+'_CPPTOC_H_\n' - - return wrap_code(result) - - -def write_cpptoc_header(header, clsname, dir, backup): - file = dir+os.sep+get_capi_name(clsname[3:], False)+'_cpptoc.h' - - if path_exists(file): - oldcontents = read_file(file) - else: - oldcontents = '' - - newcontents = make_cpptoc_header(header, clsname) - if newcontents != oldcontents: - if backup and oldcontents != '': - backup_file(file) - write_file(file, newcontents) - return True - - return False - - -# test the module -if __name__ == "__main__": - import sys - - # verify that the correct number of command-line arguments are provided - if len(sys.argv) < 3: - sys.stderr.write('Usage: '+sys.argv[0]+' ') - sys.exit() - - # create the header object - header = obj_header() - header.add_file(sys.argv[1]) - - # dump the result to stdout - sys.stdout.write(make_cpptoc_header(header, sys.argv[2])) diff --git a/cef1/tools/make_cpptoc_impl.py b/cef1/tools/make_cpptoc_impl.py deleted file mode 100644 index 0872b362e..000000000 --- a/cef1/tools/make_cpptoc_impl.py +++ /dev/null @@ -1,563 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from cef_parser import * - -def make_cpptoc_impl_proto(name, func, parts): - if isinstance(func, obj_function_virtual): - proto = parts['retval']+' CEF_CALLBACK' - else: - proto = 'CEF_EXPORT '+parts['retval'] - - proto += ' '+name+'('+string.join(parts['args'], ', ')+')' - return proto - -def make_cpptoc_function_impl_existing(name, func, impl, defined_names): - notify(name+' has manual edits') - - # retrieve the C API prototype parts - parts = func.get_capi_parts(defined_names) - - changes = format_translation_changes(impl, parts) - if len(changes) > 0: - notify(name+' prototype changed') - - return wrap_code(make_cpptoc_impl_proto(name, func, parts))+'{'+ \ - changes+impl['body']+'\n}\n' - return result - -def make_cpptoc_function_impl_new(name, func, defined_names): - # retrieve the C API prototype parts - parts = func.get_capi_parts(defined_names) - result = make_cpptoc_impl_proto(name, func, parts)+' {' - - invalid = [] - - # retrieve the function arguments - args = func.get_arguments() - - # determine the argument types - for arg in args: - if arg.get_arg_type() == 'invalid': - invalid.append(arg.get_name()) - - # retrieve the function return value - retval = func.get_retval() - retval_type = retval.get_retval_type() - if retval_type == 'invalid': - invalid.append('(return value)') - retval_default = '' - else: - retval_default = retval.get_retval_default(True) - if len(retval_default) > 0: - retval_default = ' '+retval_default; - - if len(invalid) > 0: - notify(name+' could not be autogenerated') - # code could not be auto-generated - result += '\n // BEGIN DELETE BEFORE MODIFYING' - result += '\n // AUTO-GENERATED CONTENT' - result += '\n // COULD NOT IMPLEMENT DUE TO: '+string.join(invalid, ', ') - result += '\n #pragma message("Warning: "__FILE__": '+name+' is not implemented")' - result += '\n // END DELETE BEFORE MODIFYING' - result += '\n}\n\n' - return wrap_code(result) - - result += '\n // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING\n' - - result_len = len(result) - - optional = [] - - # parameter verification - if isinstance(func, obj_function_virtual): - result += '\n DCHECK(self);'\ - '\n if (!self)'\ - '\n return'+retval_default+';' - - for arg in args: - arg_type = arg.get_arg_type() - arg_name = arg.get_type().get_name() - - # skip optional params - optional_params = arg.parent.get_attrib_list('optional_param') - if not optional_params is None and arg_name in optional_params: - optional.append(arg_name) - continue - - comment = '\n // Verify param: '+arg_name+'; type: '+arg_type - - if arg_type == 'simple_byref' or arg_type == 'simple_byref_const' or \ - arg_type == 'simple_byaddr' or arg_type == 'bool_byref' or arg_type == 'bool_byaddr' or \ - arg_type == 'struct_byref_const' or arg_type == 'struct_byref' or \ - arg_type == 'string_byref_const' or arg_type == 'string_byref' or \ - arg_type == 'refptr_same' or arg_type == 'refptr_same_byref' or \ - arg_type == 'refptr_diff' or arg_type == 'refptr_diff_byref' or \ - arg_type == 'string_vec_byref' or arg_type == 'string_vec_byref_const' or \ - arg_type == 'string_map_single_byref' or arg_type == 'string_map_single_byref_const' or \ - arg_type == 'string_map_multi_byref' or arg_type == 'string_map_multi_byref_const': - result += comment+\ - '\n DCHECK('+arg_name+');'\ - '\n if (!'+arg_name+')'\ - '\n return'+retval_default+';' - elif arg_type == 'simple_vec_byref' or arg_type == 'bool_vec_byref' or \ - arg_type == 'refptr_vec_same_byref' or arg_type == 'refptr_vec_diff_byref': - result += comment+\ - '\n DCHECK('+arg_name+'Count && (*'+arg_name+'Count == 0 || '+arg_name+'));'\ - '\n if (!'+arg_name+'Count || (*'+arg_name+'Count > 0 && !'+arg_name+'))'\ - '\n return'+retval_default+';' - elif arg_type == 'simple_vec_byref_const' or arg_type == 'bool_vec_byref_const' or \ - arg_type == 'refptr_vec_same_byref_const' or arg_type == 'refptr_vec_diff_byref_const': - result += comment+\ - '\n DCHECK('+arg_name+'Count == 0 || '+arg_name+');'\ - '\n if ('+arg_name+'Count > 0 && !'+arg_name+')'\ - '\n return'+retval_default+';' - - # check index params - index_params = arg.parent.get_attrib_list('index_param') - if not index_params is None and arg_name in index_params: - result += comment+\ - '\n DCHECK_GE('+arg_name+', 0);'\ - '\n if ('+arg_name+' < 0)'\ - '\n return'+retval_default+';' - - if len(optional) > 0: - result += '\n // Unverified params: '+string.join(optional,', ') - - if len(result) != result_len: - result += '\n' - result_len = len(result) - - # parameter translation - params = [] - - for arg in args: - arg_type = arg.get_arg_type() - arg_name = arg.get_type().get_name() - - comment = '\n // Translate param: '+arg_name+'; type: '+arg_type - - if arg_type == 'simple_byval' or arg_type == 'simple_byaddr': - params.append(arg_name) - elif arg_type == 'simple_byref' or arg_type == 'simple_byref_const': - data_type = arg.get_type().get_type() - default = arg.get_type().get_result_simple_default() - result += comment+\ - '\n '+data_type+' '+arg_name+'Val = '+arg_name+'?*'+arg_name+':'+default+';' - params.append(arg_name+'Val') - elif arg_type == 'bool_byval': - params.append(arg_name+'?true:false') - elif arg_type == 'bool_byref' or arg_type == 'bool_byaddr': - result += comment+\ - '\n bool '+arg_name+'Bool = ('+arg_name+' && *'+arg_name+')?true:false;' - if arg_type == 'bool_byref': - params.append(arg_name+'Bool') - else: - params.append('&'+arg_name+'Bool') - elif arg_type == 'struct_byref_const': - struct_type = arg.get_type().get_type() - result += comment+\ - '\n '+struct_type+' '+arg_name+'Obj;'\ - '\n if ('+arg_name+')'\ - '\n '+arg_name+'Obj.Set(*'+arg_name+', false);' - params.append(arg_name+'Obj') - elif arg_type == 'struct_byref': - struct_type = arg.get_type().get_type() - result += comment+\ - '\n '+struct_type+' '+arg_name+'Obj;'\ - '\n if ('+arg_name+')'\ - '\n '+arg_name+'Obj.AttachTo(*'+arg_name+');' - params.append(arg_name+'Obj') - elif arg_type == 'string_byref_const': - params.append('CefString('+arg_name+')') - elif arg_type == 'string_byref': - result += comment+\ - '\n CefString '+arg_name+'Str('+arg_name+');' - params.append(arg_name+'Str') - elif arg_type == 'refptr_same' or arg_type == 'refptr_diff': - refptr_class = arg.get_type().get_refptr_type() - if arg_type == 'refptr_same': - params.append(refptr_class+'CppToC::Unwrap('+arg_name+')') - else: - params.append(refptr_class+'CToCpp::Wrap('+arg_name+')') - elif arg_type == 'refptr_same_byref' or arg_type == 'refptr_diff_byref': - refptr_class = arg.get_type().get_refptr_type() - if arg_type == 'refptr_same_byref': - assign = refptr_class+'CppToC::Unwrap(*'+arg_name+')' - else: - assign = refptr_class+'CToCpp::Wrap(*'+arg_name+')' - result += comment+\ - '\n CefRefPtr<'+refptr_class+'> '+arg_name+'Ptr;'\ - '\n if ('+arg_name+' && *'+arg_name+')'\ - '\n '+arg_name+'Ptr = '+assign+';'\ - '\n '+refptr_class+'* '+arg_name+'Orig = '+arg_name+'Ptr.get();' - params.append(arg_name+'Ptr') - elif arg_type == 'string_vec_byref' or arg_type == 'string_vec_byref_const': - result += comment+\ - '\n std::vector '+arg_name+'List;'\ - '\n transfer_string_list_contents('+arg_name+', '+arg_name+'List);' - params.append(arg_name+'List') - elif arg_type == 'string_map_single_byref' or arg_type == 'string_map_single_byref_const': - result += comment+\ - '\n std::map '+arg_name+'Map;'\ - '\n transfer_string_map_contents('+arg_name+', '+arg_name+'Map);' - params.append(arg_name+'Map') - elif arg_type == 'string_map_multi_byref' or arg_type == 'string_map_multi_byref_const': - result += comment+\ - '\n std::multimap '+arg_name+'Multimap;'\ - '\n transfer_string_multimap_contents('+arg_name+', '+arg_name+'Multimap);' - params.append(arg_name+'Multimap') - elif arg_type == 'simple_vec_byref' or arg_type == 'bool_vec_byref' or \ - arg_type == 'refptr_vec_same_byref' or arg_type == 'refptr_vec_diff_byref': - vec_type = arg.get_type().get_vector_type() - if arg_type == 'simple_vec_byref': - assign = arg_name+'[i]' - elif arg_type == 'bool_vec_byref': - assign = arg_name+'[i]?true:false' - elif arg_type == 'refptr_vec_same_byref': - refptr_class = arg.get_type().get_refptr_type() - assign = refptr_class+'CppToC::Unwrap('+arg_name+'[i])' - elif arg_type == 'refptr_vec_diff_byref': - refptr_class = arg.get_type().get_refptr_type() - assign = refptr_class+'CToCpp::Wrap('+arg_name+'[i])' - result += comment+\ - '\n std::vector<'+vec_type+' > '+arg_name+'List;'\ - '\n if ('+arg_name+'Count && *'+arg_name+'Count > 0 && '+arg_name+') {'\ - '\n for (size_t i = 0; i < *'+arg_name+'Count; ++i) {'\ - '\n '+arg_name+'List.push_back('+assign+');'\ - '\n }'\ - '\n }' - params.append(arg_name+'List') - elif arg_type == 'simple_vec_byref_const' or arg_type == 'bool_vec_byref_const' or \ - arg_type == 'refptr_vec_same_byref_const' or arg_type == 'refptr_vec_diff_byref_const': - vec_type = arg.get_type().get_vector_type() - if arg_type == 'simple_vec_byref_const': - assign = arg_name+'[i]' - elif arg_type == 'bool_vec_byref_const': - assign = arg_name+'[i]?true:false' - elif arg_type == 'refptr_vec_same_byref_const': - refptr_class = arg.get_type().get_refptr_type() - assign = refptr_class+'CppToC::Unwrap('+arg_name+'[i])' - elif arg_type == 'refptr_vec_diff_byref_const': - refptr_class = arg.get_type().get_refptr_type() - assign = refptr_class+'CToCpp::Wrap('+arg_name+'[i])' - result += comment+\ - '\n std::vector<'+vec_type+' > '+arg_name+'List;'\ - '\n if ('+arg_name+'Count > 0) {'\ - '\n for (size_t i = 0; i < '+arg_name+'Count; ++i) {'\ - '\n '+arg_name+'List.push_back('+assign+');'\ - '\n }'\ - '\n }' - params.append(arg_name+'List') - - if len(result) != result_len: - result += '\n' - result_len = len(result) - - # execution - result += '\n // Execute\n ' - - if retval_type != 'none': - # has a return value - if retval_type == 'simple': - result += retval.get_type().get_result_simple_type() - else: - result += retval.get_type().get_type() - result += ' _retval = ' - - if isinstance(func.parent, obj_class): - # virtual and static class methods - if isinstance(func, obj_function_virtual): - result += func.parent.get_name()+'CppToC::Get(self)->' - else: - result += func.parent.get_name()+'::' - result += func.get_name()+'(' - - if len(params) > 0: - result += '\n '+string.join(params,',\n ') - - result += ');\n' - - result_len = len(result) - - # parameter restoration - for arg in args: - arg_type = arg.get_arg_type() - arg_name = arg.get_type().get_name() - - comment = '\n // Restore param: '+arg_name+'; type: '+arg_type - - if arg_type == 'simple_byref': - result += comment+\ - '\n if ('+arg_name+')'\ - '\n *'+arg_name+' = '+arg_name+'Val;' - elif arg_type == 'bool_byref' or arg_type == 'bool_byaddr': - result += comment+\ - '\n if ('+arg_name+')'\ - '\n *'+arg_name+' = '+arg_name+'Bool?true:false;' - elif arg_type == 'struct_byref': - result += comment+\ - '\n if ('+arg_name+')'\ - '\n '+arg_name+'Obj.DetachTo(*'+arg_name+');' - elif arg_type == 'refptr_same_byref' or arg_type == 'refptr_diff_byref': - refptr_class = arg.get_type().get_refptr_type() - if arg_type == 'refptr_same_byref': - assign = refptr_class+'CppToC::Wrap('+arg_name+'Ptr)' - else: - assign = refptr_class+'CToCpp::Unwrap('+arg_name+'Ptr)' - result += comment+\ - '\n if ('+arg_name+') {'\ - '\n if ('+arg_name+'Ptr.get()) {'\ - '\n if ('+arg_name+'Ptr.get() != '+arg_name+'Orig) {'\ - '\n *'+arg_name+' = '+assign+';'\ - '\n }'\ - '\n } else {'\ - '\n *'+arg_name+' = NULL;'\ - '\n }'\ - '\n }' - elif arg_type == 'string_vec_byref': - result += comment+\ - '\n cef_string_list_clear('+arg_name+');'\ - '\n transfer_string_list_contents('+arg_name+'List, '+arg_name+');' - elif arg_type == 'string_map_single_byref': - result += comment+\ - '\n cef_string_map_clear('+arg_name+');'\ - '\n transfer_string_map_contents('+arg_name+'Map, '+arg_name+');' - elif arg_type == 'string_map_multi_byref': - result += comment+\ - '\n cef_string_multimap_clear('+arg_name+');'\ - '\n transfer_string_multimap_contents('+arg_name+'Multimap, '+arg_name+');' - elif arg_type == 'simple_vec_byref' or arg_type == 'bool_vec_byref' or \ - arg_type == 'refptr_vec_same_byref' or arg_type == 'refptr_vec_diff_byref': - if arg_type == 'simple_vec_byref' or arg_type == 'bool_vec_byref': - assign = arg_name+'List[i]' - elif arg_type == 'refptr_vec_same_byref': - refptr_class = arg.get_type().get_refptr_type() - assign = refptr_class+'CppToC::Wrap('+arg_name+'List[i])' - elif arg_type == 'refptr_vec_diff_byref': - refptr_class = arg.get_type().get_refptr_type() - assign = refptr_class+'CToCpp::Unwrap('+arg_name+'List[i])' - result += comment+\ - '\n if ('+arg_name+'Count && '+arg_name+') {'\ - '\n *'+arg_name+'Count = std::min('+arg_name+'List.size(), *'+arg_name+'Count);'\ - '\n if (*'+arg_name+'Count > 0) {'\ - '\n for (size_t i = 0; i < *'+arg_name+'Count; ++i) {'\ - '\n '+arg_name+'[i] = '+assign+';'\ - '\n }'\ - '\n }'\ - '\n }' - - if len(result) != result_len: - result += '\n' - result_len = len(result) - - # special handling for the global cef_shutdown function - if name == 'cef_shutdown' and isinstance(func.parent, obj_header): - classes = func.parent.get_classes() - - names = [] - for cls in classes: - if cls.has_attrib('no_debugct_check'): - continue; - - if cls.is_library_side(): - names.append(cls.get_name()+'CppToC') - else: - names.append(cls.get_name()+'CToCpp') - - if len(names) > 0: - names = sorted(names) - result += '\n#ifndef NDEBUG'\ - '\n // Check that all wrapper objects have been destroyed' - for name in names: - result += '\n DCHECK_EQ('+name+'::DebugObjCt, 0);'; - result += '\n#endif // !NDEBUG' - - if len(result) != result_len: - result += '\n' - result_len = len(result) - - # return translation - if retval_type != 'none': - # has a return value - result += '\n // Return type: '+retval_type - if retval_type == 'simple' or retval_type == 'bool': - result += '\n return _retval;' - elif retval_type == 'string': - result += '\n return _retval.DetachToUserFree();' - elif retval_type == 'refptr_same': - refptr_class = retval.get_type().get_refptr_type() - result += '\n return '+refptr_class+'CppToC::Wrap(_retval);' - elif retval_type == 'refptr_diff': - refptr_class = retval.get_type().get_refptr_type() - result += '\n return '+refptr_class+'CToCpp::Unwrap(_retval);' - - if len(result) != result_len: - result += '\n' - - result += '}\n' - return wrap_code(result) - -def make_cpptoc_function_impl(funcs, existing, prefixname, defined_names): - impl = '' - - for func in funcs: - if not prefixname is None: - name = prefixname+'_'+func.get_capi_name() - else: - name = func.get_capi_name() - value = get_next_function_impl(existing, name) - if not value is None \ - and value['body'].find('// AUTO-GENERATED CONTENT') < 0: - # an implementation exists that was not auto-generated - impl += make_cpptoc_function_impl_existing(name, func, value, defined_names) - else: - impl += make_cpptoc_function_impl_new(name, func, defined_names) - - return impl - -def make_cpptoc_class_impl(header, clsname, impl): - # structure names that have already been defined - defined_names = header.get_defined_structs() - - # retrieve the class and populate the defined names - cls = header.get_class(clsname, defined_names) - if cls is None: - raise Exception('Class does not exist: '+clsname) - - capiname = cls.get_capi_name() - prefixname = get_capi_name(clsname[3:], False) - - # retrieve the existing virtual function implementations - existing = get_function_impls(impl, 'CEF_CALLBACK') - - # generate virtual functions - virtualimpl = make_cpptoc_function_impl(cls.get_virtual_funcs(), existing, prefixname, defined_names) - if len(virtualimpl) > 0: - virtualimpl = '\n// MEMBER FUNCTIONS - Body may be edited by hand.\n\n'+virtualimpl - - # the current class is already defined for static functions - defined_names.append(cls.get_capi_name()) - - # retrieve the existing static function implementations - existing = get_function_impls(impl, 'CEF_EXPORT') - - # generate static functions - staticimpl = make_cpptoc_function_impl(cls.get_static_funcs(), existing, None, defined_names) - if len(staticimpl) > 0: - staticimpl = '\n// GLOBAL FUNCTIONS - Body may be edited by hand.\n\n'+staticimpl - - resultingimpl = staticimpl + virtualimpl - - # determine what includes are required by identifying what translation - # classes are being used - includes = format_translation_includes(resultingimpl) - - # build the final output - result = get_copyright() - - result += includes+'\n'+resultingimpl+'\n' - - const = '// CONSTRUCTOR - Do not edit by hand.\n\n'+ \ - clsname+'CppToC::'+clsname+'CppToC('+clsname+'* cls)\n'+ \ - ' : CefCppToC<'+clsname+'CppToC, '+clsname+', '+capiname+'>(cls) '+ \ - '{\n'; - - funcs = cls.get_virtual_funcs() - for func in funcs: - name = func.get_capi_name() - const += ' struct_.struct_.'+name+' = '+prefixname+'_'+name+';\n' - - const += '}\n\n'+ \ - '#ifndef NDEBUG\n'+ \ - 'template<> long CefCppToC<'+clsname+'CppToC, '+clsname+', '+capiname+'>::DebugObjCt = 0;\n'+ \ - '#endif\n' - result += wrap_code(const) - - return result - -def make_cpptoc_global_impl(header, impl): - # structure names that have already been defined - defined_names = header.get_defined_structs() - - # retrieve the existing global function implementations - existing = get_function_impls(impl, 'CEF_EXPORT') - - # generate global functions - impl = make_cpptoc_function_impl(header.get_funcs(), existing, None, defined_names) - if len(impl) > 0: - impl = '\n// GLOBAL FUNCTIONS - Body may be edited by hand.\n\n'+impl - - includes = '' - - # include required headers for global functions - filenames = [] - for func in header.get_funcs(): - filename = func.get_file_name() - if not filename in filenames: - includes += '#include "include/'+func.get_file_name()+'"\n' \ - '#include "include/capi/'+func.get_capi_file_name()+'"\n' - filenames.append(filename) - - # determine what includes are required by identifying what translation - # classes are being used - includes += format_translation_includes(impl) - - # build the final output - result = get_copyright() - - result += includes+'\n'+impl - - return result - -def write_cpptoc_impl(header, clsname, dir, backup): - if clsname is None: - # global file - file = dir - else: - # class file - file = dir+os.sep+get_capi_name(clsname[3:], False)+'_cpptoc.cc' - - if path_exists(file): - oldcontents = read_file(file) - else: - oldcontents = '' - - if clsname is None: - newcontents = make_cpptoc_global_impl(header, oldcontents) - else: - newcontents = make_cpptoc_class_impl(header, clsname, oldcontents) - if newcontents != oldcontents: - if backup and oldcontents != '': - backup_file(file) - write_file(file, newcontents) - return True - - return False - - -# test the module -if __name__ == "__main__": - import sys - - # verify that the correct number of command-line arguments are provided - if len(sys.argv) < 4: - sys.stderr.write('Usage: '+sys.argv[0]+' ') - sys.exit() - - # create the header object - header = obj_header() - header.add_file(sys.argv[1]) - - # read the existing implementation file into memory - try: - f = open(sys.argv[3], 'r') - data = f.read() - except IOError, (errno, strerror): - raise Exception('Failed to read file '+sys.argv[3]+': '+strerror) - else: - f.close() - - # dump the result to stdout - sys.stdout.write(make_cpptoc_class_impl(header, sys.argv[2], data)) diff --git a/cef1/tools/make_ctocpp_header.py b/cef1/tools/make_ctocpp_header.py deleted file mode 100644 index 027ac8a14..000000000 --- a/cef1/tools/make_ctocpp_header.py +++ /dev/null @@ -1,122 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from cef_parser import * - -def make_ctocpp_header(header, clsname): - cls = header.get_class(clsname) - if cls is None: - raise Exception('Class does not exist: '+clsname) - - clientside = cls.is_client_side() - defname = string.upper(get_capi_name(clsname[3:], False)) - capiname = cls.get_capi_name() - - result = get_copyright() - - result += '#ifndef CEF_LIBCEF_DLL_CTOCPP_'+defname+'_CTOCPP_H_\n'+ \ - '#define CEF_LIBCEF_DLL_CTOCPP_'+defname+'_CTOCPP_H_\n' + \ - '#pragma once\n' - - if clientside: - result += """ -#ifndef BUILDING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed DLL-side only") -#else // BUILDING_CEF_SHARED -""" - else: - result += """ -#ifndef USING_CEF_SHARED -#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") -#else // USING_CEF_SHARED -""" - - # build the function body - func_body = '' - funcs = cls.get_virtual_funcs() - for func in funcs: - func_body += ' virtual '+func.get_cpp_proto()+' OVERRIDE;\n' - - # include standard headers - if func_body.find('std::map') > 0 or func_body.find('std::multimap') > 0: - result += '\n#include ' - if func_body.find('std::vector') > 0: - result += '\n#include ' - - # include the headers for this class - result += '\n#include "include/'+cls.get_file_name()+'"'+ \ - '\n#include "include/capi/'+cls.get_capi_file_name()+'"\n' - - # include headers for any forward declared classes that are not in the same file - declares = cls.get_forward_declares() - for declare in declares: - dcls = header.get_class(declare) - if dcls.get_file_name() != cls.get_file_name(): - result += '#include "include/'+dcls.get_file_name()+'"\n' \ - '#include "include/capi/'+dcls.get_capi_file_name()+'"\n' - - result += """#include "libcef_dll/ctocpp/ctocpp.h" - -// Wrap a C structure with a C++ class. -""" - - if clientside: - result += '// This class may be instantiated and accessed DLL-side only.\n' - else: - result += '// This class may be instantiated and accessed wrapper-side only.\n' - - result += 'class '+clsname+'CToCpp\n'+ \ - ' : public CefCToCpp<'+clsname+'CToCpp, '+clsname+', '+capiname+'> {\n'+ \ - ' public:\n'+ \ - ' explicit '+clsname+'CToCpp('+capiname+'* str)\n'+ \ - ' : CefCToCpp<'+clsname+'CToCpp, '+clsname+', '+capiname+'>(str) {}\n'+ \ - ' virtual ~'+clsname+'CToCpp() {}\n\n'+ \ - ' // '+clsname+' methods\n'; - - result += func_body - result += '};\n\n' - - if clientside: - result += '#endif // BUILDING_CEF_SHARED\n' - else: - result += '#endif // USING_CEF_SHARED\n' - - result += '#endif // CEF_LIBCEF_DLL_CTOCPP_'+defname+'_CTOCPP_H_\n' - - return wrap_code(result) - - -def write_ctocpp_header(header, clsname, dir, backup): - file = dir+os.sep+get_capi_name(clsname[3:], False)+'_ctocpp.h' - - if path_exists(file): - oldcontents = read_file(file) - else: - oldcontents = '' - - newcontents = make_ctocpp_header(header, clsname) - if newcontents != oldcontents: - if backup and oldcontents != '': - backup_file(file) - write_file(file, newcontents) - return True - - return False - - -# test the module -if __name__ == "__main__": - import sys - - # verify that the correct number of command-line arguments are provided - if len(sys.argv) < 3: - sys.stderr.write('Usage: '+sys.argv[0]+' ') - sys.exit() - - # create the header object - header = obj_header() - header.add_file(sys.argv[1]) - - # dump the result to stdout - sys.stdout.write(make_ctocpp_header(header, sys.argv[2])) diff --git a/cef1/tools/make_ctocpp_impl.py b/cef1/tools/make_ctocpp_impl.py deleted file mode 100644 index 0ef21e4bc..000000000 --- a/cef1/tools/make_ctocpp_impl.py +++ /dev/null @@ -1,576 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from cef_parser import * - -def make_ctocpp_impl_proto(clsname, name, func, parts): - const = '' - - if clsname is None: - proto = 'CEF_GLOBAL '+parts['retval']+' ' - else: - proto = parts['retval']+' '+clsname - if isinstance(func, obj_function_virtual): - proto += 'CToCpp' - if func.is_const(): - const = ' const' - - proto += '::' - - proto += name+'('+string.join(parts['args'], ', ')+')'+const - return proto - -def make_ctocpp_function_impl_existing(clsname, name, func, impl): - notify(name+' has manual edits') - - # retrieve the C++ prototype parts - parts = func.get_cpp_parts(True) - - changes = format_translation_changes(impl, parts) - if len(changes) > 0: - notify(name+' prototype changed') - - return wrap_code(make_ctocpp_impl_proto(clsname, name, func, parts))+'{'+ \ - changes+impl['body']+'\n}\n' - -def make_ctocpp_function_impl_new(clsname, name, func): - # build the C++ prototype - parts = func.get_cpp_parts(True) - result = make_ctocpp_impl_proto(clsname, name, func, parts)+' {' - - invalid = [] - - # retrieve the function arguments - args = func.get_arguments() - - # determine the argument types - for arg in args: - if arg.get_arg_type() == 'invalid': - invalid.append(arg.get_name()) - - # retrieve the function return value - retval = func.get_retval() - retval_type = retval.get_retval_type() - if retval_type == 'invalid': - invalid.append('(return value)') - retval_default = '' - else: - retval_default = retval.get_retval_default(False) - if len(retval_default) > 0: - retval_default = ' '+retval_default; - - # add revision check - if func.has_attrib('revision_check'): - result += '\n int build_revision = cef_build_revision();'\ - '\n if (build_revision != CEF_REVISION) {'\ - '\n // The libcef build revision does not match the CEF API revision.'\ - '\n DCHECK(false);'\ - '\n return'+retval_default+';'\ - '\n }\n' - - if isinstance(func, obj_function_virtual): - # add the structure size check - result += '\n if (CEF_MEMBER_MISSING(struct_, '+func.get_capi_name()+'))' - result += '\n return'+retval_default+';\n' - - if len(invalid) > 0: - notify(name+' could not be autogenerated') - # code could not be auto-generated - result += '\n // BEGIN DELETE BEFORE MODIFYING' - result += '\n // AUTO-GENERATED CONTENT' - result += '\n // COULD NOT IMPLEMENT DUE TO: '+string.join(invalid, ', ') - result += '\n #pragma message("Warning: "__FILE__": '+name+' is not implemented")' - result += '\n // END DELETE BEFORE MODIFYING' - result += '\n}\n\n' - return wrap_code(result) - - result += '\n // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING\n' - - result_len = len(result) - - optional = [] - - # parameter verification - for arg in args: - arg_type = arg.get_arg_type() - arg_name = arg.get_type().get_name() - - # skip optional params - optional_params = arg.parent.get_attrib_list('optional_param') - if not optional_params is None and arg_name in optional_params: - optional.append(arg_name) - continue - - comment = '\n // Verify param: '+arg_name+'; type: '+arg_type - - if arg_type == 'simple_byaddr' or arg_type == 'bool_byaddr': - result += comment+\ - '\n DCHECK('+arg_name+');'\ - '\n if (!'+arg_name+')'\ - '\n return'+retval_default+';' - elif arg_type == 'refptr_same' or arg_type == 'refptr_diff': - result += comment+\ - '\n DCHECK('+arg_name+'.get());'\ - '\n if (!'+arg_name+'.get())'\ - '\n return'+retval_default+';' - elif arg_type == 'string_byref_const': - result += comment+\ - '\n DCHECK(!'+arg_name+'.empty());'\ - '\n if ('+arg_name+'.empty())'\ - '\n return'+retval_default+';' - - # check index params - index_params = arg.parent.get_attrib_list('index_param') - if not index_params is None and arg_name in index_params: - result += comment+\ - '\n DCHECK_GE('+arg_name+', 0);'\ - '\n if ('+arg_name+' < 0)'\ - '\n return'+retval_default+';' - - if len(optional) > 0: - result += '\n // Unverified params: '+string.join(optional,', ') - - if len(result) != result_len: - result += '\n' - result_len = len(result) - - # parameter translation - params = [] - if isinstance(func, obj_function_virtual): - params.append('struct_') - - for arg in args: - arg_type = arg.get_arg_type() - arg_name = arg.get_type().get_name() - - comment = '\n // Translate param: '+arg_name+'; type: '+arg_type - - if arg_type == 'simple_byval' or arg_type == 'simple_byaddr' or \ - arg_type == 'bool_byval': - params.append(arg_name) - elif arg_type == 'simple_byref' or arg_type == 'simple_byref_const' or \ - arg_type == 'struct_byref_const' or arg_type == 'struct_byref': - params.append('&'+arg_name) - elif arg_type == 'bool_byref': - result += comment+\ - '\n int '+arg_name+'Int = '+arg_name+';' - params.append('&'+arg_name+'Int') - elif arg_type == 'bool_byaddr': - result += comment+\ - '\n int '+arg_name+'Int = '+arg_name+'?*'+arg_name+':0;' - params.append('&'+arg_name+'Int') - elif arg_type == 'string_byref_const': - params.append(arg_name+'.GetStruct()') - elif arg_type == 'string_byref': - params.append(arg_name+'.GetWritableStruct()') - elif arg_type == 'refptr_same': - refptr_class = arg.get_type().get_refptr_type() - params.append(refptr_class+'CToCpp::Unwrap('+arg_name+')') - elif arg_type == 'refptr_diff': - refptr_class = arg.get_type().get_refptr_type() - params.append(refptr_class+'CppToC::Wrap('+arg_name+')') - elif arg_type == 'refptr_same_byref' or arg_type == 'refptr_diff_byref': - refptr_class = arg.get_type().get_refptr_type() - refptr_struct = arg.get_type().get_result_refptr_type_root() - if arg_type == 'refptr_same_byref': - assign = refptr_class+'CToCpp::Unwrap('+arg_name+')' - else: - assign = refptr_class+'CppToC::Wrap('+arg_name+')' - result += comment+\ - '\n '+refptr_struct+'* '+arg_name+'Struct = NULL;'\ - '\n if ('+arg_name+'.get())'\ - '\n '+arg_name+'Struct = '+assign+';'\ - '\n '+refptr_struct+'* '+arg_name+'Orig = '+arg_name+'Struct;' - params.append('&'+arg_name+'Struct') - elif arg_type == 'string_vec_byref' or arg_type == 'string_vec_byref_const': - result += comment+\ - '\n cef_string_list_t '+arg_name+'List = cef_string_list_alloc();'\ - '\n DCHECK('+arg_name+'List);'\ - '\n if ('+arg_name+'List)'\ - '\n transfer_string_list_contents('+arg_name+', '+arg_name+'List);' - params.append(arg_name+'List') - elif arg_type == 'string_map_single_byref' or arg_type == 'string_map_single_byref_const': - result += comment+\ - '\n cef_string_map_t '+arg_name+'Map = cef_string_map_alloc();'\ - '\n DCHECK('+arg_name+'Map);'\ - '\n if ('+arg_name+'Map)'\ - '\n transfer_string_map_contents('+arg_name+', '+arg_name+'Map);' - params.append(arg_name+'Map') - elif arg_type == 'string_map_multi_byref' or arg_type == 'string_map_multi_byref_const': - result += comment+\ - '\n cef_string_multimap_t '+arg_name+'Multimap = cef_string_multimap_alloc();'\ - '\n DCHECK('+arg_name+'Multimap);'\ - '\n if ('+arg_name+'Multimap)'\ - '\n transfer_string_multimap_contents('+arg_name+', '+arg_name+'Multimap);' - params.append(arg_name+'Multimap') - elif arg_type == 'simple_vec_byref' or arg_type == 'bool_vec_byref' or \ - arg_type == 'refptr_vec_same_byref' or arg_type == 'refptr_vec_diff_byref': - count_func = arg.get_attrib_count_func() - vec_type = arg.get_type().get_result_vector_type_root() - if arg_type == 'refptr_vec_same_byref': - refptr_class = arg.get_type().get_refptr_type() - assign = refptr_class+'CToCpp::Unwrap('+arg_name+'[i])' - elif arg_type == 'refptr_vec_diff_byref': - refptr_class = arg.get_type().get_refptr_type() - assign = refptr_class+'CppToC::Wrap('+arg_name+'[i])' - else: - assign = arg_name+'[i]' - result += comment+\ - '\n size_t '+arg_name+'Size = '+arg_name+'.size();'\ - '\n size_t '+arg_name+'Count = std::max('+count_func+'(), '+arg_name+'Size);'\ - '\n '+vec_type+'* '+arg_name+'List = NULL;'\ - '\n if ('+arg_name+'Count > 0) {'\ - '\n '+arg_name+'List = new '+vec_type+'['+arg_name+'Count];'\ - '\n DCHECK('+arg_name+'List);'\ - '\n if ('+arg_name+'List) {'\ - '\n memset('+arg_name+'List, 0, sizeof('+vec_type+')*'+arg_name+'Count);'\ - '\n }'\ - '\n if ('+arg_name+'List && '+arg_name+'Size > 0) {'\ - '\n for (size_t i = 0; i < '+arg_name+'Size; ++i) {'\ - '\n '+arg_name+'List[i] = '+assign+';'\ - '\n }'\ - '\n }'\ - '\n }' - params.append('&'+arg_name+'Count') - params.append(arg_name+'List') - elif arg_type == 'simple_vec_byref_const' or arg_type == 'bool_vec_byref_const' or \ - arg_type == 'refptr_vec_same_byref_const' or arg_type == 'refptr_vec_diff_byref_const': - count_func = arg.get_attrib_count_func() - vec_type = arg.get_type().get_result_vector_type_root() - if arg_type == 'refptr_vec_same_byref_const': - refptr_class = arg.get_type().get_refptr_type() - assign = refptr_class+'CToCpp::Unwrap('+arg_name+'[i])' - elif arg_type == 'refptr_vec_diff_byref_const': - refptr_class = arg.get_type().get_refptr_type() - assign = refptr_class+'CppToC::Wrap('+arg_name+'[i])' - else: - assign = arg_name+'[i]' - result += comment+\ - '\n const size_t '+arg_name+'Count = '+arg_name+'.size();'\ - '\n '+vec_type+'* '+arg_name+'List = NULL;'\ - '\n if ('+arg_name+'Count > 0) {'\ - '\n '+arg_name+'List = new '+vec_type+'['+arg_name+'Count];'\ - '\n DCHECK('+arg_name+'List);'\ - '\n if ('+arg_name+'List) {'\ - '\n for (size_t i = 0; i < '+arg_name+'Count; ++i) {'\ - '\n '+arg_name+'List[i] = '+assign+';'\ - '\n }'\ - '\n }'\ - '\n }' - params.append(arg_name+'Count') - params.append(arg_name+'List') - - if len(result) != result_len: - result += '\n' - result_len = len(result) - - # execution - result += '\n // Execute\n ' - - if retval_type != 'none': - # has a return value - if retval_type == 'simple' or retval_type == 'bool': - result += retval.get_type().get_result_simple_type_root() - elif retval_type == 'string': - result += 'cef_string_userfree_t' - elif retval_type == 'refptr_same' or retval_type == 'refptr_diff': - refptr_struct = retval.get_type().get_result_refptr_type_root() - result += refptr_struct+'*' - - result += ' _retval = ' - - if isinstance(func, obj_function_virtual): - result += 'struct_->' - result += func.get_capi_name()+'(' - - if len(params) > 0: - if not isinstance(func, obj_function_virtual): - result += '\n ' - result += string.join(params,',\n ') - - result += ');\n' - - result_len = len(result) - - # parameter restoration - for arg in args: - arg_type = arg.get_arg_type() - arg_name = arg.get_type().get_name() - - comment = '\n // Restore param:'+arg_name+'; type: '+arg_type - - if arg_type == 'bool_byref': - result += comment+\ - '\n '+arg_name+' = '+arg_name+'Int?true:false;' - elif arg_type == 'bool_byaddr': - result += comment+\ - '\n if ('+arg_name+')'\ - '\n *'+arg_name+' = '+arg_name+'Int?true:false;' - elif arg_type == 'refptr_same_byref' or arg_type == 'refptr_diff_byref': - refptr_class = arg.get_type().get_refptr_type() - refptr_struct = arg.get_type().get_result_refptr_type_root() - if arg_type == 'refptr_same_byref': - assign = refptr_class+'CToCpp::Wrap('+arg_name+'Struct)' - else: - assign = refptr_class+'CppToC::Unwrap('+arg_name+'Struct)' - result += comment+\ - '\n if ('+arg_name+'Struct) {'\ - '\n if ('+arg_name+'Struct != '+arg_name+'Orig) {'\ - '\n '+arg_name+' = '+assign+';'\ - '\n }'\ - '\n } else {'\ - '\n '+arg_name+' = NULL;'\ - '\n }' - elif arg_type == 'string_vec_byref': - result += comment+\ - '\n if ('+arg_name+'List) {'\ - '\n '+arg_name+'.clear();'\ - '\n transfer_string_list_contents('+arg_name+'List, '+arg_name+');'\ - '\n cef_string_list_free('+arg_name+'List);'\ - '\n }' - elif arg_type == 'string_vec_byref_const': - result += comment+\ - '\n if ('+arg_name+'List)'\ - '\n cef_string_list_free('+arg_name+'List);' - elif arg_type == 'string_map_single_byref': - result += comment+\ - '\n if ('+arg_name+'Map) {'\ - '\n '+arg_name+'.clear();'\ - '\n transfer_string_map_contents('+arg_name+'Map, '+arg_name+');'\ - '\n cef_string_map_free('+arg_name+'Map);'\ - '\n }' - elif arg_type == 'string_map_single_byref_const': - result += comment+\ - '\n if ('+arg_name+'Map)'\ - '\n cef_string_map_free('+arg_name+'Map);' - elif arg_type == 'string_map_multi_byref': - result += comment+\ - '\n if ('+arg_name+'Multimap) {'\ - '\n '+arg_name+'.clear();'\ - '\n transfer_string_multimap_contents('+arg_name+'Multimap, '+arg_name+');'\ - '\n cef_string_multimap_free('+arg_name+'Multimap);'\ - '\n }' - elif arg_type == 'string_map_multi_byref_const': - result += comment+\ - '\n if ('+arg_name+'Multimap)'\ - '\n cef_string_multimap_free('+arg_name+'Multimap);' - elif arg_type == 'simple_vec_byref' or arg_type == 'bool_vec_byref' or \ - arg_type == 'refptr_vec_same_byref' or arg_type == 'refptr_vec_diff_byref': - count_func = arg.get_attrib_count_func() - vec_type = arg.get_type().get_result_vector_type_root() - if arg_type == 'refptr_vec_same_byref': - refptr_class = arg.get_type().get_refptr_type() - assign = refptr_class+'CToCpp::Wrap('+arg_name+'List[i])' - elif arg_type == 'refptr_vec_diff_byref': - refptr_class = arg.get_type().get_refptr_type() - assign = refptr_class+'CppToC::Unwrap('+arg_name+'List[i])' - elif arg_type == 'bool_vec_byref': - assign = arg_name+'List[i]?true:false' - else: - assign = arg_name+'List[i]' - result += comment+\ - '\n '+arg_name+'.clear();'\ - '\n if ('+arg_name+'Count > 0 && '+arg_name+'List) {'\ - '\n for (size_t i = 0; i < '+arg_name+'Count; ++i) {'\ - '\n '+arg_name+'.push_back('+assign+');'\ - '\n }'\ - '\n delete [] '+arg_name+'List;'\ - '\n }' - elif arg_type == 'simple_vec_byref_const' or arg_type == 'bool_vec_byref_const' or \ - arg_type == 'refptr_vec_same_byref_const' or arg_type == 'refptr_vec_diff_byref_const': - result += comment+\ - '\n if ('+arg_name+'List)'\ - '\n delete [] '+arg_name+'List;' - - if len(result) != result_len: - result += '\n' - result_len = len(result) - - # special handling for the global CefShutdown function - if name == 'CefShutdown' and isinstance(func.parent, obj_header): - classes = func.parent.get_classes() - - names = [] - for cls in classes: - if cls.has_attrib('no_debugct_check'): - continue; - - if cls.is_library_side(): - names.append(cls.get_name()+'CToCpp') - else: - names.append(cls.get_name()+'CppToC') - - if len(names) > 0: - names = sorted(names) - result += '\n#ifndef NDEBUG'\ - '\n // Check that all wrapper objects have been destroyed' - for name in names: - result += '\n DCHECK_EQ('+name+'::DebugObjCt, 0);'; - result += '\n#endif // !NDEBUG' - - if len(result) != result_len: - result += '\n' - result_len = len(result) - - # return translation - if retval_type != 'none': - # has a return value - result += '\n // Return type: '+retval_type - if retval_type == 'simple': - result += '\n return _retval;' - elif retval_type == 'bool': - result += '\n return _retval?true:false;' - elif retval_type == 'string': - result += '\n CefString _retvalStr;'\ - '\n _retvalStr.AttachToUserFree(_retval);'\ - '\n return _retvalStr;' - elif retval_type == 'refptr_same': - refptr_class = retval.get_type().get_refptr_type() - result += '\n return '+refptr_class+'CToCpp::Wrap(_retval);' - elif retval_type == 'refptr_diff': - refptr_class = retval.get_type().get_refptr_type() - result += '\n return '+refptr_class+'CppToC::Unwrap(_retval);' - - if len(result) != result_len: - result += '\n' - - result += '}\n' - return wrap_code(result) - -def make_ctocpp_function_impl(clsname, funcs, existing): - impl = '' - - for func in funcs: - name = func.get_name() - value = get_next_function_impl(existing, name) - if not value is None \ - and value['body'].find('// AUTO-GENERATED CONTENT') < 0: - # an implementation exists that was not auto-generated - impl += make_ctocpp_function_impl_existing(clsname, name, func, value) - else: - impl += make_ctocpp_function_impl_new(clsname, name, func) - - return impl - -def make_ctocpp_class_impl(header, clsname, impl): - cls = header.get_class(clsname) - if cls is None: - raise Exception('Class does not exist: '+clsname) - - capiname = cls.get_capi_name() - - # retrieve the existing virtual function implementations - existing = get_function_impls(impl, clsname+'CToCpp::') - - # generate virtual functions - virtualimpl = make_ctocpp_function_impl(clsname, cls.get_virtual_funcs(), existing) - if len(virtualimpl) > 0: - virtualimpl = '\n// VIRTUAL METHODS - Body may be edited by hand.\n\n'+virtualimpl - - # retrieve the existing static function implementations - existing = get_function_impls(impl, clsname+'::') - - # generate static functions - staticimpl = make_ctocpp_function_impl(clsname, cls.get_static_funcs(), existing) - if len(staticimpl) > 0: - staticimpl = '\n// STATIC METHODS - Body may be edited by hand.\n\n'+staticimpl - - resultingimpl = staticimpl + virtualimpl - - # determine what includes are required by identifying what translation - # classes are being used - includes = format_translation_includes(resultingimpl) - - # build the final output - result = get_copyright() - - result += includes+'\n'+resultingimpl+'\n' - - result += wrap_code('#ifndef NDEBUG\n'+ \ - 'template<> long CefCToCpp<'+clsname+'CToCpp, '+clsname+', '+capiname+'>::DebugObjCt = 0;\n'+ \ - '#endif\n') - - return result - -def make_ctocpp_global_impl(header, impl): - # retrieve the existing global function implementations - existing = get_function_impls(impl, 'CEF_GLOBAL') - - # generate static functions - impl = make_ctocpp_function_impl(None, header.get_funcs(), existing) - if len(impl) > 0: - impl = '\n// GLOBAL METHODS - Body may be edited by hand.\n\n'+impl - - includes = '' - - # include required headers for global functions - filenames = [] - for func in header.get_funcs(): - filename = func.get_file_name() - if not filename in filenames: - includes += '#include "include/'+func.get_file_name()+'"\n' \ - '#include "include/capi/'+func.get_capi_file_name()+'"\n' - filenames.append(filename) - - # determine what includes are required by identifying what translation - # classes are being used - includes += format_translation_includes(impl) - - # build the final output - result = get_copyright() - - result += includes+'\n// Define used to facilitate parsing.\n#define CEF_GLOBAL\n\n'+impl - - return result - -def write_ctocpp_impl(header, clsname, dir, backup): - if clsname is None: - # global file - file = dir - else: - # class file - file = dir+os.sep+get_capi_name(clsname[3:], False)+'_ctocpp.cc' - - if path_exists(file): - oldcontents = read_file(file) - else: - oldcontents = '' - - if clsname is None: - newcontents = make_ctocpp_global_impl(header, oldcontents) - else: - newcontents = make_ctocpp_class_impl(header, clsname, oldcontents) - if newcontents != oldcontents: - if backup and oldcontents != '': - backup_file(file) - write_file(file, newcontents) - return True - - return False - - -# test the module -if __name__ == "__main__": - import sys - - # verify that the correct number of command-line arguments are provided - if len(sys.argv) < 4: - sys.stderr.write('Usage: '+sys.argv[0]+' ') - sys.exit() - - # create the header object - header = obj_header() - header.add_file(sys.argv[1]) - - # read the existing implementation file into memory - try: - f = open(sys.argv[3], 'r') - data = f.read() - except IOError, (errno, strerror): - raise Exception('Failed to read file '+sys.argv[3]+': '+strerror) - else: - f.close() - - # dump the result to stdout - sys.stdout.write(make_ctocpp_class_impl(header, sys.argv[2], data)) diff --git a/cef1/tools/make_distrib.bat b/cef1/tools/make_distrib.bat deleted file mode 100644 index b6663905d..000000000 --- a/cef1/tools/make_distrib.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -..\..\third_party\python_26\python.exe make_distrib.py --output-dir ..\binary_distrib\ %* diff --git a/cef1/tools/make_distrib.py b/cef1/tools/make_distrib.py deleted file mode 100644 index d348acb2a..000000000 --- a/cef1/tools/make_distrib.py +++ /dev/null @@ -1,662 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from date_util import * -from file_util import * -from gclient_util import * -from optparse import OptionParser -import os -import re -import shlex -import subprocess -from svn_util import * -import sys -import zipfile - -def create_archive(input_dir, zip_file): - """ Creates a zip archive of the specified input directory. """ - zf = zipfile.ZipFile(zip_file, 'w', zipfile.ZIP_DEFLATED) - def addDir(dir): - for f in os.listdir(dir): - full_path = os.path.join(dir, f) - if os.path.isdir(full_path): - addDir(full_path) - else: - zf.write(full_path, os.path.relpath(full_path, \ - os.path.join(input_dir, os.pardir))) - addDir(input_dir) - zf.close() - -def create_output_dir(name, parent_dir): - """ Creates an output directory and adds the path to the archive list. """ - output_dir = os.path.abspath(os.path.join(parent_dir, name)) - remove_dir(output_dir, options.quiet) - make_dir(output_dir, options.quiet) - archive_dirs.append(output_dir) - return output_dir - -def get_readme_component(name): - """ Loads a README file component. """ - paths = [] - # platform directory - if platform == 'windows': - platform_cmp = 'win' - elif platform == 'macosx': - platform_cmp = 'mac' - elif platform == 'linux': - platform_cmp = 'linux' - paths.append(os.path.join(script_dir, 'distrib', platform_cmp)) - - # shared directory - paths.append(os.path.join(script_dir, 'distrib')) - - # load the file if it exists - for path in paths: - file = os.path.join(path, 'README.' +name + '.txt') - if path_exists(file): - return read_file(file) - - raise Exception('Readme component not found: ' + name) - -def create_readme(): - """ Creates the README.TXT file. """ - # gather the components - header_data = get_readme_component('header') - mode_data = get_readme_component(mode) - redistrib_data = get_readme_component('redistrib') - footer_data = get_readme_component('footer') - - # format the file - data = header_data + '\n\n' + mode_data + '\n\n' + redistrib_data + '\n\n' + footer_data - data = data.replace('$CEF_URL$', cef_url) - data = data.replace('$CEF_REV$', cef_rev) - data = data.replace('$CEF_VER$', cef_ver) - data = data.replace('$CHROMIUM_URL$', chromium_url) - data = data.replace('$CHROMIUM_REV$', chromium_rev) - data = data.replace('$CHROMIUM_VER$', chromium_ver) - data = data.replace('$DATE$', date) - - if platform == 'windows': - platform_str = 'Windows' - elif platform == 'macosx': - platform_str = 'Mac OS-X' - elif platform == 'linux': - platform_str = 'Linux' - - data = data.replace('$PLATFORM$', platform_str) - - if mode == 'standard': - distrib_type = 'Standard' - distrib_desc = 'This distribution contains all components necessary to build and distribute an\n' \ - 'application using CEF on the ' + platform_str + ' platform. Please see the LICENSING\n' \ - 'section of this document for licensing terms and conditions.' - elif mode == 'minimal': - distrib_type = 'Minimal' - distrib_desc = 'This distribution contains only the components required to distribute an\n' \ - 'application using CEF on the ' + platform_str + ' platform. Please see the LICENSING\n' \ - 'section of this document for licensing terms and conditions.' - elif mode == 'client': - distrib_type = 'Client' - distrib_desc = 'This distribution contains a release build of the cefclient sample application\n' \ - 'for the ' + platform_str + ' platform. Please see the LICENSING section of this document for\n' \ - 'licensing terms and conditions.' - - data = data.replace('$DISTRIB_TYPE$', distrib_type) - data = data.replace('$DISTRIB_DESC$', distrib_desc) - - write_file(os.path.join(output_dir, 'README.txt'), data) - if not options.quiet: - sys.stdout.write('Creating README.TXT file.\n') - -def eval_file(src): - """ Loads and evaluates the contents of the specified file. """ - return eval(read_file(src), {'__builtins__': None}, None) - -def transfer_gypi_files(src_dir, gypi_paths, gypi_path_prefix, dst_dir, quiet): - """ Transfer files from one location to another. """ - for path in gypi_paths: - # skip gyp includes - if path[:2] == '<@': - continue - src = os.path.join(src_dir, path) - dst = os.path.join(dst_dir, path.replace(gypi_path_prefix, '')) - dst_path = os.path.dirname(dst) - make_dir(dst_path, quiet) - copy_file(src, dst, quiet) - -def normalize_headers(file, new_path = ''): - """ Normalize headers post-processing. Remove the path component from any - project include directives. """ - data = read_file(file) - data = re.sub(r'''#include \"(?!include\/)[a-zA-Z0-9_\/]+\/+([a-zA-Z0-9_\.]+)\"''', \ - "// Include path modified for CEF Binary Distribution.\n#include \""+new_path+"\\1\"", data) - write_file(file, data) - -def transfer_files(cef_dir, script_dir, transfer_cfg, output_dir, quiet): - """ Transfer files based on the specified configuration. """ - if not path_exists(transfer_cfg): - return - - configs = eval_file(transfer_cfg) - for cfg in configs: - dst = os.path.join(output_dir, cfg['target']) - - # perform a copy if source is specified - if not cfg['source'] is None: - src = os.path.join(cef_dir, cfg['source']) - dst_path = os.path.dirname(dst) - make_dir(dst_path, quiet) - copy_file(src, dst, quiet) - - # place a readme file in the destination directory - readme = os.path.join(dst_path, 'README-TRANSFER.txt') - if not path_exists(readme): - copy_file(os.path.join(script_dir, 'distrib/README-TRANSFER.txt'), readme) - open(readme, 'ab').write(cfg['source']+"\n") - - # perform any required post-processing - if 'post-process' in cfg: - post = cfg['post-process'] - if post == 'normalize_headers': - new_path = '' - if cfg.has_key('new_header_path'): - new_path = cfg['new_header_path'] - normalize_headers(dst, new_path) - -def generate_msvs_projects(version): - """ Generate MSVS projects for the specified version. """ - sys.stdout.write('Generating '+version+' project files...') - os.environ['GYP_GENERATORS'] = 'msvs' - os.environ['GYP_MSVS_VERSION'] = version - gyper = [ 'python', 'tools/gyp_cef', os.path.relpath(os.path.join(output_dir, 'cefclient.gyp'), cef_dir) ] - RunAction(cef_dir, gyper); - move_file(os.path.relpath(os.path.join(output_dir, 'cefclient.sln')), \ - os.path.relpath(os.path.join(output_dir, 'cefclient'+version+'.sln'))) - -def create_msvs_projects(): - """ Create MSVS project files. """ - generate_msvs_projects('2005'); - generate_msvs_projects('2008'); - generate_msvs_projects('2010'); - - # Fix the output directory path in all .vcproj and .vcxproj files. - files = [] - for file in get_files(os.path.join(output_dir, '*.vcproj')): - files.append(file) - for file in get_files(os.path.join(output_dir, '*.vcxproj')): - files.append(file) - for file in files: - data = read_file(file) - # fix the build directory path - data = data.replace('../../..\\build\\', 'out\\') - data = data.replace('..\\..\\..\\build\\', 'out\\') - # fix xcopy arguments - data = data.replace('xcopy \\', 'xcopy /') - write_file(file, data) - -def create_xcode_projects(): - """ Create Xcode project files. """ - sys.stdout.write('Generating Xcode project files...') - os.environ['GYP_GENERATORS'] = 'xcode' - gyper = [ 'python', 'tools/gyp_cef', os.path.relpath(os.path.join(output_dir, 'cefclient.gyp'), cef_dir) ] - RunAction(cef_dir, gyper); - - # Post-process the Xcode project to fix file paths - src_file = os.path.join(output_dir, 'cefclient.xcodeproj/project.pbxproj') - data = read_file(src_file) - data = data.replace('../../../build/mac/', 'tools/') - data = data.replace('../../../build', 'build') - data = data.replace('../../../xcodebuild', 'xcodebuild') - write_file(src_file, data) - -def create_make_projects(): - """ Create make project files. """ - makefile = os.path.join(src_dir, 'Makefile') - makefile_tmp = '' - if path_exists(makefile): - # Back up the existing Makefile - makefile_tmp = makefile + '.cef_bak' - copy_file(makefile, makefile_tmp, options.quiet) - - # Generate make project files - sys.stdout.write('Generating make project files...') - os.environ['GYP_GENERATORS'] = 'make' - gyper = [ 'python', 'tools/gyp_cef', os.path.relpath(os.path.join(output_dir, 'cefclient.gyp'), cef_dir) ] - RunAction(cef_dir, gyper); - - # Copy the resulting Makefile to the destination directory - copy_file(makefile, output_dir, options.quiet) - - remove_file(makefile, options.quiet) - if makefile_tmp != '': - # Restore the original Makefile - move_file(makefile_tmp, makefile, options.quiet) - - # Fix the output directory path in Makefile and all .mk files. - find = os.path.relpath(output_dir, src_dir) - files = [os.path.join(output_dir, 'Makefile')] - for file in get_files(os.path.join(output_dir, '*.mk')): - files.append(file) - for file in files: - data = read_file(file) - data = data.replace(find, '.') - data = data.replace('/./', '/') - if os.path.basename(file) == 'Makefile': - # remove the quiet_cmd_regen_makefile section - pos = str.find(data, 'quiet_cmd_regen_makefile') - if pos >= 0: - epos = str.find(data, '#', pos) - if epos >= 0: - data = data[0:pos] + data[epos:] - write_file(file, data) - -def run(command_line, working_dir): - """ Run a command. """ - sys.stdout.write('-------- Running "'+command_line+'" in "'+\ - working_dir+'"...'+"\n") - args = shlex.split(command_line.replace('\\', '\\\\')) - return subprocess.check_call(args, cwd=working_dir, env=os.environ, - shell=(sys.platform == 'win32')) - -# cannot be loaded as a module -if __name__ != "__main__": - sys.stderr.write('This file cannot be loaded as a module!') - sys.exit() - -# parse command-line options -disc = """ -This utility builds the CEF Binary Distribution. -""" - -parser = OptionParser(description=disc) -parser.add_option('--output-dir', dest='outputdir', metavar='DIR', - help='output directory [required]') -parser.add_option('--allow-partial', - action='store_true', dest='allowpartial', default=False, - help='allow creation of partial distributions') -parser.add_option('--no-symbols', - action='store_true', dest='nosymbols', default=False, - help='don\'t create symbol files') -parser.add_option('--no-docs', - action='store_true', dest='nodocs', default=False, - help='don\'t create documentation') -parser.add_option('--no-archive', - action='store_true', dest='noarchive', default=False, - help='don\'t create archives for output directories') -parser.add_option('--ninja-build', - action='store_true', dest='ninjabuild', default=False, - help='build was created using ninja') -parser.add_option('--minimal', - action='store_true', dest='minimal', default=False, - help='include only release build binary files') -parser.add_option('--client', - action='store_true', dest='client', default=False, - help='include only the cefclient application') -parser.add_option('-q', '--quiet', - action='store_true', dest='quiet', default=False, - help='do not output detailed status information') -(options, args) = parser.parse_args() - -# the outputdir option is required -if options.outputdir is None: - parser.print_help(sys.stderr) - sys.exit() - -if options.minimal and options.client: - print 'Invalid combination of options' - parser.print_help(sys.stderr) - sys.exit() - -# script directory -script_dir = os.path.dirname(__file__) - -# CEF root directory -cef_dir = os.path.abspath(os.path.join(script_dir, os.pardir)) - -# src directory -src_dir = os.path.abspath(os.path.join(cef_dir, os.pardir)) - -# retrieve url, revision and date information -cef_info = get_svn_info(cef_dir) -cef_url = cef_info['url'] -cef_rev = cef_info['revision'] -chromium_info = get_svn_info(os.path.join(cef_dir, os.pardir)) -chromium_url = chromium_info['url'] -chromium_rev = chromium_info['revision'] -date = get_date() - -# Read and parse the version file (key=value pairs, one per line) -args = {} -read_version_file(os.path.join(cef_dir, 'VERSION'), args) -read_version_file(os.path.join(cef_dir, '../chrome/VERSION'), args) - -cef_ver = args['CEF_MAJOR']+'.'+args['BUILD']+'.'+cef_rev -chromium_ver = args['MAJOR']+'.'+args['MINOR']+'.'+args['BUILD']+'.'+args['PATCH'] - -# Test the operating system. -platform = ''; -if sys.platform == 'win32': - platform = 'windows' -elif sys.platform == 'darwin': - platform = 'macosx' -elif sys.platform.startswith('linux'): - platform = 'linux' - -# list of output directories to be archived -archive_dirs = [] - -# output directory -output_dir_base = 'cef_binary_' + cef_ver -output_dir_name = output_dir_base + '_' + platform - -if options.minimal: - mode = 'minimal' - output_dir_name = output_dir_name + '_minimal' -elif options.client: - mode = 'client' - output_dir_name = output_dir_name + '_client' -else: - mode = 'standard' - -output_dir = create_output_dir(output_dir_name, options.outputdir) - -# create the README.TXT file -create_readme() - -# transfer the LICENSE.txt file -copy_file(os.path.join(cef_dir, 'LICENSE.txt'), output_dir, options.quiet) - -# read the variables list from the autogenerated cef_paths.gypi file -cef_paths = eval_file(os.path.join(cef_dir, 'cef_paths.gypi')) -cef_paths = cef_paths['variables'] - -# read the variables list from the manually edited cef_paths2.gypi file -cef_paths2 = eval_file(os.path.join(cef_dir, 'cef_paths2.gypi')) -cef_paths2 = cef_paths2['variables'] - -if mode == 'standard': - # create the include directory - include_dir = os.path.join(output_dir, 'include') - make_dir(include_dir, options.quiet) - - # create the cefclient directory - cefclient_dir = os.path.join(output_dir, 'cefclient') - make_dir(cefclient_dir, options.quiet) - - # create the libcef_dll_wrapper directory - wrapper_dir = os.path.join(output_dir, 'libcef_dll') - make_dir(wrapper_dir, options.quiet) - - # transfer common include files - transfer_gypi_files(cef_dir, cef_paths2['includes_common'], \ - 'include/', include_dir, options.quiet) - transfer_gypi_files(cef_dir, cef_paths2['includes_capi'], \ - 'include/', include_dir, options.quiet) - transfer_gypi_files(cef_dir, cef_paths2['includes_wrapper'], \ - 'include/', include_dir, options.quiet) - transfer_gypi_files(cef_dir, cef_paths['autogen_cpp_includes'], \ - 'include/', include_dir, options.quiet) - transfer_gypi_files(cef_dir, cef_paths['autogen_capi_includes'], \ - 'include/', include_dir, options.quiet) - - # transfer common cefclient files - transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_common'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) - transfer_gypi_files(cef_dir, cef_paths2['cefclient_bundle_resources_common'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) - - # transfer common libcef_dll_wrapper files - transfer_gypi_files(cef_dir, cef_paths2['libcef_dll_wrapper_sources_common'], \ - 'libcef_dll/', wrapper_dir, options.quiet) - transfer_gypi_files(cef_dir, cef_paths['autogen_client_side'], \ - 'libcef_dll/', wrapper_dir, options.quiet) - - # transfer gyp files - copy_file(os.path.join(script_dir, 'distrib/cefclient.gyp'), output_dir, options.quiet) - paths_gypi = os.path.join(cef_dir, 'cef_paths2.gypi') - data = read_file(paths_gypi) - data = data.replace('tests/cefclient/', 'cefclient/') - write_file(os.path.join(output_dir, 'cef_paths2.gypi'), data) - copy_file(os.path.join(cef_dir, 'cef_paths.gypi'), \ - os.path.join(output_dir, 'cef_paths.gypi'), options.quiet) - - # transfer additional files - transfer_files(cef_dir, script_dir, os.path.join(script_dir, 'distrib/transfer.cfg'), \ - output_dir, options.quiet) - -if platform == 'windows': - if options.ninjabuild: - out_dir = os.path.join(src_dir, 'out') - libcef_dll_file = 'libcef.dll.lib' - else: - out_dir = cef_dir - libcef_dll_file = 'lib/libcef.lib' - - valid_build_dir = None - - if mode == 'standard': - # transfer Debug files - build_dir = os.path.join(out_dir, 'Debug'); - if not options.allowpartial or path_exists(os.path.join(build_dir, 'cefclient.exe')): - valid_build_dir = build_dir - dst_dir = os.path.join(output_dir, 'Debug') - make_dir(dst_dir, options.quiet) - copy_files(os.path.join(script_dir, 'distrib/win/*.dll'), dst_dir, options.quiet) - copy_files(os.path.join(build_dir, '*.dll'), dst_dir, options.quiet) - copy_file(os.path.join(build_dir, libcef_dll_file), os.path.join(dst_dir, 'libcef.lib'), \ - options.quiet) - - if not options.nosymbols: - # create the symbol output directory - symbol_output_dir = create_output_dir(output_dir_name + '_debug_symbols', options.outputdir) - # transfer contents - copy_file(os.path.join(build_dir, 'libcef.dll.pdb'), symbol_output_dir, options.quiet) - else: - sys.stderr.write("No Debug build files.\n") - - # transfer Release files - build_dir = os.path.join(out_dir, 'Release'); - if not options.allowpartial or path_exists(os.path.join(build_dir, 'cefclient.exe')): - valid_build_dir = build_dir - dst_dir = os.path.join(output_dir, 'Release') - make_dir(dst_dir, options.quiet) - copy_files(os.path.join(script_dir, 'distrib/win/*.dll'), dst_dir, options.quiet) - copy_files(os.path.join(build_dir, '*.dll'), dst_dir, options.quiet) - - if mode != 'client': - copy_file(os.path.join(build_dir, libcef_dll_file), os.path.join(dst_dir, 'libcef.lib'), \ - options.quiet) - else: - copy_file(os.path.join(build_dir, 'cefclient.exe'), dst_dir, options.quiet) - - if not options.nosymbols: - # create the symbol output directory - symbol_output_dir = create_output_dir(output_dir_name + '_release_symbols', options.outputdir) - # transfer contents - copy_file(os.path.join(build_dir, 'libcef.dll.pdb'), symbol_output_dir, options.quiet) - else: - sys.stderr.write("No Release build files.\n") - - if not valid_build_dir is None: - # transfer resource files - build_dir = valid_build_dir - if mode == 'client': - dst_dir = os.path.join(output_dir, 'Release') - else: - dst_dir = os.path.join(output_dir, 'Resources') - make_dir(dst_dir, options.quiet) - copy_file(os.path.join(build_dir, 'devtools_resources.pak'), dst_dir, options.quiet) - copy_dir(os.path.join(build_dir, 'locales'), os.path.join(dst_dir, 'locales'), options.quiet) - - if mode == 'standard': - # transfer include files - transfer_gypi_files(cef_dir, cef_paths2['includes_win'], \ - 'include/', include_dir, options.quiet) - - # transfer cefclient files - transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_win'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) - - # transfer additional files, if any - transfer_files(cef_dir, script_dir, os.path.join(script_dir, 'distrib/win/transfer.cfg'), \ - output_dir, options.quiet) - - create_msvs_projects() - - if not options.nodocs: - # generate doc files - os.popen('make_cppdocs.bat '+cef_rev) - - src_dir = os.path.join(cef_dir, 'docs') - if path_exists(src_dir): - # create the docs output directory - docs_output_dir = create_output_dir(output_dir_base + '_docs', options.outputdir) - # transfer contents - copy_dir(src_dir, docs_output_dir, options.quiet) - -elif platform == 'macosx': - if options.ninjabuild: - out_dir = os.path.join(src_dir, 'out') - else: - out_dir = os.path.join(src_dir, 'xcodebuild') - - valid_build_dir = None - - if mode == 'standard': - # transfer Debug files - build_dir = os.path.join(out_dir, 'Debug') - if not options.allowpartial or path_exists(os.path.join(build_dir, 'cefclient.app')): - valid_build_dir = build_dir - dst_dir = os.path.join(output_dir, 'Debug') - make_dir(dst_dir, options.quiet) - copy_file(os.path.join(build_dir, 'libcef.dylib'), dst_dir, options.quiet) - - # transfer Release files - build_dir = os.path.join(out_dir, 'Release') - if not options.allowpartial or path_exists(os.path.join(build_dir, 'cefclient.app')): - valid_build_dir = build_dir - dst_dir = os.path.join(output_dir, 'Release') - make_dir(dst_dir, options.quiet) - if mode != 'client': - copy_file(os.path.join(build_dir, 'libcef.dylib'), dst_dir, options.quiet) - else: - copy_dir(os.path.join(build_dir, 'cefclient.app'), os.path.join(dst_dir, 'cefclient.app'), options.quiet) - - if not options.nosymbols: - # create the symbol output directory - symbol_output_dir = create_output_dir(output_dir_name + '_release_symbols', options.outputdir) - - # create the real dSYM file from the "fake" dSYM file - sys.stdout.write("Creating the real dSYM file...\n") - src_path = os.path.join(build_dir, 'libcef.dylib.dSYM/Contents/Resources/DWARF/libcef.dylib') - dst_path = os.path.join(symbol_output_dir, 'libcef.dylib.dSYM') - run('dsymutil '+src_path+' -o '+dst_path, cef_dir) - - if not valid_build_dir is None and mode != 'client': - # transfer resource files - build_dir = valid_build_dir - dst_dir = os.path.join(output_dir, 'Resources') - make_dir(dst_dir, options.quiet) - copy_files(os.path.join(cef_dir, '../third_party/WebKit/Source/WebCore/Resources/*.*'), dst_dir, options.quiet) - copy_file(os.path.join(build_dir, 'cefclient.app/Contents/Resources/chrome.pak'), dst_dir, options.quiet) - copy_file(os.path.join(build_dir, 'cefclient.app/Contents/Resources/devtools_resources.pak'), dst_dir, options.quiet) - copy_files(os.path.join(build_dir, 'cefclient.app/Contents/Resources/*.lproj'), dst_dir, options.quiet) - remove_dir(os.path.join(dst_dir, 'English.lproj')) - - if mode == 'standard': - # transfer include files - transfer_gypi_files(cef_dir, cef_paths2['includes_mac'], \ - 'include/', include_dir, options.quiet) - - # transfer cefclient files - transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_mac'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) - transfer_gypi_files(cef_dir, cef_paths2['cefclient_bundle_resources_mac'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) - - # transfer cefclient/mac files - copy_dir(os.path.join(cef_dir, 'tests/cefclient/mac/'), os.path.join(output_dir, 'cefclient/mac/'), \ - options.quiet) - - # transfer additional files, if any - transfer_files(cef_dir, script_dir, os.path.join(script_dir, 'distrib/mac/transfer.cfg'), \ - output_dir, options.quiet) - - create_xcode_projects() - -elif platform == 'linux': - out_dir = os.path.join(src_dir, 'out') - if options.ninjabuild: - lib_dir_name = 'lib' - else: - lib_dir_name = 'lib.target' - - valid_build_dir = None - - if mode == 'standard': - # transfer Debug files - build_dir = os.path.join(out_dir, 'Debug'); - if not options.allowpartial or path_exists(os.path.join(build_dir, 'cefclient')): - valid_build_dir = build_dir - dst_dir = os.path.join(output_dir, 'Debug') - make_dir(dst_dir, options.quiet) - copy_file(os.path.join(build_dir, lib_dir_name, 'libcef.so'), dst_dir, options.quiet) - else: - sys.stderr.write("No Debug build files.\n") - - # transfer Release files - build_dir = os.path.join(out_dir, 'Release'); - if not options.allowpartial or path_exists(os.path.join(build_dir, 'cefclient')): - valid_build_dir = build_dir - dst_dir = os.path.join(output_dir, 'Release') - make_dir(dst_dir, options.quiet) - - if mode == 'client': - lib_dst_dir = os.path.join(dst_dir, lib_dir_name) - make_dir(lib_dst_dir, options.quiet) - copy_file(os.path.join(build_dir, lib_dir_name, 'libcef.so'), lib_dst_dir, options.quiet) - copy_file(os.path.join(build_dir, 'cefclient'), dst_dir, options.quiet) - else: - copy_file(os.path.join(build_dir, lib_dir_name, 'libcef.so'), dst_dir, options.quiet) - else: - sys.stderr.write("No Release build files.\n") - - if not valid_build_dir is None: - # transfer resource files - build_dir = valid_build_dir - if mode == 'client': - dst_dir = os.path.join(output_dir, 'Release') - copy_dir(os.path.join(build_dir, 'files'), os.path.join(dst_dir, 'files'), options.quiet) - else: - dst_dir = os.path.join(output_dir, 'Resources') - make_dir(dst_dir, options.quiet) - copy_file(os.path.join(build_dir, 'chrome.pak'), dst_dir, options.quiet) - copy_file(os.path.join(build_dir, 'devtools_resources.pak'), dst_dir, options.quiet) - copy_dir(os.path.join(build_dir, 'locales'), os.path.join(dst_dir, 'locales'), options.quiet) - - if mode == 'standard': - # transfer include files - transfer_gypi_files(cef_dir, cef_paths2['includes_linux'], \ - 'include/', include_dir, options.quiet) - - # transfer cefclient files - transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_linux'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) - transfer_gypi_files(cef_dir, cef_paths2['cefclient_bundle_resources_linux'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) - - # transfer additional files, if any - copy_file(os.path.join(script_dir, 'distrib/linux/build.sh'), output_dir, options.quiet) - transfer_files(cef_dir, script_dir, os.path.join(script_dir, 'distrib/linux/transfer.cfg'), \ - output_dir, options.quiet) - - create_make_projects() - -if not options.noarchive: - # create an archive for each output directory - for dir in archive_dirs: - zip_file = os.path.split(dir)[1] + '.zip' - if not options.quiet: - sys.stdout.write('Creating '+zip_file+"...\n") - create_archive(dir, os.path.join(dir, os.pardir, zip_file)) diff --git a/cef1/tools/make_distrib.sh b/cef1/tools/make_distrib.sh deleted file mode 100755 index 273a3e16b..000000000 --- a/cef1/tools/make_distrib.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -python make_distrib.py --output-dir ../binary_distrib/ $@ diff --git a/cef1/tools/make_gypi_file.py b/cef1/tools/make_gypi_file.py deleted file mode 100644 index e5cefd7a9..000000000 --- a/cef1/tools/make_gypi_file.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from cef_parser import * - -def make_gypi_file(header): - # header string - result = \ -"""# Copyright (c) $YEAR$ The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. -# -# --------------------------------------------------------------------------- -# -# This file was generated by the CEF translator tool and should not edited -# by hand. See the translator.README.txt file in the tools directory for -# more information. -# - -{ - 'variables': { -""" - - filenames = sorted(header.get_file_names()) - - # cpp includes - result += " 'autogen_cpp_includes': [\n" - for filename in filenames: - result += " 'include/"+filename+"',\n" - result += " ],\n" - - # capi includes - result += " 'autogen_capi_includes': [\n" - for filename in filenames: - result += " 'include/capi/"+get_capi_file_name(filename)+"',\n" - result += " ],\n" - - classes = sorted(header.get_class_names()) - - # library side includes - result += " 'autogen_library_side': [\n" - for clsname in classes: - cls = header.get_class(clsname) - filename = get_capi_name(clsname[3:], False) - if cls.is_library_side(): - result += " 'libcef_dll/cpptoc/"+filename+"_cpptoc.cc',\n" \ - " 'libcef_dll/cpptoc/"+filename+"_cpptoc.h',\n" - else: - result += " 'libcef_dll/ctocpp/"+filename+"_ctocpp.cc',\n" \ - " 'libcef_dll/ctocpp/"+filename+"_ctocpp.h',\n" - result += " ],\n" - - # client side includes - result += " 'autogen_client_side': [\n" - for clsname in classes: - cls = header.get_class(clsname) - filename = get_capi_name(clsname[3:], False) - if cls.is_library_side(): - result += " 'libcef_dll/ctocpp/"+filename+"_ctocpp.cc',\n" \ - " 'libcef_dll/ctocpp/"+filename+"_ctocpp.h',\n" - else: - result += " 'libcef_dll/cpptoc/"+filename+"_cpptoc.cc',\n" \ - " 'libcef_dll/cpptoc/"+filename+"_cpptoc.h',\n" - result += " ],\n" - - # footer string - result += \ -""" }, -} -""" - - # add the copyright year - result = result.replace('$YEAR$', get_year()) - - return result - -def write_gypi_file(header, file, backup): - if path_exists(file): - oldcontents = read_file(file) - else: - oldcontents = '' - - newcontents = make_gypi_file(header) - if newcontents != oldcontents: - if backup and oldcontents != '': - backup_file(file) - write_file(file, newcontents) - return True - - return False - - -# test the module -if __name__ == "__main__": - import sys - - # verify that the correct number of command-line arguments are provided - if len(sys.argv) < 2: - sys.stderr.write('Usage: '+sys.argv[0]+' ') - sys.exit() - - # create the header object - header = obj_header() - header.add_file(sys.argv[1]) - - # dump the result to stdout - sys.stdout.write(make_gypi_file(header)) diff --git a/cef1/tools/make_version_header.bat b/cef1/tools/make_version_header.bat deleted file mode 100644 index 03337156f..000000000 --- a/cef1/tools/make_version_header.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -..\third_party\python_26\python.exe tools\make_version_header.py --header include\cef_version.h --version ../chrome/VERSION diff --git a/cef1/tools/make_version_header.py b/cef1/tools/make_version_header.py deleted file mode 100644 index 0158a8cd6..000000000 --- a/cef1/tools/make_version_header.py +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights -# reserved. Use of this source code is governed by a BSD-style license that -# can be found in the LICENSE file. - -from date_util import * -from file_util import * -from optparse import OptionParser -import svn_util as svn -import git_util as git -import sys - -# cannot be loaded as a module -if __name__ != "__main__": - sys.stderr.write('This file cannot be loaded as a module!') - sys.exit() - - -# parse command-line options -disc = """ -This utility creates the version header file. -""" - -parser = OptionParser(description=disc) -parser.add_option('--header', dest='header', metavar='FILE', - help='output version header file [required]') -parser.add_option('--version', dest='version', metavar='FILE', - help='input Chrome version config file [required]') -parser.add_option('-q', '--quiet', - action='store_true', dest='quiet', default=False, - help='do not output detailed status information') -(options, args) = parser.parse_args() - -# the header option is required -if options.header is None or options.version is None: - parser.print_help(sys.stdout) - sys.exit() - -def write_svn_header(header, version): - """ Creates the header file for the current revision and Chrome version information - if the information has changed or if the file doesn't already exist. """ - - if not path_exists(version): - raise Exception('Version file '+version+' does not exist.') - - # Read and parse the version file (key=value pairs, one per line) - chrome = {} - lines = read_file(version).split("\n") - for line in lines: - parts = line.split('=', 1) - if len(parts) == 2: - chrome[parts[0]] = parts[1] - - if path_exists(header): - oldcontents = read_file(header) - else: - oldcontents = '' - - year = get_year() - - try: - revision = svn.get_revision() - except: - revision = git.get_svn_revision() - - newcontents = '// Copyright (c) '+year+' Marshall A. Greenblatt. All rights reserved.\n'+\ - '//\n'+\ - '// Redistribution and use in source and binary forms, with or without\n'+\ - '// modification, are permitted provided that the following conditions are\n'+\ - '// met:\n'+\ - '//\n'+\ - '// * Redistributions of source code must retain the above copyright\n'+\ - '// notice, this list of conditions and the following disclaimer.\n'+\ - '// * Redistributions in binary form must reproduce the above\n'+\ - '// copyright notice, this list of conditions and the following disclaimer\n'+\ - '// in the documentation and/or other materials provided with the\n'+\ - '// distribution.\n'+\ - '// * Neither the name of Google Inc. nor the name Chromium Embedded\n'+\ - '// Framework nor the names of its contributors may be used to endorse\n'+\ - '// or promote products derived from this software without specific prior\n'+\ - '// written permission.\n'+\ - '//\n'+\ - '// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n'+\ - '// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n'+\ - '// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n'+\ - '// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n'+\ - '// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n'+\ - '// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n'+\ - '// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n'+\ - '// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n'+\ - '// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n'+\ - '// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n'+\ - '// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n'+\ - '//\n'+\ - '// ---------------------------------------------------------------------------\n'+\ - '//\n'+\ - '// This file is generated by the make_version_header.py tool.\n'+\ - '//\n\n'+\ - '#ifndef CEF_INCLUDE_CEF_VERSION_H_\n'+\ - '#define CEF_INCLUDE_CEF_VERSION_H_\n\n'+\ - '#define CEF_REVISION ' + revision + '\n'+\ - '#define COPYRIGHT_YEAR ' + year + '\n\n'+\ - '#define CHROME_VERSION_MAJOR ' + chrome['MAJOR'] + '\n'+\ - '#define CHROME_VERSION_MINOR ' + chrome['MINOR'] + '\n'+\ - '#define CHROME_VERSION_BUILD ' + chrome['BUILD'] + '\n'+\ - '#define CHROME_VERSION_PATCH ' + chrome['PATCH'] + '\n\n'+\ - '#define DO_MAKE_STRING(p) #p\n'+\ - '#define MAKE_STRING(p) DO_MAKE_STRING(p)\n\n'+\ - '#ifndef APSTUDIO_HIDDEN_SYMBOLS\n\n'\ - '#ifdef __cplusplus\n'+\ - 'extern "C" {\n'+\ - '#endif\n\n'+\ - '#include "internal/cef_export.h"\n\n'+\ - '///\n'+\ - '// Returns the CEF build revision of the libcef library.\n'+\ - '///\n'+\ - 'CEF_EXPORT int cef_build_revision();\n\n'+\ - '#ifdef __cplusplus\n'+\ - '}\n'+\ - '#endif\n\n'+\ - '#endif // APSTUDIO_HIDDEN_SYMBOLS\n\n'+\ - '#endif // CEF_INCLUDE_CEF_VERSION_H_\n' - if newcontents != oldcontents: - write_file(header, newcontents) - return True - - return False - -written = write_svn_header(options.header, options.version) -if not options.quiet: - if written: - sys.stdout.write('File '+options.header+' updated.\n') - else: - sys.stdout.write('File '+options.header+' is already up to date.\n') diff --git a/cef1/tools/patch.bat b/cef1/tools/patch.bat deleted file mode 100644 index b21981a0d..000000000 --- a/cef1/tools/patch.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -..\third_party\python_26\python.exe tools\patcher.py --patch-config patch/patch.cfg \ No newline at end of file diff --git a/cef1/tools/patch.sh b/cef1/tools/patch.sh deleted file mode 100755 index b9dde9bc0..000000000 --- a/cef1/tools/patch.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -python tools/patcher.py --patch-config patch/patch.cfg diff --git a/cef1/tools/patch_util.py b/cef1/tools/patch_util.py deleted file mode 100644 index 990b81f32..000000000 --- a/cef1/tools/patch_util.py +++ /dev/null @@ -1,560 +0,0 @@ -""" Patch utility to apply unified diffs """ -""" Brute-force line-by-line parsing - - Project home: http://code.google.com/p/python-patch/ - - This file is subject to the MIT license available here: - http://www.opensource.org/licenses/mit-license.php - - CEF Changes - ----------- - - 2009/07/22 - - Add a 'root_directory' argument to PatchInfo::apply - - Fix a Python 2.4 compile error in PatchInfo::parse_stream - -""" - -__author__ = "techtonik.rainforce.org" -__version__ = "8.12-1" - -import copy -import logging -import os -import re -from stat import * -# cStringIO doesn't support unicode in 2.5 -from StringIO import StringIO -from logging import debug, info, warning - -from os.path import exists, isfile -from os import unlink - -debugmode = False - - -def from_file(filename): - """ read and parse patch file - return PatchInfo() object - """ - - info("reading patch from file %s" % filename) - fp = open(filename, "rb") - patch = PatchInfo(fp) - fp.close() - return patch - - -def from_string(s): - """ parse text string and return PatchInfo() object """ - return PatchInfo( - StringIO.StringIO(s) - ) - - -class HunkInfo(object): - """ parsed hunk data (hunk starts with @@ -R +R @@) """ - - def __init__(self): - # define HunkInfo data members - self.startsrc=None - self.linessrc=None - self.starttgt=None - self.linestgt=None - self.invalid=False - self.text=[] - - def copy(self): - return copy.copy(self) - -# def apply(self, estream): -# """ write hunk data into enumerable stream -# return strings one by one until hunk is -# over -# -# enumerable stream are tuples (lineno, line) -# where lineno starts with 0 -# """ -# pass - - - - -class PatchInfo(object): - """ patch information container """ - - def __init__(self, stream=None): - """ parse incoming stream """ - - # define PatchInfo data members - # table with a row for every source file - - #: list of source filenames - self.source=None - self.target=None - #: list of lists of hunks - self.hunks=None - #: file endings statistics for every hunk - self.hunkends=None - - if stream: - self.parse_stream(stream) - - def copy(self): - return copy.copy(self) - - def parse_stream(self, stream): - """ parse unified diff """ - self.source = [] - self.target = [] - self.hunks = [] - self.hunkends = [] - - # define possible file regions that will direct the parser flow - header = False # comments before the patch body - filenames = False # lines starting with --- and +++ - - hunkhead = False # @@ -R +R @@ sequence - hunkbody = False # - hunkskip = False # skipping invalid hunk mode - - header = True - lineends = dict(lf=0, crlf=0, cr=0) - nextfileno = 0 - nexthunkno = 0 #: even if index starts with 0 user messages number hunks from 1 - - # hunkinfo holds parsed values, hunkactual - calculated - hunkinfo = HunkInfo() - hunkactual = dict(linessrc=None, linestgt=None) - - fe = enumerate(stream) - for lineno, line in fe: - - # analyze state - if header and line.startswith("--- "): - header = False - # switch to filenames state - filenames = True - #: skip hunkskip and hunkbody code until you read definition of hunkhead - if hunkbody: - # process line first - if re.match(r"^[- \+\\]", line): - # gather stats about line endings - if line.endswith("\r\n"): - self.hunkends[nextfileno-1]["crlf"] += 1 - elif line.endswith("\n"): - self.hunkends[nextfileno-1]["lf"] += 1 - elif line.endswith("\r"): - self.hunkends[nextfileno-1]["cr"] += 1 - - if line.startswith("-"): - hunkactual["linessrc"] += 1 - elif line.startswith("+"): - hunkactual["linestgt"] += 1 - elif not line.startswith("\\"): - hunkactual["linessrc"] += 1 - hunkactual["linestgt"] += 1 - hunkinfo.text.append(line) - # todo: handle \ No newline cases - else: - warning("invalid hunk no.%d at %d for target file %s" % (nexthunkno, lineno+1, self.target[nextfileno-1])) - # add hunk status node - self.hunks[nextfileno-1].append(hunkinfo.copy()) - self.hunks[nextfileno-1][nexthunkno-1]["invalid"] = True - # switch to hunkskip state - hunkbody = False - hunkskip = True - - # check exit conditions - if hunkactual["linessrc"] > hunkinfo.linessrc or hunkactual["linestgt"] > hunkinfo.linestgt: - warning("extra hunk no.%d lines at %d for target %s" % (nexthunkno, lineno+1, self.target[nextfileno-1])) - # add hunk status node - self.hunks[nextfileno-1].append(hunkinfo.copy()) - self.hunks[nextfileno-1][nexthunkno-1]["invalid"] = True - # switch to hunkskip state - hunkbody = False - hunkskip = True - elif hunkinfo.linessrc == hunkactual["linessrc"] and hunkinfo.linestgt == hunkactual["linestgt"]: - self.hunks[nextfileno-1].append(hunkinfo.copy()) - # switch to hunkskip state - hunkbody = False - hunkskip = True - - # detect mixed window/unix line ends - ends = self.hunkends[nextfileno-1] - if ((ends["cr"]!=0) + (ends["crlf"]!=0) + (ends["lf"]!=0)) > 1: - warning("inconsistent line ends in patch hunks for %s" % self.source[nextfileno-1]) - if debugmode: - debuglines = dict(ends) - debuglines.update(file=self.target[nextfileno-1], hunk=nexthunkno) - debug("crlf: %(crlf)d lf: %(lf)d cr: %(cr)d\t - file: %(file)s hunk: %(hunk)d" % debuglines) - - if hunkskip: - match = re.match("^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))?", line) - if match: - # switch to hunkhead state - hunkskip = False - hunkhead = True - elif line.startswith("--- "): - # switch to filenames state - hunkskip = False - filenames = True - if debugmode and len(self.source) > 0: - debug("- %2d hunks for %s" % (len(self.hunks[nextfileno-1]), self.source[nextfileno-1])) - - if filenames: - if line.startswith("--- "): - if nextfileno in self.source: - warning("skipping invalid patch for %s" % self.source[nextfileno]) - del self.source[nextfileno] - # double source filename line is encountered - # attempt to restart from this second line - re_filename = "^--- ([^\t]+)" - match = re.match(re_filename, line) - if not match: - warning("skipping invalid filename at line %d" % lineno) - # switch back to header state - filenames = False - header = True - else: - self.source.append(match.group(1)) - elif not line.startswith("+++ "): - if nextfileno in self.source: - warning("skipping invalid patch with no target for %s" % self.source[nextfileno]) - del self.source[nextfileno] - else: - # this should be unreachable - warning("skipping invalid target patch") - filenames = False - header = True - else: - if nextfileno in self.target: - warning("skipping invalid patch - double target at line %d" % lineno) - del self.source[nextfileno] - del self.target[nextfileno] - nextfileno -= 1 - # double target filename line is encountered - # switch back to header state - filenames = False - header = True - else: - re_filename = "^\+\+\+ ([^\t]+)" - match = re.match(re_filename, line) - if not match: - warning("skipping invalid patch - no target filename at line %d" % lineno) - # switch back to header state - filenames = False - header = True - else: - self.target.append(match.group(1)) - nextfileno += 1 - # switch to hunkhead state - filenames = False - hunkhead = True - nexthunkno = 0 - self.hunks.append([]) - self.hunkends.append(lineends.copy()) - continue - - - if hunkhead: - match = re.match("^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))?", line) - if not match: - if nextfileno-1 not in self.hunks: - warning("skipping invalid patch with no hunks for file %s" % self.target[nextfileno-1]) - # switch to header state - hunkhead = False - header = True - continue - else: - # switch to header state - hunkhead = False - header = True - else: - hunkinfo.startsrc = int(match.group(1)) - if match.group(3): - hunkinfo.linessrc = int(match.group(3)) - else: - hunkinfo.linessrc = 1 - hunkinfo.starttgt = int(match.group(4)) - if match.group(6): - hunkinfo.linestgt = int(match.group(6)) - else: - hunkinfo.linestgt = 1 - hunkinfo.invalid = False - hunkinfo.text = [] - - hunkactual["linessrc"] = hunkactual["linestgt"] = 0 - - # switch to hunkbody state - hunkhead = False - hunkbody = True - nexthunkno += 1 - continue - else: - if not hunkskip: - warning("patch file incomplete - %s" % filename) - # sys.exit(?) - else: - # duplicated message when an eof is reached - if debugmode and len(self.source) > 0: - debug("- %2d hunks for %s" % (len(self.hunks[nextfileno-1]), self.source[nextfileno-1])) - - info("total files: %d total hunks: %d" % (len(self.source), sum(len(hset) for hset in self.hunks))) - - def apply(self, root_directory = None): - """ apply parsed patch """ - - total = len(self.source) - for fileno, filename in enumerate(self.source): - - f2patch = filename - if not root_directory is None: - f2patch = root_directory + f2patch - if not exists(f2patch): - f2patch = self.target[fileno] - if not exists(f2patch): - warning("source/target file does not exist\n--- %s\n+++ %s" % (filename, f2patch)) - continue - if not isfile(f2patch): - warning("not a file - %s" % f2patch) - continue - filename = f2patch - - info("processing %d/%d:\t %s" % (fileno+1, total, filename)) - - # validate before patching - f2fp = open(filename) - hunkno = 0 - hunk = self.hunks[fileno][hunkno] - hunkfind = [] - hunkreplace = [] - validhunks = 0 - canpatch = False - for lineno, line in enumerate(f2fp): - if lineno+1 < hunk.startsrc: - continue - elif lineno+1 == hunk.startsrc: - hunkfind = [x[1:].rstrip("\r\n") for x in hunk.text if x[0] in " -"] - hunkreplace = [x[1:].rstrip("\r\n") for x in hunk.text if x[0] in " +"] - #pprint(hunkreplace) - hunklineno = 0 - - # todo \ No newline at end of file - - # check hunks in source file - if lineno+1 < hunk.startsrc+len(hunkfind)-1: - if line.rstrip("\r\n") == hunkfind[hunklineno]: - hunklineno+=1 - else: - debug("hunk no.%d doesn't match source file %s" % (hunkno+1, filename)) - # file may be already patched, but we will check other hunks anyway - hunkno += 1 - if hunkno < len(self.hunks[fileno]): - hunk = self.hunks[fileno][hunkno] - continue - else: - break - - # check if processed line is the last line - if lineno+1 == hunk.startsrc+len(hunkfind)-1: - debug("file %s hunk no.%d -- is ready to be patched" % (filename, hunkno+1)) - hunkno+=1 - validhunks+=1 - if hunkno < len(self.hunks[fileno]): - hunk = self.hunks[fileno][hunkno] - else: - if validhunks == len(self.hunks[fileno]): - # patch file - canpatch = True - break - else: - if hunkno < len(self.hunks[fileno]): - warning("premature end of source file %s at hunk %d" % (filename, hunkno+1)) - - f2fp.close() - - if validhunks < len(self.hunks[fileno]): - if check_patched(filename, self.hunks[fileno]): - warning("already patched %s" % filename) - else: - warning("source file is different - %s" % filename) - if canpatch: - backupname = filename+".orig" - if exists(backupname): - warning("can't backup original file to %s - aborting" % backupname) - else: - import shutil - shutil.move(filename, backupname) - if patch_hunks(backupname, filename, self.hunks[fileno]): - warning("successfully patched %s" % filename) - unlink(backupname) - else: - warning("error patching file %s" % filename) - shutil.copy(filename, filename+".invalid") - warning("invalid version is saved to %s" % filename+".invalid") - # todo: proper rejects - shutil.move(backupname, filename) - - # todo: check for premature eof - - - -def check_patched(filename, hunks): - matched = True - fp = open(filename) - - class NoMatch(Exception): - pass - - lineno = 1 - line = fp.readline() - hno = None - try: - if not len(line): - raise NoMatch - for hno, h in enumerate(hunks): - # skip to line just before hunk starts - while lineno < h.starttgt-1: - line = fp.readline() - lineno += 1 - if not len(line): - raise NoMatch - for hline in h.text: - # todo: \ No newline at the end of file - if not hline.startswith("-") and not hline.startswith("\\"): - line = fp.readline() - lineno += 1 - if not len(line): - raise NoMatch - if line.rstrip("\r\n") != hline[1:].rstrip("\r\n"): - warning("file is not patched - failed hunk: %d" % (hno+1)) - raise NoMatch - except NoMatch: - matched = False - # todo: display failed hunk, i.e. expected/found - - fp.close() - return matched - - - -def patch_stream(instream, hunks): - """ given a source stream and hunks iterable, yield patched stream - - converts lineends in hunk lines to the best suitable format - autodetected from input - """ - - # todo: At the moment substituted lineends may not be the same - # at the start and at the end of patching. Also issue a - # warning/throw about mixed lineends (is it really needed?) - - hunks = iter(hunks) - - srclineno = 1 - - lineends = {'\n':0, '\r\n':0, '\r':0} - def get_line(): - """ - local utility function - return line from source stream - collecting line end statistics on the way - """ - line = instream.readline() - # 'U' mode works only with text files - if line.endswith("\r\n"): - lineends["\r\n"] += 1 - elif line.endswith("\n"): - lineends["\n"] += 1 - elif line.endswith("\r"): - lineends["\r"] += 1 - return line - - - for hno, h in enumerate(hunks): - debug("hunk %d" % (hno+1)) - # skip to line just before hunk starts - while srclineno < h.startsrc: - yield get_line() - srclineno += 1 - - for hline in h.text: - # todo: check \ No newline at the end of file - if hline.startswith("-") or hline.startswith("\\"): - get_line() - srclineno += 1 - continue - else: - if not hline.startswith("+"): - get_line() - srclineno += 1 - line2write = hline[1:] - # detect if line ends are consistent in source file - if sum([bool(lineends[x]) for x in lineends]) == 1: - newline = [x for x in lineends if lineends[x] != 0][0] - yield line2write.rstrip("\r\n")+newline - else: # newlines are mixed - yield line2write - - for line in instream: - yield line - - - -def patch_hunks(srcname, tgtname, hunks): - # get the current file mode - mode = os.stat(srcname)[ST_MODE] - - src = open(srcname, "rb") - tgt = open(tgtname, "wb") - - debug("processing target file %s" % tgtname) - - tgt.writelines(patch_stream(src, hunks)) - - tgt.close() - src.close() - - # restore the file mode - os.chmod(tgtname, mode) - - return True - - - - - - -from optparse import OptionParser -from os.path import exists -import sys - -if __name__ == "__main__": - opt = OptionParser(usage="%prog [options] unipatch-file", version="python-patch %s" % __version__) - opt.add_option("-d", action="store_true", dest="debugmode", help="debug mode") - (options, args) = opt.parse_args() - - if not args: - opt.print_version() - print("") - opt.print_help() - sys.exit() - debugmode = options.debugmode - patchfile = args[0] - if not exists(patchfile) or not isfile(patchfile): - sys.exit("patch file does not exist - %s" % patchfile) - - - if debugmode: - logging.basicConfig(level=logging.DEBUG, format="%(levelname)8s %(message)s") - else: - logging.basicConfig(level=logging.INFO, format="%(message)s") - - - - patch = from_file(patchfile) - #pprint(patch) - patch.apply() - - # todo: document and test line ends handling logic - patch.py detects proper line-endings - # for inserted hunks and issues a warning if patched file has incosistent line ends diff --git a/cef1/tools/patcher.README.txt b/cef1/tools/patcher.README.txt deleted file mode 100644 index 2078770a4..000000000 --- a/cef1/tools/patcher.README.txt +++ /dev/null @@ -1,32 +0,0 @@ -Chromium Embedded Framework (CEF) Patch Application Tool -- patcher.py -------------------------------------------------------------------------------- - -Document Last Updated: July 23, 2009 - - -OVERVIEW --------- - -The CEF patch application tool is used by the patch project to apply patches -to the Chromium and WebKit code bases. Currently only unified diff format is -supported. See the README.txt file in the patch directory for information on -how the patch project uses this tool. - -The 'patcher.bat' file can be used to run the patch application tool with -command-line arguments that match the default CEF directory structure and -output options. Run 'patcher.py -h' for a complete list of available command- -line arguments. - - -CREDITS -------- - -Thanks go to techtonik for developing the python-patch script. The -patch_util.py file is a slightly modified version of the original script which -can be found here: http://code.google.com/p/python-patch/ - - -WORK REMAINING --------------- - -o Add support for the GIT patch format. diff --git a/cef1/tools/patcher.py b/cef1/tools/patcher.py deleted file mode 100644 index ed5ff723e..000000000 --- a/cef1/tools/patcher.py +++ /dev/null @@ -1,98 +0,0 @@ -# Copyright (c) 2009 The Chromium Embedded Framework 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 pickle -from optparse import OptionParser -import os -import sys -from file_util import * -from patch_util import * - - -# cannot be loaded as a module -if __name__ != "__main__": - sys.stderr.write('This file cannot be loaded as a module!') - sys.exit() - - -# parse command-line options -disc = """ -This utility applies patch files. -""" - -parser = OptionParser(description=disc) -parser.add_option('--patch-config', dest='patchconfig', metavar='DIR', - help='patch configuration file') -(options, args) = parser.parse_args() - -# the patchconfig option is required -if options.patchconfig is None: - parser.print_help(sys.stdout) - sys.exit() - -# normalize the patch directory value -patchdir = os.path.dirname(os.path.abspath(options.patchconfig)).replace('\\', '/') -if patchdir[-1] != '/': - patchdir += '/' - -# check if the patching should be skipped -if os.path.isfile(patchdir + 'NOPATCH'): - nopatch = True - sys.stdout.write('NOPATCH exists -- files have not been patched.\n') -else: - nopatch = False - # locate the patch configuration file - if not os.path.isfile(options.patchconfig): - sys.stderr.write('File '+options.patchconfig+' does not exist.\n') - sys.exit() - - scope = {} - execfile(options.patchconfig, scope) - patches = scope["patches"] - - for patch in patches: - file = patchdir+'patches/'+patch['name']+'.patch' - dopatch = True - - if 'condition' in patch: - # Check that the environment variable is set. - if patch['condition'] not in os.environ: - sys.stderr.write('Skipping patch file '+file+'\n') - dopatch = False - - if dopatch: - if not os.path.isfile(file): - sys.stderr.write('Patch file '+file+' does not exist.\n') - else: - sys.stderr.write('Reading patch file '+file+'\n') - dir = patch['path'] - patchObj = from_file(file) - patchObj.apply(dir) - -# read the current include file, if any -incfile = patchdir + 'patch_state.h' -if nopatch: - incnew = """// This file is generated by the patch tool and should not be edited manually. -#ifndef _PATCH_STATE_H -#define _PATCH_STATE_H -// No patches have been applied to the Chromium/WebKit source base. -#define CEF_PATCHES_APPLIED 0 -#endif // _PATCH_STATE_H -""" -else: - incnew = """// This file is generated by the patch tool and should not be edited manually. -#ifndef _PATCH_STATE_H -#define _PATCH_STATE_H -// Patches have been applied to the Chromium/WebKit source base. -#define CEF_PATCHES_APPLIED 1 -#endif // _PATCH_STATE_H -""" - -inccur = '' -if os.path.isfile(incfile): - inccur = read_file(incfile) - -if inccur != incnew: - sys.stdout.write('Writing file '+incfile+'.\n') - write_file(incfile, incnew) \ No newline at end of file diff --git a/cef1/tools/repack_locales.py b/cef1/tools/repack_locales.py deleted file mode 100644 index d70d9a3bd..000000000 --- a/cef1/tools/repack_locales.py +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) 2011 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. - -"""Helper script to repack paks for a list of locales. - -Gyp doesn't have any built-in looping capability, so this just provides a way to -loop over a list of locales when repacking pak files, thus avoiding a -proliferation of mostly duplicate, cut-n-paste gyp actions. -""" - -import getopt -import os -import sys - -sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', - 'tools', 'grit')) -from grit.format import data_pack - -# Some build paths defined by gyp. -GRIT_DIR = None -SHARE_INT_DIR = None -INT_DIR = None - - -class Usage(Exception): - def __init__(self, msg): - self.msg = msg - - -def calc_output(locale): - """Determine the file that will be generated for the given locale.""" - #e.g. '<(INTERMEDIATE_DIR)/repack/da.pak', - # For Fake Bidi, generate it at a fixed path so that tests can safely - # reference it. - if locale == 'fake-bidi': - return '%s/%s.pak' % (INT_DIR, locale) - if sys.platform in ('darwin',): - # For Cocoa to find the locale at runtime, it needs to use '_' instead - # of '-' (http://crbug.com/20441). Also, 'en-US' should be represented - # simply as 'en' (http://crbug.com/19165, http://crbug.com/25578). - if locale == 'en-US': - locale = 'en' - return '%s/repack/%s.lproj/locale.pak' % (INT_DIR, locale.replace('-', '_')) - else: - return os.path.join(INT_DIR, 'repack', locale + '.pak') - - -def calc_inputs(locale): - """Determine the files that need processing for the given locale.""" - inputs = [] - - #e.g. '<(grit_out_dir)/generated_resources_da.pak' - #inputs.append(os.path.join(GRIT_DIR, 'generated_resources_%s.pak' % locale)) - - #e.g. '<(grit_out_dir)/locale_settings_da.pak' - #inputs.append(os.path.join(GRIT_DIR, 'locale_settings_%s.pak' % locale)) - - #e.g. '<(grit_out_dir)/platform_locale_settings_da.pak' - #inputs.append(os.path.join(GRIT_DIR, - # 'platform_locale_settings_%s.pak' % locale)) - - #e.g. '<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_strings_da.pak' - inputs.append(os.path.join(SHARE_INT_DIR, 'webkit', - 'webkit_strings_%s.pak' % locale)) - - #e.g. '<(SHARED_INTERMEDIATE_DIR)/ui/ui_strings_da.pak', - inputs.append(os.path.join(SHARE_INT_DIR, 'ui', 'ui_strings', - 'ui_strings_%s.pak' % locale)) - - #e.g. '<(SHARED_INTERMEDIATE_DIR)/ui/app_locale_settings_da.pak', - inputs.append(os.path.join(SHARE_INT_DIR, 'ui', 'app_locale_settings', - 'app_locale_settings_%s.pak' % locale)) - - return inputs - - -def list_outputs(locales): - """Returns the names of files that will be generated for the given locales. - - This is to provide gyp the list of output files, so build targets can - properly track what needs to be built. - """ - outputs = [] - for locale in locales: - outputs.append(calc_output(locale)) - # Quote each element so filename spaces don't mess up gyp's attempt to parse - # it into a list. - return " ".join(['"%s"' % x for x in outputs]) - - -def list_inputs(locales): - """Returns the names of files that will be processed for the given locales. - - This is to provide gyp the list of input files, so build targets can properly - track their prerequisites. - """ - inputs = [] - for locale in locales: - inputs += calc_inputs(locale) - # Quote each element so filename spaces don't mess up gyp's attempt to parse - # it into a list. - return " ".join(['"%s"' % x for x in inputs]) - - -def repack_locales(locales): - """ Loop over and repack the given locales.""" - for locale in locales: - inputs = [] - inputs += calc_inputs(locale) - output = calc_output(locale) - data_pack.DataPack.RePack(output, inputs) - - -def DoMain(argv): - global GRIT_DIR - global SHARE_INT_DIR - global INT_DIR - - short_options = 'iog:s:x:b:h' - long_options = 'help' - - print_inputs = False - print_outputs = False - usage_msg = '' - - helpstr = """\ -Usage: %s [-h] [-i | -o] -g -x -s [...] - -h, --help Print this help, then exit. - -i Print the expected input file list, then exit. - -o Print the expected output file list, then exit. - -g DIR GRIT build files output directory. - -x DIR Intermediate build files output directory. - -s DIR Shared intermediate build files output directory. - locale [...] One or more locales to repack.""" % ( - os.path.basename(__file__)) - - try: - opts, locales = getopt.getopt(argv, short_options, long_options) - except getopt.GetoptError, msg: - raise Usage(str(msg)) - - if not locales: - usage_msg = 'Please specificy at least one locale to process.\n' - - for o, a in opts: - if o in ('-i'): - print_inputs = True - elif o in ('-o'): - print_outputs = True - elif o in ('-g'): - GRIT_DIR = a - elif o in ('-s'): - SHARE_INT_DIR = a - elif o in ('-x'): - INT_DIR = a - elif o in ('-h', '--help'): - raise Usage(helpstr) - - if not (GRIT_DIR and INT_DIR and SHARE_INT_DIR): - usage_msg += 'Please specify all of "-g" and "-x" and "-s".\n' - if print_inputs and print_outputs: - usage_msg += 'Please specify only one of "-i" or "-o".\n' - - if usage_msg: - raise Usage(usage_msg) - - if print_inputs: - return list_inputs(locales) - - if print_outputs: - return list_outputs(locales) - - return repack_locales(locales) - -if __name__ == '__main__': - results = DoMain(sys.argv[1:]) - if results: - print results diff --git a/cef1/tools/revision.py b/cef1/tools/revision.py deleted file mode 100644 index 1096c12dd..000000000 --- a/cef1/tools/revision.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2012 The Chromium Embedded Framework 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 svn_util as svn -import git_util as git -import sys - -# cannot be loaded as a module -if __name__ != "__main__": - sys.stderr.write('This file cannot be loaded as a module!') - sys.exit() - -try: - sys.stdout.write(svn.get_revision()) -except: - sys.stdout.write(git.get_svn_revision()) - - diff --git a/cef1/tools/svn_util.py b/cef1/tools/svn_util.py deleted file mode 100644 index 39f2dda82..000000000 --- a/cef1/tools/svn_util.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (c) 2012 The Chromium Embedded Framework 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 os -import sys -import urllib - -def check_url(url): - """ Check the URL and raise an exception if invalid. """ - if ':' in url[:7]: - parts = url.split(':', 1) - if (parts[0] == 'http' or parts[0] == 'https' or parts[0] == 'svn') and \ - parts[1] == urllib.quote(parts[1]): - return url - sys.stderr.write('Invalid URL: '+url+"\n") - raise Exception('Invalid URL: '+url) - -def get_svn_info(path): - """ Retrieves the URL and revision from svn info. """ - url = 'None' - rev = 'None' - if path[0:4] == 'http' or os.path.exists(path): - try: - stream = os.popen('svn info '+path) - for line in stream: - if line[0:4] == "URL:": - url = check_url(line[5:-1]) - elif line[0:9] == "Revision:": - rev = str(int(line[10:-1])) - except IOError, (errno, strerror): - sys.stderr.write('Failed to read svn info: '+strerror+"\n") - raise - return {'url': url, 'revision': rev} - -def get_revision(path = '.'): - """ Retrieves the revision from svn info. """ - info = get_svn_info(path) - if info['revision'] == 'None': - raise Exception('Unable to retrieve SVN revision for "'+path+'"') - return info['revision'] - -def get_changed_files(path = '.'): - """ Retrieves the list of changed files from svn status. """ - files = [] - if os.path.exists(path): - try: - stream = os.popen('svn status '+path) - for line in stream: - status = line[0] - # Return paths with add, modify and switch status. - if status == 'A' or status == 'M' or status == 'S': - files.append(line[8:].strip()) - except IOError, (errno, strerror): - sys.stderr.write('Failed to read svn status: '+strerror+"\n") - raise - return files diff --git a/cef1/tools/translator.README.txt b/cef1/tools/translator.README.txt deleted file mode 100644 index 586133b6d..000000000 --- a/cef1/tools/translator.README.txt +++ /dev/null @@ -1,1697 +0,0 @@ -Chromium Embedded Framework (CEF) Translator Tool -- translator.py -------------------------------------------------------------------------------- - -Document Last Updated: February 14, 2012 - - -OVERVIEW --------- - -The CEF translator tool automatically generates CEF source code based on the -contents of the CEF header file (cef.h). The generated source code includes the -main C API header file (cef_capi.h) and all files in the libcef_dll/cpptoc and -libcef_dll/ctocpp directories. - -If any differences are detected between the new translator-generated output and -the file that currently exists on disk a backup of the existing file will be -created before the new file is written (this behavior can be controlled using -a command-line switch -- see 'translator.py -h' for more information). Header -files (*.h) are completely generated by the translator and should never be -edited by hand. Implementation files (*.cc) may contain user-created content -within method and function body blocks. The user-created content is extracted -from the existing file and inserted into the new translator-generated file. Any -differences between existing method/function prototypes and new method/function -prototypes in manually edited implementations will be noted as a warning in new -output file. - - // WARNING - CHANGED ATTRIBUTES - // REMOVED: const wchar_t* key - // ADDED: int index - // WARNING - CHANGED RETURN VALUE - // WAS: void - // NOW: int - #pragma message("Warning: "__FILE__": MyFunction prototype has changed") - -Auto-generated implementations will be added in the new output file for any -methods/functions that exist in the CEF header file but did not exist in the -current on-disk implementation file. Each time the translator re-generates the -implementation file it will warn if an implementation could not be auto- -generated. Delete the indicated portion of the generated code after adding the -implementation manually. - - size_t CEF_CALLBACK frame_new_func(struct _cef_frame_t* self) - { - // BEGIN DELETE BEFORE MODIFYING - // AUTO-GENERATED CONTENT - #pragma message("Warning: "__FILE__": frame_new_func is not implemented") - // END DELETE BEFORE MODIFYING - } - -If the complete function or method implementation has been auto-generated the -body of the function or method will contain the following comment. - - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - -If you edit the implementation manually you should remove this comment so that -CEF will not discard your changes on the next run of the translator tool. - -The 'translator.[bat|sh]' file can be used to run the translator tool with -command- line arguments that match the default CEF directory structure and -output options. Run 'translator.py -h' for a complete list of available command- -line arguments. - - -HEADER ATTRIBUTES ------------------ - -Comment-based attribute tags are added before each function, class and method -definition in the CEF header file to provide the translator with additional -information about how the output should be generated. The attribute tags must -be in the form of a comma-delimited list of name=value pairs. Attribute names -and values must contain only alpha-numeric characters, numbers and underscores, -and must all exist on a single line. - - /*--cef(name1=value1,name2=value2,name3=value3)--*/ - -Supported method/function attributes: - - capi_name=[string] (Optional) Force a specific output name for the - resulting C API function. - optional_param=[param] (Optional) Parameter name that will be optional - instead of required. - index_param=[param] (Optional) Parameter name representing an index - value that will be verified as >= 0. - default_retval=[string] (Required for enumeration types, Optional for other - types) Specify the default return value. - count_func=[param:func] (Required for non-const non-string std::vector - types) Specify the C++ function that returns the - count of elements for a vector parameter. - revision_check (Optional) If set a revision check will be added - to the CToCpp version of the method/function. - -Supported class attributes: - - source=[library|client] (Required) Indicates whether the class - implementation is provided by the library or the - client. This effects the generation of guard - blocks in the cpptoc and ctocpp header files. - no_debugct_check (Optional) If set the debug reference count - of the object will not be checked on shutdown. - - -TRANSLATION RULES ------------------ - -All C++ names in the CEF header file are written in CamelCaps format and all -C API translations are generated in lowercase_underscore format. - - -Translating Classes and Methods -------------------------------- - -Class names and global function names must be prefixed with the 'Cef' string. - - Global function translation - C++: void CefShutdown() - C API: void cef_shutdown() - -The translation of a C++ class name to a C API structure name is prefixed with -'_' and postfixed with '_t'. A typedef of the C API structure to a value -without the prefixed '_' is also provided and may be used interchangeably. - - Class name translation - C++: class CefPostData - C API: typedef struct _cef_post_data_t { ... } cef_post_data_t - -The translation of a C++ virtual class method to a C API member function adds a -'self' structure pointer as the first parameter. This will always be a pointer -to the structure that contains the member function. - - Virtual method translation - C++: virtual void SetFocus(bool enable) - C API: void set_focus(struct _cef_browser_t* self, int enable) - -The translation of a C++ static class method to a C API global function -is prefixed with 'cef_classname_' where 'classname' is the -lowercase_underscore name of the class that contains the static method. Any -repeat of 'classname' in the function name is removed. - - Static method translation - C++: static CefRefPtr CreateRequest() - C API: struct _cef_request_t* cef_request_create() - -Implementation of the wrapper method/function body is generally formatted as -follows. - - Static/Global CppToC (without Return): - - CEF_EXPORT void cef_function(capi_params) - { - // Parameter Verification (Optional) - // Verify the C parameter values. - // ... - - // Parameter Translation (Optional) - // Convert C parameter values to C++ parameter values. - // ... - - // Execution - CefFunction(cpp_arams); - - // Parameter Restoration (Optional) - // Retore the C parameter values if changed. - // ... - } - - Static/Global CppToC (with Return): - - CEF_EXPORT capi_retval cef_function(capi_params) - { - // Parameter Verification (Optional) - // Verify the C parameter values. - // ... - - // Parameter Translation (Optional) - // Convert C parameter values to C++ parameter values. - // ... - - // Execution - cpp_retval _rv = CefFunction(cpp_params); - - // Parameter Restoration (Optional) - // Restore the C parameter values if changed. - // ... - - // Return Translation - // Convert the C++ return value to a C return value. - return ...; - } - - Static/Global CToCpp (without Return): - - void CefFunction(cpp_params) - { - // Parameter Verification (Optional) - // Verify the C++ parameter values. - // ... - - // Parameter Translation (Optional) - // Convert C++ parameter values to C parameter values. - // ... - - // Execution - cef_function(capi_params); - - // Parameter Restoration (Optional) - // Restore the C++ parameter values if changed. - // ... - } - - Static/Global CToCpp (with Return): - - cpp_retval CefFunction(cpp_params) - { - // Parameter Verification (Optional) - // Verify the C++ parameter values. - // ... - - // Parameter Translation (Optional) - // Convert C++ parameter values to C parameter values. - // ... - - // Execution - capi_retval _rv = cef_function(capi_params); - - // Parameter Restoration (Optional) - // Restore the C++ parameter values if changed. - // ... - - // Return Translation - // Convert the C return value to a C++ return value. - return ...; - } - - Member CppToC (without Return): - - CEF_CALLBACK void class_function(cef_class_t* self, capi_params) - { - // Parameter Verification. - // Verify the C parameter values. - DCHECK(self); - DCHECK(...); - if (!self || ...) - return; - - // Parameter Translation (Optional) - // Convert the C parameter values to C++ parameter values. - // ... - - // Execution - CefClassCppToC::Get(self)->CefFunction(cpp_params); - - // Parameter Restoration (Optional) - // Restore the C parameter values if changed. - // ... - } - - Member CppToC (with Return): - - CEF_CALLBACK capi_retval class_function(cef_class_t* self, capi_params) - { - // Parameter Verification. - // Verify the C parameter values. - DCHECK(self); - DCHECK(...); - if (!self || ...) - return default_retval; // Configured or defaulted automatically. - - // Parameter Translation (Optional) - // Convert the C parameter values to C++ parameter values. - // ... - - // Execution - cpp_retval _rv = CefClassCppToC::Get(self)->CefFunction(cpp_params); - - // Parameter Restoration (Optional) - // Restore the C parameter values if changed. - // ... - - // Return Translation - // Convert the C++ return value to a C return value. - return ...; - } - - Member CToCpp (without Return): - - void CefClassCToCpp::Function(cpp_params) - { - // Structure Verification - if (CEF_MEMBER_MISSING(struct_, function)) - return; - - // Parameter Verification (Optional) - // Verify the C++ parameter values. - // ... - - // Parameter Translation (Optional) - // Convert C++ parameter values to C parameter values. - // ... - - // Execution - struct_->class_function(struct_, capi_params); - - // Parameter Restoration (Optional) - // Restore the C++ parameter values if changed. - // ... - } - - Member CToCpp (with Return): - - cpp_retval CefClassCToCpp::Function(cpp_params) - { - // Structure Verification - if (CEF_MEMBER_MISSING(struct_, function)) - return default_retval; // Configured or defaulted automatically. - - // Parameter Verification (Optional) - // Verify the C++ parameter values. - // ... - - // Parameter Translation (Optional) - // Convert C++ parameter values to C parameter values. - // ... - - // Execution - capi_retval _rv = struct_->class_function(struct_, capi_params); - - // Parameter Restoration (Optional) - // Restore the C++ parameter values if changed. - // ... - - // Return Translation - // Convert the C return value to a C++ return value. - return ...; - } - - -Translating Data Types ----------------------- - -Data types that are available in both C++ and C are left unchanged. This -includes the 'double', 'int', 'long', 'size_t' and 'void' basic types. Other -data types have differing levels of support as indicated below. The translation -tool will terminate with an exception if it encounters a data type that it -cannot translate. - -Parameters: - - Simple/enumeration type by value (simple_byval): - C++: int value - C API: int value - - // CppToC Example - CEF_EXPORT void cef_function(int value) - { - // Execution - CefFunction(value); - } - - // CToCpp Example - void CefFunction(int value) - { - // Execution - cef_function(value); - } - - Simple/enumeration type by reference (simple_byref): - C++: int& value - C API: int* value - - // CppToC Example - CEF_EXPORT void cef_function(int* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - int valueVal = value?*value:0; - - // Execution - CefFunction(valueVal); - - // Parameter Restoration - if (value) - *value = valueVal; - } - - // CToCpp Example - void CefFunction(int& value) - { - // Execution - cef_function(&value); - } - - Simple/enumeration const type by reference (simple_byref_const): - C++: const int& value - C API: const int* value - - // CppToC Example - CEF_EXPORT void cef_function(const int* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - int valueVal = value?*value:0; - - // Execution - CefFunction(valueVal); - } - - // CToCpp Example - void CefFunction(const int& value) - { - // Execution - cef_function(&value); - } - - Simple/enumeration type by address (simple_byaddr): - C++: int* value - C API: int* value - - // CppToC Example - CEF_EXPORT void cef_function(int* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Execution - CefFunction(value); - } - - // CToCpp Example - void CefFunction(int* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Execution - cef_function(value); - } - - Boolean type by value (bool_byval): - C++: bool value - C API: int value - - // CppToC Example - CEF_EXPORT void cef_function(int value) - { - // Execution - CefFunction(value?true:false); - } - - // CToCpp Example - void CefFunction(bool value) - { - // Execution - cef_function(value); - } - - Boolean type by reference (bool_byref): - C++: bool& value - C API: int* value - - // CppToC Example - CEF_EXPORT void cef_function(int* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - bool valueBool = (value && *value)?true:false; - - // Execution - CefFunction(valueBool); - - // Parameter Restoration - if (value) - *value = valueBool?true:false; - } - - // CToCpp Example - void CefFunction(bool& value) - { - // Parameter Translation - int valueInt = value; - - // Execution - cef_function(&valueInt); - - // Parameter Restoration - value = valueInt?true:false; - } - - Boolean type by address (bool_byaddr): - C++: bool* value - C API: int* value - - // CppToC Example - CEF_EXPORT void cef_function(int* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - bool valueBool = (value && *value)?true:false; - - // Execution - CefFunction(&valueBool); - - // Parameter Restoration - if (value) - *value = valueBool?true:false; - } - - // CToCpp Example - void CefFunction(bool* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - int valueInt = value?*value:0; - - // Execution - cef_function(&valueInt); - - // Parameter Restoration - if (value) - *value = valueInt?true:false; - } - - Structure const type by reference (struct_byref_const): - C++: const CefPopupFeatures& value - C API: const cef_popup_features_t* value - - // CppToC Example - CEF_EXPORT void cef_function(const cef_popup_features_t* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - CefPopupFeatures valueObj; - // Reference the existing values instead of copying. - if (value) - valueObj.Set(*value, false); - - // Execution - CefFunction(valueObj); - } - - // CToCpp Example - void CefFunction(const CefPopupFeatures& value) - { - // Execution - cef_function(&value); - } - - Structure non-const type by reference (struct_byref): - C++: CefWindowInfo& value - C API: cef_window_info_t* value - - // CppToC Example - CEF_EXPORT void cef_function(cef_window_info_t* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - CefWindowInfo valueObj; - // Take ownership of the values. - if (value) - valueObj.AttachTo(*value); - - // Execution - CefFunction(valueObj); - - // Parameter Restoration - // Return the values to the structure. - if (value) - valueObj.DetachTo(*value); - } - - // CToCpp Example - void CefFunction(CefWindowInfo& value) - { - // Execution - cef_function(&value); - } - - String const type by reference (string_byref_const): - C++: const CefString& value - C API: const cef_string_t* value - - // CppToC Example - CEF_EXPORT void cef_function(const cef_string_t* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Execution - CefFunction(CefString(value)); - } - - // CToCpp Example - void CefFunction(const CefString& value) - { - // Execution - cef_function(value.GetStruct()); - } - - String non-const type by reference (string_byref): - C++: CefString& value - C API: cef_string_t* value - - // CppToC Example - CEF_EXPORT void cef_function(cef_string_t* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - CefString valueStr(value); - - // Execution - CefFunction(valueStr); - } - - // CToCpp Example - void CefFunction(CefString& value) - { - // Execution - cef_function(value.GetWritableStruct()); - } - - Smart pointer type same boundary side (refptr_same): - C++: CefRefPtr value - C API: cef_browser_t* value - - // CppToC Example - CEF_EXPORT void cef_function(cef_browser_t* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Execution - CefFunction(CefBrowserCppToC::Unwrap(value)); - } - - // CToCpp Example - void CefFunction(CefRefPtr value) - { - // Execution - cef_function(CefBrowserCToCpp::Unwrap(value)); - } - - Smart pointer type same boundary side by reference (refptr_same_byref): - C++: CefRefPtr& value - C API: cef_client_t** value - - // CppToC Example - CEF_EXPORT void cef_function(cef_client_t** value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - CefRefPtr valuePtr; - if (value && *value) - valuePtr = CefClientCppToC::Unwrap(*value); - CefClient* valueOrig = valuePtr.get(); - - // Execution - CefFunction(valuePtr); - - // Parameter Restoration - if (value) { - if (valuePtr.get()) { - if (valuePtr.get() != valueOrig) { - // The value has been changed. - *value = CefClientCppToC::Wrap(valuePtr); - } - } else { - *value = NULL; - } - } - } - - // CToCpp Example - void CefFunction(CefRefPtr& value) - { - // Parameter Translation - cef_client_t* valueStruct = NULL; - if(value.get()) - valueStruct = CefClientCToCpp::Unwrap(value); - cef_client_t* valueOrig = valueStruct; - - // Execution - cef_function(valueStuct); - - // Parameter Restoration - if (valueStruct) { - if (valueStruct != valueOrig) { - // The value was changed. - value = CefClientCToCpp::Wrap(valueStruct); - } - } else { - value = NULL; - } - } - - Smart pointer type different boundary side (refptr_diff): - C++: CefRefPtr value - C API: cef_browser_t* value - - // CppToC Example - CEF_EXPORT void cef_function(cef_browser_t* value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Execution - CefFunction(CefBrowserCToCpp::Wrap(value)); - } - - // CToCpp Example - void CefFunction(CefRefPtr value) - { - // Execution - cef_function(CefBrowserCppToC::Wrap(value)); - } - - Smart pointer type different boundary side by reference (refptr_diff_byref): - C++: CefRefPtr& value - C API: cef_client_t** value - - // CppToC Example - CEF_EXPORT void cef_function(cef_client_t** value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - CefRefPtr valuePtr; - if (value && *value) - valuePtr = CefClientCToCpp::Wrap(*value); - CefClient* valueOrig = valuePtr.get(); - - // Execution - CefFunction(valuePtr); - - // Parameter Restoration - if (value) { - if (valuePtr.get()) { - if (valuePtr.get() != valueOrig) { - // The value has been changed. - *value = CefClientCToCpp::Unwrap(valuePtr); - } - } else { - *value = NULL; - } - } - } - - // CToCpp Example - void CefFunction(CefRefPtr& value) - { - // Parameter Translation - cef_client_t* valueStruct = NULL; - if(value.get()) - valueStruct = CefClientCppToC::Wrap(value); - cef_client_t* valueOrig = valueStruct; - - // Execution - cef_function(valueStuct); - - // Parameter Restoration - if (valueStruct) { - if (valueStruct != valueOrig) { - // The value was changed. - value = CefClientCppToC::Unwrap(valueStruct); - } - } else { - value = NULL; - } - } - - String vector type by reference (string_vec_byref): - C++: std::vector& value - C API: cef_string_list_t value - - // CppToC Example - CEF_EXPORT void cef_function(cef_string_list_t value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - std::vector valueList; - transfer_string_list_contents(value, valueList); - - // Execution - CefFunction(valueList); - - // Parameter Restoration - cef_string_list_clear(value); - transfer_string_list_contents(valueList, value); - } - - // CToCpp Example - void CefFunction(std::vector& value) - { - // Parameter Translation - cef_string_list_t valueList = cef_string_list_alloc(); - DCHECK(valueList); - if (valueList) - transfer_string_list_contents(value, valueList); - - // Execution - cef_function(valueList); - - // Parameter Restoration - if (valueList) { - value.clear(); - transfer_string_list_contents(valueList, value); - cef_string_list_free(valueList); - } - } - - String vector const type by reference (string_vec_byref_const): - C++: const std::vector& value - C API: cef_string_list_t value - - // CppToC Example - CEF_EXPORT void cef_function(cef_string_list_t value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - std::vector valueList; - transfer_string_list_contents(value, valueList); - - // Execution - CefFunction(valueList); - } - - // CToCpp Example - void CefFunction(const std::vector& value) - { - // Parameter Translation - cef_string_list_t valueList = cef_string_list_alloc(); - DCHECK(valueList); - if (valueList) - transfer_string_list_contents(value, valueList); - - // Execution - cef_function(valueList); - - // Parameter Restoration - if (valueList) - cef_string_list_free(valueList); - } - - String-to-string single map type by reference (string_map_single_byref): - C++: std::map& value - C API: cef_string_map_t value - - // CppToC Example - CEF_EXPORT void cef_function(cef_string_map_t value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - std::map valueMap; - transfer_string_map_contents(value, valueMap); - - // Execution - CefFunction(valueMap); - - // Parameter Restoration - cef_string_map_clear(value); - transfer_string_map_contents(valueMap, value); - } - - // CToCpp Example - void CefFunction(std::map& value) - { - // Parameter Translation - cef_string_map_t valueMap = cef_string_map_alloc(); - DCHECK(valueMap); - if (valueMap) - transfer_string_map_contents(value, valueMap); - - // Execution - cef_function(valueMap); - - // Parameter Restoration - if (valueMap) { - value.clear(); - transfer_string_map_contents(valueMap, value); - cef_string_map_free(valueMap); - } - } - - String-to-string single map const type by reference - (string_map_single_byref_const): - C++: const std::map& value - C API: cef_string_map_t value - - // CppToC Example - CEF_EXPORT void cef_function(cef_string_map_t value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - std::map valueMap; - transfer_string_map_contents(value, valueMap); - - // Execution - CefFunction(valueMap); - } - - // CToCpp Example - void CefFunction(const std::map& value) - { - // Parameter Translation - cef_string_map_t valueMap = cef_string_map_alloc(); - DCHECK(valueMap); - if (valueMap) - transfer_string_map_contents(value, valueMap); - - // Execution - cef_function(valueMap); - - // Parameter Restoration - if (valueMap) - cef_string_map_free(valueMap); - } - - String-to-string multi map type by reference (string_map_multi_byref): - C++: std::multimap& value - C API: cef_string_multimap_t value - - // CppToC Example - CEF_EXPORT void cef_function(cef_string_multimap_t value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - std::multimap valueMultimap; - transfer_string_multimap_contents(value, valueMultimap); - - // Execution - CefFunction(valueMultimap); - - // Parameter Restoration - cef_string_multimap_clear(value); - transfer_string_multimap_contents(valueMultimap, value); - } - - // CToCpp Example - void CefFunction(std::multimap& value) - { - // Parameter Translation - cef_string_multimap_t valueMultimap = cef_string_multimap_alloc(); - DCHECK(valueMultimap); - if (valueMultimap) - transfer_string_multimap_contents(value, valueMultimap); - - // Execution - cef_function(valueMultimap); - - // Parameter Restoration - if (valueMultimap) { - value.clear(); - transfer_string_multimap_contents(valueMultimap, value); - cef_string_multimap_free(valueMultimap); - } - } - - String-to-string multi map const type by reference - (string_map_multi_byref_const): - C++: const std::multimap& value - C API: cef_string_multimap_t value - - // CppToC Example - CEF_EXPORT void cef_function(cef_string_multimap_t value) - { - // Parameter Verification - DHECK(value); - if (!value) - return; - - // Parameter Translation - std::multimap valueMultimap; - transfer_string_multimap_contents(value, valueMultimap); - - // Execution - CefFunction(valueMultimap); - } - - // CToCpp Example - void CefFunction(const std::multimap& value) - { - // Parameter Translation - cef_string_multimap_t valueMultimap = cef_string_multimap_alloc(); - DCHECK(valueMultimap); - if (valueMultimap) - transfer_string_multimap_contents(value, valueMultimap); - - // Execution - cef_function(valueMultimap); - - // Parameter Restoration - if (valueMultimap) - cef_string_multimap_free(valueMultimap); - } - - Simple/Enumeration vector non-const type by reference (simple_vec_byref): - C++: std::vector& value - C API: size_t* valueCount, int* value - - // CppToC Example - CEF_EXPORT void cef_function(size_t* valueCount, int* value) - { - // Parameter Verification - DCHECK(valueCount && (*valueCount == 0 || value)); - if (!valueCount || (*valueCount > 0 && !value)) - return; - - // Parameter Translation - std::vector valueList; - if (valueCount && *valueCount > 0 && value) { - for (size_t i = 0; i < *valueCount; ++i) - valueList.push_back(value[i]); - } - - // Execution - CefFunction(valueList); - - // Parameter Restoration - if (valueCount && value) { - *valueCount = std::min(valueList.size(), *valueCount); - if (*valueCount > 0) { - for (size_t i = 0; i < *valueCount; ++i) - value[i] = valueList[i]; - } - } - } - - // CToCpp Example - void CefFunction(std::vector& value) - { - // Parameter Translation - // Function identified by the "count_func" method attribute. - size_t valueSize = value.size(); - size_t valueCount = std::max(GetFunctionCount(), valueSize); - int* valueList = NULL; - if (valueCount > 0) { - valueList = new int[valueCount]; - DCHECK(valueList); - if (valueList) - memset(valueList, 0, sizeof(int)*valueCount); - if (valueList && valueSize > 0) { - for (size_t i = 0; i < valueSize; ++i) { - valueList[i] = value[i]; - } - } - } - - // Execution - cef_function(&valueCount, valueList); - - // Parameter Restoration - value.clear(); - if (valueCount > 0 && valueList) { - for (size_t i = 0; i < valueCount; ++i) - value.push_back(valueList[i]); - delete [] valueList; - } - } - - Simple/Enumeration vector const type by reference (simple_vec_byref_const): - C++: const std::vector& value - C API: size_t valueCount, int const* value - - // CppToC Example - CEF_EXPORT void cef_function(size_t valueCount, int const* value) - { - // Parameter Verification - DCHECK(valueCount == 0 || value); - if (valueCount > 0 && !value) - return; - - // Parameter Translation - std::vector valueList; - if (valueCount > 0) { - for (size_t i = 0; i < valueCount; ++i) - valueList.push_back(value[i]); - } - - // Execution - CefFunction(valueList); - } - - // CToCpp Example - void CefFunction(const std::vector& value) - { - // Parameter Translation - const size_t valueCount = value.size(); - int* valueList = NULL; - if (valueCount > 0) { - valueList = new int[valueCount]; - DCHECK(valueList); - if (valueList) { - for (size_t i = 0; i < valueCount; ++i) - valueList[i] = value[i]; - } - } - - // Execution - cef_function(valueCount, valueList); - - // Parameter Restoration - if (valueList) - delete [] valueList; - } - - Boolean vector non-const type by reference (bool_vec_byref): - C++: std::vector& value - C API: size_t* valueCount, int* value - - // CppToC Example - CEF_EXPORT void cef_function(size_t* valueCount, int* value) - { - // Parameter Verification - DCHECK(valueCount && (*valueCount == 0 || value)); - if (!valueCount || (*valueCount > 0 && !value)) - return; - - // Parameter Translation - std::vector valueList; - if (valueCount && *valueCount > 0 && value) { - for (size_t i = 0; i < *valueCount; ++i) - valueList.push_back(value[i]?true:false); - } - - // Execution - CefFunction(valueList); - - // Parameter Restoration - if (valueCount && value) { - *valueCount = std::min(valueList.size(), *valueCount); - if (*valueCount > 0) { - for (size_t i = 0; i < *valueCount; ++i) - value[i] = valueList[i]; - } - } - } - - // CToCpp Example - void CefFunction(std::vector& value) - { - // Parameter Translation - // Function identified by the "count_func" method attribute. - size_t valueSize = value.size(); - size_t valueCount = std::max(GetFunctionCount(), valueSize); - int* valueList = NULL; - if (valueCount > 0) { - valueList = new int[valueCount]; - DCHECK(valueList); - if (valueList) - memset(valueList, 0, sizeof(int)*valueCount); - if (valueList && valueSize > 0) { - for (size_t i = 0; i < valueSize; ++i) { - valueList[i] = value[i]; - } - } - } - - // Execution - cef_function(&valueCount, valueList); - - // Parameter Restoration - value.clear(); - if (valueCount > 0 && valueList) { - for (size_t i = 0; i < valueCount; ++i) - value.push_back(valueList[i]?true:false); - delete [] valueList; - } - } - - Boolean vector const type by reference (bool_vec_byref_const): - C++: const std::vector& value - C API: size_t valueCount, int const* value - - // CppToC Example - CEF_EXPORT void cef_function(size_t valueCount, int const* value) - { - // Parameter Verification - DCHECK(valueCount == 0 || value); - if (valueCount > 0 && !value) - return; - - // Parameter Translation - std::vector valueList; - if (valueCount > 0) { - for (size_t i = 0; i < valueCount; ++i) - valueList.push_back(value[i]?true:false); - } - - // Execution - CefFunction(valueList); - } - - // CToCpp Example - void CefFunction(const std::vector& value) - { - // Parameter Translation - const size_t valueCount = value.size(); - int* valueList = NULL; - if (valueCount > 0) { - valueList = new int[valueCount]; - DCHECK(valueList) - if (valueList) { - for (size_t i = 0; i < valueCount; ++i) - valueList[i] = value[i]; - } - } - - // Execution - cef_function(valueCount, valueList); - - // Parameter Restoration - if (valueList) - delete [] valueList; - } - - Smart pointer vector non-const type same boundary side by reference - (refptr_vec_same_byref): - C++: std::vector>& value - C API: size_t* valueCount, cef_post_data_element_t** value - - // CppToC Example - CEF_EXPORT void cef_function(size_t* valueCount, - cef_post_data_element_t** value) - { - // Parameter Verification - DCHECK(valueCount && (*valueCount == 0 || value)); - if (!valueCount || (*valueCount > 0 && !value)) - return; - - // Parameter Translation - std::vector> valueList; - if (valueCount && *valueCount > 0 && value) { - for (size_t i = 0; i < *valueCount; ++i) - valueList.push_back(CefPostDataElementCppToC::Unwrap(value[i])); - } - - // Execution - CefFunction(valueList); - - // Parameter Restoration - if (valueCount && value) { - *valueCount = std::min(valueList.size(), *valueCount); - if (*valueCount > 0) { - for (size_t i = 0; i < *valueCount; ++i) - value[i] = CefPostDataElementCppToC::Wrap(valueList[i]); - } - } - } - - // CToCpp Example - void CefFunction(std::vector& value) - { - // Parameter Translation - // Function identified by the "count_func" method attribute. - size_t valueSize = value.size(); - size_t valueCount = std::max(GetFunctionCount(), valueSize); - cef_post_data_element_t** valueList = NULL; - if (valueCount > 0) { - valueList = new cef_post_data_element_t*[valueCount]; - DCHECK(valueList); - if (valueList) - memset(valueList, 0, sizeof(cef_post_data_element_t*)*valueCount); - if (valueList && valueSize > 0) { - for (size_t i = 0; i < valueSize; ++i) { - valueList[i] = CefPostDataElementCToCpp::Unwrap(value[i]); - } - } - } - - // Execution - cef_function(&valueCount, valueList); - - // Parameter Restoration - value.clear(); - if (valueCount > 0 && valueList) { - for (size_t i = 0; i < valueCount; ++i) - value.push_back(CefPostDataElementCToCpp::Wrap(valueList[i])); - delete [] valueList; - } - } - - Smart pointer vector const type same boundary side by reference - (refptr_vec_same_byref_const): - C++: const std::vector>& value - C API: size_t valueCount, const cef_v8value_t** value - - // CppToC Example - CEF_EXPORT void cef_function(size_t valueCount, - const cef_v8value_t** value) - { - // Parameter Verification - DCHECK(valueCount == 0 || value); - if (valueCount > 0 && !value) - return; - - // Parameter Translation - std::vector> valueList; - if (valueCount > 0) { - for (size_t i = 0; i < valueCount; ++i) - valueList.push_back(CefV8ValueCppToC::Unwrap(value[i])); - } - - // Execution - CefFunction(valueList); - } - - // CToCpp Example - void CefFunction(const std::vector& value) - { - // Parameter Translation - const size_t valueCount = value.size(); - cef_v8value_t** valueList = NULL; - if (valueCount > 0) { - valueList = new int[valueCount]; - DCHECK(valueList); - if (valueList) { - for (size_t i = 0; i < valueCount; ++i) - valueList[i] = CefV8ValueCToCpp::Unwrap(value[i]); - } - } - - // Execution - cef_function(valueCount, valueList); - - // Parameter Restoration - if (valueList) - delete [] valueList; - } - - Smart pointer vector non-const type different boundary side by reference - (refptr_vec_diff_byref): - C++: std::vector>& value - C API: size_t* valueCount, cef_post_data_element_t** value - - // CppToC Example - CEF_EXPORT void cef_function(size_t* valueCount, - cef_post_data_element_t** value) - { - // Parameter Verification - DCHECK(valueCount && (*valueCount == 0 || value)); - if (!valueCount || (*valueCount > 0 && !value)) - return; - - // Parameter Translation - std::vector> valueList; - if (valueCount && *valueCount > 0 && value) { - for (size_t i = 0; i < *valueCount; ++i) - valueList.push_back(CefPostDataElementCToCpp::Wrap(value[i])); - } - - // Execution - CefFunction(valueList); - - // Parameter Restoration - if (valueCount && value) { - *valueCount = std::min(valueList.size(), *valueCount); - if (*valueCount > 0) { - for (size_t i = 0; i < *valueCount; ++i) - value[i] = CefPostDataElementCToCpp::Unwrap(valueList[i]); - } - } - } - - // CToCpp Example - void CefFunction(std::vector& value) - { - // Parameter Translation - // Function identified by the "count_func" method attribute. - size_t valueSize = value.size(); - size_t valueCount = std::max(GetFunctionCount(), valueSize); - cef_post_data_element_t** valueList = NULL; - if (valueCount > 0) { - valueList = new cef_post_data_element_t*[valueCount]; - DCHECK(valueList); - if (valueList) - memset(valueList, 0, sizeof(cef_post_data_element_t*)*valueCount); - if (valueList && valueSize > 0) { - for (size_t i = 0; i < valueSize; ++i) { - valueList[i] = CefPostDataElementCppToC::Wrap(value[i]); - } - } - } - - // Execution - cef_function(&valueCount, valueList); - - // Parameter Restoration - value.clear(); - if (valueCount > 0 && valueList) { - for (size_t i = 0; i < valueCount; ++i) - value.push_back(CefPostDataElementCppToC::Unwrap(valueList[i])); - delete [] valueList; - } - } - - Smart pointer vector const type different boundary side by reference - (refptr_vec_diff_byref_const): - C++: const std::vector>& value - C API: size_t valueCount, const cef_v8value_t** value - - // CppToC Example - CEF_EXPORT void cef_function(size_t valueCount, - const cef_v8value_t** value) - { - // Parameter Verification - DCHECK(valueCount == 0 || value); - if (valueCount > 0 && !value) - return; - - // Parameter Translation - std::vector> valueList; - if (valueCount > 0) { - for (size_t i = 0; i < valueCount; ++i) - valueList.push_back(CefV8ValueCToCpp::Wrap(value[i])); - } - - // Execution - CefFunction(valueList); - } - - // CToCpp Example - void CefFunction(const std::vector& value) - { - // Parameter Translation - const size_t valueCount = value.size(); - cef_v8value_t** valueList = NULL; - if (valueCount > 0) { - valueList = new int[valueCount]; - DCHECK(valueList); - if (valueList) { - for (size_t i = 0; i < valueCount; ++i) - valueList[i] = CefV8ValueCppToC::Wrap(value[i]); - } - } - - // Execution - cef_function(valueCount, valueList); - - // Parameter Restoration - if (valueList) - delete [] valueList; - } - -Return Values: - - Simple/Enumeration type (simple): - C++: int - C API: int - - // CppToC Example - CEF_EXPORT int cef_function() - { - // Execution - int _rv = CefFunction(); - - // Return Translation - return _rv; - } - - // CToCpp Example - int CefFunction() - { - // Execution - int _rv = cef_function(); - - // Return Translation - return _rv; - } - - Boolean type (bool): - C++: bool - C API: int - - // CppToC Example - CEF_EXPORT int cef_function() - { - // Execution - bool _rv = CefFunction(); - - // Return Translation - return _rv; - } - - // CToCpp Example - bool CefFunction() - { - // Execution - int _rv = cef_function(); - - // Return Translation - return _rv?true:false; - } - - String non-const by reference type (string): - C++: CefString - C API: cef_string_userfree_t - - // CppToC Example - CEF_EXPORT cef_string_userfree_t cef_function() - { - // Execution - CefString _rv = CefFunction(); - - // Return Translation - return _rv.DetachToUserFree(); - } - - // CToCpp Example - CefString CefFunction() - { - // Execution - cef_string_userfree_t _rv = cef_function(); - - // Return Translation - CefString _rvStr; - _rvStr.AttachToUserFree(_rv); - return _rvStr; - } - - Smart pointer type same boundary side (refptr_same): - C++: CefRefPtr - C API: cef_browser_t* - - // CppToC Example - CEF_EXPORT cef_browser_t* cef_function() - { - // Execution - CefRefPtr _rv = CefFunction(); - - // Return Translation - return CefBrowserCppToC::Wrap(_rv); - } - - // CToCpp Example - CefString CefFunction() - { - // Execution - cef_browser_t* _rv = cef_function(); - - // Return Translation - return CefBrowserCToCpp::Wrap(_rv); - } - - Smart pointer type different boundary side (refptr_diff): - C++: CefRefPtr - C API: cef_browser_t* - - // CppToC Example - CEF_EXPORT cef_browser_t* cef_function() - { - // Execution - CefRefPtr _rv = CefFunction(); - - // Return Translation - return CefBrowserCToCpp::Unwrap(_rv); - } - - // CToCpp Example - CefString CefFunction() - { - // Execution - cef_browser_t* _rv = cef_function(); - - // Return Translation - return CefBrowserCppToC::Unwrap(_rv); - } - - -Translating Comments --------------------- - -Comments from the CEF header file are reproduced in the C API header file with -any referenced C++ types and terminology changed to reflect C API types and -terminology. - -C++: -// Create a new CefV8Value object of the specified type. These methods -// should only be called from within the JavaScript context -- either in a -// CefV8Handler::Execute() callback or a CefHandler::HandleJSBinding() -// callback. - -C API: -// Create a new cef_v8value_t object of the specified type. These functions -// should only be called from within the JavaScript context -- either in a -// cef_v8handler_t::execute() callback or a cef_handler_t::handle_jsbinding() -// callback. - -Situations where the user is responsible for freeing strings allocated and -returned by the library are also noted by comments in the C API header file. - -C API: - // The resulting string must be freed by calling cef_string_free(). - -A comment must occur immediately before the function, class or method that it -documents with no extra space in between. Comments may span multiple lines -but each line must start with the '//' comment identifier. - -C++: - // Set focus for the browser window. If |enable| is true focus will be set - // to the window. Otherwise, focus will be removed. - /*--cef()--*/ - virtual void SetFocus(bool enable) =0; - -If two comments are separated by an empty line it will be assumed that the -higher comment represents a section header and additional space will be added -before it in the translated output. - -C++: - // ARRAY METHODS - These methods are only available on arrays. - - // Returns the number of elements in the array. - /*--cef()--*/ - virtual int GetArrayLength() =0; - -Empty lines and lines with the comment identifier but no content are considered -paragraph breaks for the purposes of wrapping the translated text. Any content -indented more than one space is reproduced as-is without content translation -or wrapping. - -C++: -// Register a new V8 extension with the specified JavaScript extension code and -// handler. Functions implemented by the handler are prototyped using the -// keyword 'native'. The calling of a native function is restricted to the scope -// in which the prototype of the native function is defined. -// -// Example JavaScript extension code: -// -// // create the 'example' global object if it doesn't already exist. -// if (!example) -// example = {}; diff --git a/cef1/tools/translator.bat b/cef1/tools/translator.bat deleted file mode 100644 index 44b80f385..000000000 --- a/cef1/tools/translator.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -..\..\third_party\python_26\python.exe translator.py --cpp-header-dir ..\include --capi-header-dir ..\include\capi --cpptoc-global-impl ..\libcef_dll\libcef_dll.cc --ctocpp-global-impl ..\libcef_dll\wrapper\libcef_dll_wrapper.cc --cpptoc-dir ..\libcef_dll\cpptoc --ctocpp-dir ..\libcef_dll\ctocpp --gypi-file ..\cef_paths.gypi -pause \ No newline at end of file diff --git a/cef1/tools/translator.py b/cef1/tools/translator.py deleted file mode 100644 index ab8b584c3..000000000 --- a/cef1/tools/translator.py +++ /dev/null @@ -1,163 +0,0 @@ -# Copyright (c) 2009 The Chromium Embedded Framework 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 sys -from cef_parser import * -from make_capi_header import * -from make_cpptoc_header import * -from make_cpptoc_impl import * -from make_ctocpp_header import * -from make_ctocpp_impl import * -from make_gypi_file import * -from optparse import OptionParser - - -# cannot be loaded as a module -if __name__ != "__main__": - sys.stderr.write('This file cannot be loaded as a module!') - sys.exit() - - -# parse command-line options -disc = """ -This utility generates files for the CEF C++ to C API translation layer. -""" - -parser = OptionParser(description=disc) -parser.add_option('--cpp-header-dir', dest='cppheaderdir', metavar='DIR', - help='input directory for C++ header files [required]') -parser.add_option('--capi-header-dir', dest='capiheaderdir', metavar='DIR', - help='output directory for C API header files') -parser.add_option('--cpptoc-global-impl', dest='cpptocglobalimpl', metavar='FILE', - help='input/output file for CppToC global translations') -parser.add_option('--ctocpp-global-impl', dest='ctocppglobalimpl', metavar='FILE', - help='input/output file for CppToC global translations') -parser.add_option('--cpptoc-dir', dest='cpptocdir', metavar='DIR', - help='input/output directory for CppToC class translations') -parser.add_option('--ctocpp-dir', dest='ctocppdir', metavar='DIR', - help='input/output directory for CppToC class translations') -parser.add_option('--gypi-file', dest='gypifile', metavar='FILE', - help='output file for path information') -parser.add_option('--no-cpptoc-header', - action='store_true', dest='nocpptocheader', default=False, - help='do not output the CppToC headers') -parser.add_option('--no-cpptoc-impl', - action='store_true', dest='nocpptocimpl', default=False, - help='do not output the CppToC implementations') -parser.add_option('--no-ctocpp-header', - action='store_true', dest='noctocppheader', default=False, - help='do not output the CToCpp headers') -parser.add_option('--no-ctocpp-impl', - action='store_true', dest='noctocppimpl', default=False, - help='do not output the CToCpp implementations') -parser.add_option('--no-backup', - action='store_true', dest='nobackup', default=False, - help='do not create a backup of modified files') -parser.add_option('-c', '--classes', dest='classes', action='append', - help='only translate the specified classes') -parser.add_option('-q', '--quiet', - action='store_true', dest='quiet', default=False, - help='do not output detailed status information') -(options, args) = parser.parse_args() - -# the cppheader option is required -if options.cppheaderdir is None: - parser.print_help(sys.stdout) - sys.exit() - -# make sure the header exists -if not path_exists(options.cppheaderdir): - sys.stderr.write('File '+options.cppheaderdir+' does not exist.') - sys.exit() - -# create the header object -if not options.quiet: - sys.stdout.write('Parsing C++ headers from '+options.cppheaderdir+'...\n') -header = obj_header() -header.add_directory(options.cppheaderdir) - -writect = 0 - -if not options.capiheaderdir is None: - #output the C API header - if not options.quiet: - sys.stdout.write('In C API header directory '+options.capiheaderdir+'...\n') - filenames = sorted(header.get_file_names()) - for filename in filenames: - if not options.quiet: - sys.stdout.write('Generating '+filename+' C API header...\n') - writect += write_capi_header(header, - os.path.join(options.capiheaderdir, filename), - not options.nobackup) - -# build the list of classes to parse -allclasses = header.get_class_names() -if not options.classes is None: - for cls in options.classes: - if not cls in allclasses: - sys.stderr.write('ERROR: Unknown class: '+cls) - sys.exit() - classes = options.classes -else: - classes = allclasses - -classes = sorted(classes) - -if not options.cpptocglobalimpl is None: - # output CppToC global file - if not options.quiet: - sys.stdout.write('Generating CppToC global implementation...\n') - writect += write_cpptoc_impl(header, None, options.cpptocglobalimpl, \ - not options.nobackup) - -if not options.ctocppglobalimpl is None: - # output CToCpp global file - if not options.quiet: - sys.stdout.write('Generating CToCpp global implementation...\n') - writect += write_ctocpp_impl(header, None, options.ctocppglobalimpl, \ - not options.nobackup) - -if not options.cpptocdir is None: - # output CppToC class files - if not options.quiet: - sys.stdout.write('In CppToC directory '+options.cpptocdir+'...\n') - - for cls in classes: - if not options.nocpptocheader: - if not options.quiet: - sys.stdout.write('Generating '+cls+'CppToC class header...\n') - writect += write_cpptoc_header(header, cls, options.cpptocdir, - not options.nobackup) - if not options.nocpptocimpl: - if not options.quiet: - sys.stdout.write('Generating '+cls+'CppToC class implementation...\n') - writect += write_cpptoc_impl(header, cls, options.cpptocdir, - not options.nobackup) - -if not options.ctocppdir is None: - # output CppToC class files - if not options.quiet: - sys.stdout.write('In CToCpp directory '+options.ctocppdir+'...\n') - for cls in classes: - if not options.nocpptocheader: - if not options.quiet: - sys.stdout.write('Generating '+cls+'CToCpp class header...\n') - writect += write_ctocpp_header(header, cls, options.ctocppdir, - not options.nobackup) - if not options.nocpptocimpl: - if not options.quiet: - sys.stdout.write('Generating '+cls+'CToCpp class implementation...\n') - writect += write_ctocpp_impl(header, cls, options.ctocppdir, - not options.nobackup) - -if not options.gypifile is None: - # output the gypi file - if not options.quiet: - sys.stdout.write('Generating '+options.gypifile+' file...\n') - writect += write_gypi_file(header, options.gypifile, not options.nobackup) - -if not options.quiet: - sys.stdout.write('Done - Wrote '+str(writect)+' files.\n') - - diff --git a/cef1/tools/translator.sh b/cef1/tools/translator.sh deleted file mode 100755 index abd1c6e91..000000000 --- a/cef1/tools/translator.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -python translator.py --cpp-header-dir ../include --capi-header-dir ../include/capi --cpptoc-global-impl ../libcef_dll/libcef_dll.cc --ctocpp-global-impl ../libcef_dll/wrapper/libcef_dll_wrapper.cc --cpptoc-dir ../libcef_dll/cpptoc --ctocpp-dir ../libcef_dll/ctocpp --gypi-file ../cef_paths.gypi
      Chromium Embedded Framework (CEF) Copyright © 2011 Marshall A. Greenblatt