diff --git a/cef.sln b/cef.sln index b48e1ea85..5950e827a 100644 --- a/cef.sln +++ b/cef.sln @@ -4,25 +4,25 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebKit (readonly)", "WebKit EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WebCore", "..\webkit\build\WebCore\WebCore.vcproj", "{1C16337B-ACF3-4D03-AA90-851C5B5EADA6}" ProjectSection(ProjectDependencies) = postProject - {6EAD4A4B-2BBC-4974-8E45-BB5C16CC2AC9} = {6EAD4A4B-2BBC-4974-8E45-BB5C16CC2AC9} - {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} = {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} - {1444235E-0E97-4C80-A73E-EE73F3706C32} = {1444235E-0E97-4C80-A73E-EE73F3706C32} {2E2D3301-2EC4-4C0F-B889-87073B30F673} = {2E2D3301-2EC4-4C0F-B889-87073B30F673} + {1444235E-0E97-4C80-A73E-EE73F3706C32} = {1444235E-0E97-4C80-A73E-EE73F3706C32} + {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} = {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} + {6EAD4A4B-2BBC-4974-8E45-BB5C16CC2AC9} = {6EAD4A4B-2BBC-4974-8E45-BB5C16CC2AC9} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Port", "..\webkit\build\port\port.vcproj", "{5597AD47-3494-4750-A235-4F9C2F864700}" ProjectSection(ProjectDependencies) = postProject - {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} = {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} {2E2D3301-2EC4-4C0F-B889-87073B30F673} = {2E2D3301-2EC4-4C0F-B889-87073B30F673} + {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} = {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Glue", "..\webkit\glue\glue.vcproj", "{C66B126D-0ECE-4CA2-B6DC-FA780AFBBF09}" ProjectSection(ProjectDependencies) = postProject - {1444235E-0E97-4C80-A73E-EE73F3706C32} = {1444235E-0E97-4C80-A73E-EE73F3706C32} - {60B43839-95E6-4526-A661-209F16335E0E} = {60B43839-95E6-4526-A661-209F16335E0E} - {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} = {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} - {0B469837-3D46-484A-AFB3-C5A6C68730B9} = {0B469837-3D46-484A-AFB3-C5A6C68730B9} {2E2D3301-2EC4-4C0F-B889-87073B30F673} = {2E2D3301-2EC4-4C0F-B889-87073B30F673} + {0B469837-3D46-484A-AFB3-C5A6C68730B9} = {0B469837-3D46-484A-AFB3-C5A6C68730B9} + {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} = {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} + {60B43839-95E6-4526-A661-209F16335E0E} = {60B43839-95E6-4526-A661-209F16335E0E} + {1444235E-0E97-4C80-A73E-EE73F3706C32} = {1444235E-0E97-4C80-A73E-EE73F3706C32} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "skia", "..\skia\skia.vcproj", "{CD9CA56E-4E94-444C-87D4-58CA1E6F300D}" @@ -64,8 +64,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libxslt", "..\third_party\l EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "V8Bindings", "..\webkit\build\V8Bindings\V8Bindings.vcproj", "{625A8F11-2B4E-45B4-BD99-C6D629C606C0}" ProjectSection(ProjectDependencies) = postProject - {2E2D3301-2EC4-4C0F-B889-87073B30F673} = {2E2D3301-2EC4-4C0F-B889-87073B30F673} {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} = {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} + {2E2D3301-2EC4-4C0F-B889-87073B30F673} = {2E2D3301-2EC4-4C0F-B889-87073B30F673} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bzip2", "..\third_party\bzip2\bzip2.vcproj", "{2A70CBF0-847E-4E3A-B926-542A656DC7FE}" @@ -73,33 +73,34 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcef", "libcef\libcef.vcproj", "{FA39524D-3067-4141-888D-28A86C66F2B9}" ProjectSection(ProjectDependencies) = postProject {60B43839-95E6-4526-A661-209F16335E0E} = {60B43839-95E6-4526-A661-209F16335E0E} - {0B469837-3D46-484A-AFB3-C5A6C68730B9} = {0B469837-3D46-484A-AFB3-C5A6C68730B9} - {EC8B7909-62AF-470D-A75D-E1D89C837142} = {EC8B7909-62AF-470D-A75D-E1D89C837142} - {21E22961-22BF-4493-BD3A-868F93DA5179} = {21E22961-22BF-4493-BD3A-868F93DA5179} - {1832A374-8A74-4F9E-B536-69A699B3E165} = {1832A374-8A74-4F9E-B536-69A699B3E165} - {238CE175-76CE-4A25-A676-69D115885601} = {238CE175-76CE-4A25-A676-69D115885601} - {1C16337B-ACF3-4D03-AA90-851C5B5EADA6} = {1C16337B-ACF3-4D03-AA90-851C5B5EADA6} - {326E9795-E760-410A-B69A-3F79DB3F5243} = {326E9795-E760-410A-B69A-3F79DB3F5243} - {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} = {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} - {FC0E1FD0-5DD7-4041-A1C9-CD3C376E4EED} = {FC0E1FD0-5DD7-4041-A1C9-CD3C376E4EED} - {F54ABC59-5C00-414A-A9BA-BAF26D1699F0} = {F54ABC59-5C00-414A-A9BA-BAF26D1699F0} - {F4F4BCAA-EA59-445C-A119-3E6C29647A51} = {F4F4BCAA-EA59-445C-A119-3E6C29647A51} - {EF5E94AB-B646-4E5B-A058-52EF07B8351C} = {EF5E94AB-B646-4E5B-A058-52EF07B8351C} - {CD9CA56E-4E94-444C-87D4-58CA1E6F300D} = {CD9CA56E-4E94-444C-87D4-58CA1E6F300D} - {C66B126D-0ECE-4CA2-B6DC-FA780AFBBF09} = {C66B126D-0ECE-4CA2-B6DC-FA780AFBBF09} - {C564F145-9172-42C3-BFCB-6014CA97DBCD} = {C564F145-9172-42C3-BFCB-6014CA97DBCD} - {C0334F9A-1168-4101-9DD8-C30FB252D435} = {C0334F9A-1168-4101-9DD8-C30FB252D435} - {B55CA863-B374-4BAF-95AC-539E4FA4C90C} = {B55CA863-B374-4BAF-95AC-539E4FA4C90C} - {AA8A5A85-592B-4357-BC60-E0E91E026AF6} = {AA8A5A85-592B-4357-BC60-E0E91E026AF6} - {A508ADD3-CECE-4E0F-8448-2F5E454DF551} = {A508ADD3-CECE-4E0F-8448-2F5E454DF551} - {8C27D792-2648-4F5E-9ED0-374276327308} = {8C27D792-2648-4F5E-9ED0-374276327308} - {8423AF0D-4B88-4EBF-94E1-E4D00D00E21C} = {8423AF0D-4B88-4EBF-94E1-E4D00D00E21C} - {7100F41F-868D-4E99-80A2-AF8E6574749D} = {7100F41F-868D-4E99-80A2-AF8E6574749D} - {625A8F11-2B4E-45B4-BD99-C6D629C606C0} = {625A8F11-2B4E-45B4-BD99-C6D629C606C0} - {5916D37D-8C97-424F-A904-74E52594C2D6} = {5916D37D-8C97-424F-A904-74E52594C2D6} - {5597AD47-3494-4750-A235-4F9C2F864700} = {5597AD47-3494-4750-A235-4F9C2F864700} - {49909552-0B0C-4C14-8CF6-DB8A2ADE0934} = {49909552-0B0C-4C14-8CF6-DB8A2ADE0934} + {5ECEC9E5-8F23-47B6-93E0-C3B328B3BE65} = {5ECEC9E5-8F23-47B6-93E0-C3B328B3BE65} {2A70CBF0-847E-4E3A-B926-542A656DC7FE} = {2A70CBF0-847E-4E3A-B926-542A656DC7FE} + {49909552-0B0C-4C14-8CF6-DB8A2ADE0934} = {49909552-0B0C-4C14-8CF6-DB8A2ADE0934} + {5597AD47-3494-4750-A235-4F9C2F864700} = {5597AD47-3494-4750-A235-4F9C2F864700} + {5916D37D-8C97-424F-A904-74E52594C2D6} = {5916D37D-8C97-424F-A904-74E52594C2D6} + {625A8F11-2B4E-45B4-BD99-C6D629C606C0} = {625A8F11-2B4E-45B4-BD99-C6D629C606C0} + {7100F41F-868D-4E99-80A2-AF8E6574749D} = {7100F41F-868D-4E99-80A2-AF8E6574749D} + {8423AF0D-4B88-4EBF-94E1-E4D00D00E21C} = {8423AF0D-4B88-4EBF-94E1-E4D00D00E21C} + {8C27D792-2648-4F5E-9ED0-374276327308} = {8C27D792-2648-4F5E-9ED0-374276327308} + {A508ADD3-CECE-4E0F-8448-2F5E454DF551} = {A508ADD3-CECE-4E0F-8448-2F5E454DF551} + {AA8A5A85-592B-4357-BC60-E0E91E026AF6} = {AA8A5A85-592B-4357-BC60-E0E91E026AF6} + {B55CA863-B374-4BAF-95AC-539E4FA4C90C} = {B55CA863-B374-4BAF-95AC-539E4FA4C90C} + {C0334F9A-1168-4101-9DD8-C30FB252D435} = {C0334F9A-1168-4101-9DD8-C30FB252D435} + {C564F145-9172-42C3-BFCB-6014CA97DBCD} = {C564F145-9172-42C3-BFCB-6014CA97DBCD} + {C66B126D-0ECE-4CA2-B6DC-FA780AFBBF09} = {C66B126D-0ECE-4CA2-B6DC-FA780AFBBF09} + {CD9CA56E-4E94-444C-87D4-58CA1E6F300D} = {CD9CA56E-4E94-444C-87D4-58CA1E6F300D} + {EF5E94AB-B646-4E5B-A058-52EF07B8351C} = {EF5E94AB-B646-4E5B-A058-52EF07B8351C} + {F4F4BCAA-EA59-445C-A119-3E6C29647A51} = {F4F4BCAA-EA59-445C-A119-3E6C29647A51} + {F54ABC59-5C00-414A-A9BA-BAF26D1699F0} = {F54ABC59-5C00-414A-A9BA-BAF26D1699F0} + {FC0E1FD0-5DD7-4041-A1C9-CD3C376E4EED} = {FC0E1FD0-5DD7-4041-A1C9-CD3C376E4EED} + {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} = {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} + {326E9795-E760-410A-B69A-3F79DB3F5243} = {326E9795-E760-410A-B69A-3F79DB3F5243} + {1C16337B-ACF3-4D03-AA90-851C5B5EADA6} = {1C16337B-ACF3-4D03-AA90-851C5B5EADA6} + {238CE175-76CE-4A25-A676-69D115885601} = {238CE175-76CE-4A25-A676-69D115885601} + {1832A374-8A74-4F9E-B536-69A699B3E165} = {1832A374-8A74-4F9E-B536-69A699B3E165} + {21E22961-22BF-4493-BD3A-868F93DA5179} = {21E22961-22BF-4493-BD3A-868F93DA5179} + {EC8B7909-62AF-470D-A75D-E1D89C837142} = {EC8B7909-62AF-470D-A75D-E1D89C837142} + {0B469837-3D46-484A-AFB3-C5A6C68730B9} = {0B469837-3D46-484A-AFB3-C5A6C68730B9} EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "V8", "V8", "{B353A6A5-9551-4B76-908E-0F0A9B31E4CE}" @@ -110,14 +111,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "modp_b64", "..\third_party\ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "activex_shim", "..\webkit\activex_shim\activex_shim.vcproj", "{F4F4BCAA-EA59-445C-A119-3E6C29647A51}" ProjectSection(ProjectDependencies) = postProject - {EF5E94AB-B646-4E5B-A058-52EF07B8351C} = {EF5E94AB-B646-4E5B-A058-52EF07B8351C} {8C27D792-2648-4F5E-9ED0-374276327308} = {8C27D792-2648-4F5E-9ED0-374276327308} + {EF5E94AB-B646-4E5B-A058-52EF07B8351C} = {EF5E94AB-B646-4E5B-A058-52EF07B8351C} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "net", "..\net\build\net.vcproj", "{326E9795-E760-410A-B69A-3F79DB3F5243}" ProjectSection(ProjectDependencies) = postProject - {E13045CD-7E1F-4A41-9B18-8D288B2E7B41} = {E13045CD-7E1F-4A41-9B18-8D288B2E7B41} {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} = {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} + {E13045CD-7E1F-4A41-9B18-8D288B2E7B41} = {E13045CD-7E1F-4A41-9B18-8D288B2E7B41} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "base", "..\base\build\base.vcproj", "{1832A374-8A74-4F9E-B536-69A699B3E165}" @@ -138,8 +139,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "V8Bindings_prebuild", "..\w EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "v8_snapshot", "..\v8\tools\visual_studio\v8_snapshot.vcproj", "{C0334F9A-1168-4101-9DD8-C30FB252D435}" ProjectSection(ProjectDependencies) = postProject - {0DDBDA8B-A49F-4CC7-A1D5-5BB8297C8A3F} = {0DDBDA8B-A49F-4CC7-A1D5-5BB8297C8A3F} {865575D0-37E2-405E-8CBA-5F6C485B5A26} = {865575D0-37E2-405E-8CBA-5F6C485B5A26} + {0DDBDA8B-A49F-4CC7-A1D5-5BB8297C8A3F} = {0DDBDA8B-A49F-4CC7-A1D5-5BB8297C8A3F} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sdch", "..\sdch\sdch.vcproj", "{F54ABC59-5C00-414A-A9BA-BAF26D1699F0}" @@ -150,9 +151,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{A507014E EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tld_cleanup", "..\net\build\tld_cleanup.vcproj", "{E13045CD-7E1F-4A41-9B18-8D288B2E7B41}" ProjectSection(ProjectDependencies) = postProject - {1832A374-8A74-4F9E-B536-69A699B3E165} = {1832A374-8A74-4F9E-B536-69A699B3E165} - {8C27D792-2648-4F5E-9ED0-374276327308} = {8C27D792-2648-4F5E-9ED0-374276327308} {EF5E94AB-B646-4E5B-A058-52EF07B8351C} = {EF5E94AB-B646-4E5B-A058-52EF07B8351C} + {8C27D792-2648-4F5E-9ED0-374276327308} = {8C27D792-2648-4F5E-9ED0-374276327308} + {1832A374-8A74-4F9E-B536-69A699B3E165} = {1832A374-8A74-4F9E-B536-69A699B3E165} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "v8_mksnapshot", "..\v8\tools\visual_studio\v8_mksnapshot.vcproj", "{865575D0-37E2-405E-8CBA-5F6C485B5A26}" @@ -173,8 +174,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "webkit_strings", "..\webkit EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cefclient", "tests\cefclient\cefclient.vcproj", "{6617FED9-C5D4-4907-BF55-A90062A6683F}" ProjectSection(ProjectDependencies) = postProject - {C13650D5-CF1A-4259-BE45-B1EBA6280E47} = {C13650D5-CF1A-4259-BE45-B1EBA6280E47} {A9D6DC71-C0DC-4549-AEA0-3B15B44E86A9} = {A9D6DC71-C0DC-4549-AEA0-3B15B44E86A9} + {C13650D5-CF1A-4259-BE45-B1EBA6280E47} = {C13650D5-CF1A-4259-BE45-B1EBA6280E47} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "icudt", "..\third_party\icu38\build\icudt.vcproj", "{A0D94973-D355-47A5-A1E2-3456F321F010}" @@ -192,48 +193,48 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "v8_snapshot_cc", "..\v8\too EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcef_dll", "libcef_dll\libcef_dll.vcproj", "{C13650D5-CF1A-4259-BE45-B1EBA6280E47}" ProjectSection(ProjectDependencies) = postProject - {2A70CBF0-847E-4E3A-B926-542A656DC7FE} = {2A70CBF0-847E-4E3A-B926-542A656DC7FE} - {A508ADD3-CECE-4E0F-8448-2F5E454DF551} = {A508ADD3-CECE-4E0F-8448-2F5E454DF551} - {FC0E1FD0-5DD7-4041-A1C9-CD3C376E4EED} = {FC0E1FD0-5DD7-4041-A1C9-CD3C376E4EED} - {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} = {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} - {EF5E94AB-B646-4E5B-A058-52EF07B8351C} = {EF5E94AB-B646-4E5B-A058-52EF07B8351C} - {F4F4BCAA-EA59-445C-A119-3E6C29647A51} = {F4F4BCAA-EA59-445C-A119-3E6C29647A51} - {C0334F9A-1168-4101-9DD8-C30FB252D435} = {C0334F9A-1168-4101-9DD8-C30FB252D435} - {326E9795-E760-410A-B69A-3F79DB3F5243} = {326E9795-E760-410A-B69A-3F79DB3F5243} - {8C27D792-2648-4F5E-9ED0-374276327308} = {8C27D792-2648-4F5E-9ED0-374276327308} - {AA8A5A85-592B-4357-BC60-E0E91E026AF6} = {AA8A5A85-592B-4357-BC60-E0E91E026AF6} - {5916D37D-8C97-424F-A904-74E52594C2D6} = {5916D37D-8C97-424F-A904-74E52594C2D6} - {1C16337B-ACF3-4D03-AA90-851C5B5EADA6} = {1C16337B-ACF3-4D03-AA90-851C5B5EADA6} - {238CE175-76CE-4A25-A676-69D115885601} = {238CE175-76CE-4A25-A676-69D115885601} - {1832A374-8A74-4F9E-B536-69A699B3E165} = {1832A374-8A74-4F9E-B536-69A699B3E165} - {CD9CA56E-4E94-444C-87D4-58CA1E6F300D} = {CD9CA56E-4E94-444C-87D4-58CA1E6F300D} - {C66B126D-0ECE-4CA2-B6DC-FA780AFBBF09} = {C66B126D-0ECE-4CA2-B6DC-FA780AFBBF09} - {B55CA863-B374-4BAF-95AC-539E4FA4C90C} = {B55CA863-B374-4BAF-95AC-539E4FA4C90C} - {21E22961-22BF-4493-BD3A-868F93DA5179} = {21E22961-22BF-4493-BD3A-868F93DA5179} - {F54ABC59-5C00-414A-A9BA-BAF26D1699F0} = {F54ABC59-5C00-414A-A9BA-BAF26D1699F0} - {FA39524D-3067-4141-888D-28A86C66F2B9} = {FA39524D-3067-4141-888D-28A86C66F2B9} - {5597AD47-3494-4750-A235-4F9C2F864700} = {5597AD47-3494-4750-A235-4F9C2F864700} - {C564F145-9172-42C3-BFCB-6014CA97DBCD} = {C564F145-9172-42C3-BFCB-6014CA97DBCD} - {60B43839-95E6-4526-A661-209F16335E0E} = {60B43839-95E6-4526-A661-209F16335E0E} - {0B469837-3D46-484A-AFB3-C5A6C68730B9} = {0B469837-3D46-484A-AFB3-C5A6C68730B9} - {7100F41F-868D-4E99-80A2-AF8E6574749D} = {7100F41F-868D-4E99-80A2-AF8E6574749D} - {625A8F11-2B4E-45B4-BD99-C6D629C606C0} = {625A8F11-2B4E-45B4-BD99-C6D629C606C0} - {8423AF0D-4B88-4EBF-94E1-E4D00D00E21C} = {8423AF0D-4B88-4EBF-94E1-E4D00D00E21C} - {EC8B7909-62AF-470D-A75D-E1D89C837142} = {EC8B7909-62AF-470D-A75D-E1D89C837142} {5ECEC9E5-8F23-47B6-93E0-C3B328B3BE65} = {5ECEC9E5-8F23-47B6-93E0-C3B328B3BE65} + {EC8B7909-62AF-470D-A75D-E1D89C837142} = {EC8B7909-62AF-470D-A75D-E1D89C837142} + {8423AF0D-4B88-4EBF-94E1-E4D00D00E21C} = {8423AF0D-4B88-4EBF-94E1-E4D00D00E21C} + {625A8F11-2B4E-45B4-BD99-C6D629C606C0} = {625A8F11-2B4E-45B4-BD99-C6D629C606C0} + {7100F41F-868D-4E99-80A2-AF8E6574749D} = {7100F41F-868D-4E99-80A2-AF8E6574749D} + {0B469837-3D46-484A-AFB3-C5A6C68730B9} = {0B469837-3D46-484A-AFB3-C5A6C68730B9} + {60B43839-95E6-4526-A661-209F16335E0E} = {60B43839-95E6-4526-A661-209F16335E0E} + {C564F145-9172-42C3-BFCB-6014CA97DBCD} = {C564F145-9172-42C3-BFCB-6014CA97DBCD} + {5597AD47-3494-4750-A235-4F9C2F864700} = {5597AD47-3494-4750-A235-4F9C2F864700} + {FA39524D-3067-4141-888D-28A86C66F2B9} = {FA39524D-3067-4141-888D-28A86C66F2B9} + {F54ABC59-5C00-414A-A9BA-BAF26D1699F0} = {F54ABC59-5C00-414A-A9BA-BAF26D1699F0} + {21E22961-22BF-4493-BD3A-868F93DA5179} = {21E22961-22BF-4493-BD3A-868F93DA5179} + {B55CA863-B374-4BAF-95AC-539E4FA4C90C} = {B55CA863-B374-4BAF-95AC-539E4FA4C90C} + {C66B126D-0ECE-4CA2-B6DC-FA780AFBBF09} = {C66B126D-0ECE-4CA2-B6DC-FA780AFBBF09} + {CD9CA56E-4E94-444C-87D4-58CA1E6F300D} = {CD9CA56E-4E94-444C-87D4-58CA1E6F300D} + {1832A374-8A74-4F9E-B536-69A699B3E165} = {1832A374-8A74-4F9E-B536-69A699B3E165} + {238CE175-76CE-4A25-A676-69D115885601} = {238CE175-76CE-4A25-A676-69D115885601} + {1C16337B-ACF3-4D03-AA90-851C5B5EADA6} = {1C16337B-ACF3-4D03-AA90-851C5B5EADA6} + {5916D37D-8C97-424F-A904-74E52594C2D6} = {5916D37D-8C97-424F-A904-74E52594C2D6} + {AA8A5A85-592B-4357-BC60-E0E91E026AF6} = {AA8A5A85-592B-4357-BC60-E0E91E026AF6} + {8C27D792-2648-4F5E-9ED0-374276327308} = {8C27D792-2648-4F5E-9ED0-374276327308} + {326E9795-E760-410A-B69A-3F79DB3F5243} = {326E9795-E760-410A-B69A-3F79DB3F5243} + {C0334F9A-1168-4101-9DD8-C30FB252D435} = {C0334F9A-1168-4101-9DD8-C30FB252D435} + {F4F4BCAA-EA59-445C-A119-3E6C29647A51} = {F4F4BCAA-EA59-445C-A119-3E6C29647A51} + {EF5E94AB-B646-4E5B-A058-52EF07B8351C} = {EF5E94AB-B646-4E5B-A058-52EF07B8351C} + {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} = {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} + {FC0E1FD0-5DD7-4041-A1C9-CD3C376E4EED} = {FC0E1FD0-5DD7-4041-A1C9-CD3C376E4EED} + {A508ADD3-CECE-4E0F-8448-2F5E454DF551} = {A508ADD3-CECE-4E0F-8448-2F5E454DF551} + {2A70CBF0-847E-4E3A-B926-542A656DC7FE} = {2A70CBF0-847E-4E3A-B926-542A656DC7FE} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcef_dll_wrapper", "libcef_dll\wrapper\libcef_dll_wrapper.vcproj", "{A9D6DC71-C0DC-4549-AEA0-3B15B44E86A9}" ProjectSection(ProjectDependencies) = postProject - {C13650D5-CF1A-4259-BE45-B1EBA6280E47} = {C13650D5-CF1A-4259-BE45-B1EBA6280E47} {1832A374-8A74-4F9E-B536-69A699B3E165} = {1832A374-8A74-4F9E-B536-69A699B3E165} + {C13650D5-CF1A-4259-BE45-B1EBA6280E47} = {C13650D5-CF1A-4259-BE45-B1EBA6280E47} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WebKit", "..\webkit\build\WebKit\WebKit.vcproj", "{5ECEC9E5-8F23-47B6-93E0-C3B328B3BE65}" ProjectSection(ProjectDependencies) = postProject - {2E2D3301-2EC4-4C0F-B889-87073B30F673} = {2E2D3301-2EC4-4C0F-B889-87073B30F673} - {1444235E-0E97-4C80-A73E-EE73F3706C32} = {1444235E-0E97-4C80-A73E-EE73F3706C32} {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} = {2F7EDFA2-EE27-4D83-8454-9EFBD5779203} + {1444235E-0E97-4C80-A73E-EE73F3706C32} = {1444235E-0E97-4C80-A73E-EE73F3706C32} + {2E2D3301-2EC4-4C0F-B889-87073B30F673} = {2E2D3301-2EC4-4C0F-B889-87073B30F673} EndProjectSection EndProject Global diff --git a/include/cef.h b/include/cef.h index ced662e41..db45832a2 100644 --- a/include/cef.h +++ b/include/cef.h @@ -75,6 +75,9 @@ public: // 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; }; @@ -112,18 +115,18 @@ public: { m_dwRef = 0L; } - ~CefThreadSafeBase() + virtual ~CefThreadSafeBase() { } // Atomic reference increment. - int AddRef() + virtual int AddRef() { return CefAtomicIncrement(&m_dwRef); } // Atomic reference decrement. Delete this object when no references remain. - int Release() + virtual int Release() { int retval = CefAtomicDecrement(&m_dwRef); if(retval == 0) @@ -131,6 +134,9 @@ public: return retval; } + // Return the current number of references. + virtual int GetRefCt() { return m_dwRef; } + // Use the Lock() and Unlock() methods to protect a section of code from // simultaneous access by multiple threads. void Lock() { m_critsec.Lock(); } @@ -166,6 +172,15 @@ public: CefRefPtr handler, const std::wstring& url); + // Create a new browser window using the window parameters specified + // by |windowInfo|. The |popup| parameter should be true if the new window is + // a popup window. This method call will block and can only be used if + // the |multi_threaded_message_loop| parameter to CefInitialize() is false. + static CefRefPtr CreateBrowserSync(CefWindowInfo& windowInfo, + bool popup, + CefRefPtr handler, + const std::wstring& url); + // Returns true if the browser can navigate backwards. virtual bool CanGoBack() =0; // Navigate backwards. @@ -198,6 +213,10 @@ public: // Execute select all in the target frame. virtual void SelectAll(TargetFrame targetFrame) =0; + // Set focus for the browser window. If |enable| is true focus will be set + // to the window. Otherwise, focus will be removed. + virtual void SetFocus(bool enable) =0; + // Execute printing in the target frame. The user will be prompted with // the print dialog appropriate to the operating system. virtual void Print(TargetFrame targetFrame) =0; @@ -420,6 +439,15 @@ public: bool& retval, std::wstring& result) =0; + // Called just before a window is closed. The return value is currently + // ignored. + virtual RetVal HandleBeforeWindowClose(CefRefPtr browser) =0; + + // 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. + // The return value is currently ignored. + virtual RetVal HandleTakeFocus(CefRefPtr browser, + bool reverse) =0; }; diff --git a/include/cef_capi.h b/include/cef_capi.h index e710833e3..4a380d60f 100644 --- a/include/cef_capi.h +++ b/include/cef_capi.h @@ -73,6 +73,8 @@ typedef struct _cef_base_t // Decrement the reference count. Delete this object when no references // remain. int (CEF_CALLBACK *release)(struct _cef_base_t* base); + // Returns the current number of references. + int (CEF_CALLBACK *get_refct)(struct _cef_base_t* base); } cef_base_t; @@ -125,6 +127,10 @@ typedef struct _cef_browser_t void (CEF_CALLBACK *select_all)(struct _cef_browser_t* browser, enum cef_targetframe_t targetFrame); + // 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* browser, int enable); + // Execute printing in the target frame. The user will be prompted with // the print dialog appropriate to the operating system. void (CEF_CALLBACK *print)(struct _cef_browser_t* browser, @@ -348,6 +354,17 @@ typedef struct _cef_handler_t const wchar_t* message, const wchar_t* defaultValue, int* retval, cef_string_t* result); + // Called just before a window is closed. The return value is currently + // ignored. + enum cef_retval_t (CEF_CALLBACK *handle_before_window_close)( + struct _cef_handler_t* handler, cef_browser_t* browser); + + // 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. + // The return value is currently ignored. + enum cef_retval_t (CEF_CALLBACK *handle_take_focus)( + struct _cef_handler_t* handler, cef_browser_t* browser, int reverse); + } cef_handler_t; @@ -599,6 +616,15 @@ typedef struct _cef_variant_t CEF_EXPORT int cef_create_browser(cef_window_info_t* windowInfo, int popup, cef_handler_t* handler, const wchar_t* url); +// Create a new browser window using the window parameters specified +// by |windowInfo|. The |popup| parameter should be true (1) if the new window +// is a popup window. This method call will block and can only be used if +// the |multi_threaded_message_loop| parameter to CefInitialize() is false. +CEF_EXPORT cef_browser_t* cef_create_browser_sync(cef_window_info_t* windowInfo, + int popup, + cef_handler_t* handler, + const wchar_t* url); + // Create a new request structure. CEF_EXPORT cef_request_t* cef_create_request(); diff --git a/include/cef_win.h b/include/cef_win.h index 9bac209da..1e2c5ab3c 100644 --- a/include/cef_win.h +++ b/include/cef_win.h @@ -78,6 +78,11 @@ public: cef_string_free(m_windowName); } + CefWindowInfo(const CefWindowInfo& r) + { + Init(); + *this = r; + } CefWindowInfo(const cef_window_info_t& r) { Init(); @@ -98,6 +103,10 @@ public: m_hWnd = NULL; } + CefWindowInfo& operator=(const CefWindowInfo& r) + { + return operator=(static_cast(r)); + } CefWindowInfo& operator=(const cef_window_info_t& r) { m_dwExStyle = r.m_dwExStyle; @@ -159,6 +168,11 @@ public: { } + CefPrintInfo(const CefPrintInfo& r) + { + Init(); + *this = r; + } CefPrintInfo(const cef_print_info_t& r) { Init(); @@ -172,6 +186,10 @@ public: m_Scale = 0; } + CefPrintInfo& operator=(const CefPrintInfo& r) + { + return operator=(static_cast(r)); + } CefPrintInfo& operator=(const cef_print_info_t& r) { m_hDC = r.m_hDC; diff --git a/libcef/browser_impl.cc b/libcef/browser_impl.cc index b7ff4feff..624d3bece 100644 --- a/libcef/browser_impl.cc +++ b/libcef/browser_impl.cc @@ -33,6 +33,7 @@ CefBrowserImpl::~CefBrowserImpl() if(webview_bitmap_ != NULL) DeleteObject(webview_bitmap_); #endif + RemoveAllJSHandlers(); } void CefBrowserImpl::GoBack() @@ -111,6 +112,20 @@ void CefBrowserImpl::SelectAll(TargetFrame targetFrame) MENU_ID_SELECTALL, targetFrame)); } +void CefBrowserImpl::SetFocus(bool enable) +{ + if (_Context->RunningOnUIThread()) + { + UIT_SetFocus(UIT_GetWebViewHost(), enable); + } + else + { + PostTask(FROM_HERE, NewRunnableMethod(this, + &CefBrowserImpl::UIT_SetFocus, + UIT_GetWebViewHost(), enable)); + } +} + void CefBrowserImpl::Print(TargetFrame targetFrame) { PostTask(FROM_HERE, NewRunnableMethod(this, @@ -279,6 +294,35 @@ bool CefBrowser::CreateBrowser(CefWindowInfo& windowInfo, bool popup, return true; } +CefRefPtr CefBrowser::CreateBrowserSync(CefWindowInfo& windowInfo, + bool popup, + CefRefPtr handler, + const std::wstring& url) +{ + if(!_Context.get() || !_Context->RunningOnUIThread()) + return NULL; + + std::wstring newUrl = url; + CefRefPtr alternateBrowser; + + if(handler.get()) + { + // Give the handler an opportunity to modify window attributes, handler, + // or cancel the window creation. + CefHandler::RetVal rv = handler->HandleBeforeCreated(NULL, windowInfo, + popup, handler, newUrl); + if(rv == RV_HANDLED) + return false; + } + + CefRefPtr browser( + new CefBrowserImpl(windowInfo, popup, handler, newUrl)); + + static_cast(browser.get())->UIT_CreateBrowser(); + + return browser; +} + void CefBrowserImpl::UIT_LoadURL(const std::wstring& url) { REQUIRE_UIT(); @@ -321,6 +365,79 @@ void CefBrowserImpl::UIT_LoadURLForRequestRef(CefRequest* request) request->Release(); } +void CefBrowserImpl::UIT_LoadURLForRequest(const std::wstring& url, + const std::wstring& frame_name, + const std::wstring& method, + net::UploadData *upload_data, + const WebRequest::HeaderMap& headers) +{ + REQUIRE_UIT(); + + if (url.empty()) + return; + + GURL gurl(url); + + if (!gurl.is_valid() && !gurl.has_scheme()) { + // Try to add "http://" at the beginning + gurl = GURL(std::wstring(L"http://") + url); + if (!gurl.is_valid()) + return; + } + + nav_controller_->LoadEntry(new BrowserNavigationEntry( + -1, gurl, std::wstring(), frame_name, method, upload_data, headers)); +} + +void CefBrowserImpl::UIT_LoadHTML(const std::wstring& html, + const std::wstring& url) +{ + REQUIRE_UIT(); + + GURL gurl(url); + + if (!gurl.is_valid() && !gurl.has_scheme()) { + // Try to add "http://" at the beginning + gurl = GURL(std::wstring(L"http://") + url); + if (!gurl.is_valid()) + return; + } + + UIT_GetWebView()->GetMainFrame()->LoadHTMLString(WideToUTF8(html), gurl); +} + +void CefBrowserImpl::UIT_LoadHTMLForStreamRef(CefStreamReader* stream, + const std::wstring& url) +{ + REQUIRE_UIT(); + + GURL gurl(url); + + if (!gurl.is_valid() && !gurl.has_scheme()) { + // Try to add "http://" at the beginning + gurl = GURL(std::wstring(L"http://") + 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); + + UIT_GetWebView()->GetMainFrame()->LoadHTMLString(ss.str(), gurl); + + stream->Release(); +} + void CefBrowserImpl::UIT_ExecuteJavaScript(const std::wstring& js_code, const std::wstring& script_url, int start_line, @@ -439,8 +556,8 @@ CefRefPtr CefBrowserImpl::UIT_CreatePopupWindow(const std::wstri return NULL; } - CefRefPtr browser( - new CefBrowserImpl(info, true, handler, newUrl)); + CefRefPtr browser( + new CefBrowserImpl(info, true, handler, newUrl)); browser->UIT_CreateBrowser(); return browser; diff --git a/libcef/browser_impl.h b/libcef/browser_impl.h index f0b898205..915e47f49 100644 --- a/libcef/browser_impl.h +++ b/libcef/browser_impl.h @@ -19,6 +19,7 @@ #include "webkit/glue/webview.h" +#define BUFFER_SIZE 32768 // Implementation of CefBrowser. class CefBrowserImpl : public CefThreadSafeBase @@ -48,6 +49,7 @@ public: virtual void Paste(TargetFrame targetFrame); virtual void Delete(TargetFrame targetFrame); virtual void SelectAll(TargetFrame targetFrame); + virtual void SetFocus(bool enable); virtual void Print(TargetFrame targetFrame); virtual void ViewSource(TargetFrame targetFrame); virtual std::wstring GetSource(TargetFrame targetFrame); diff --git a/libcef/browser_impl_win.cc b/libcef/browser_impl_win.cc index 97c006043..9563edaed 100644 --- a/libcef/browser_impl_win.cc +++ b/libcef/browser_impl_win.cc @@ -20,8 +20,6 @@ #include #include -#define BUFFER_SIZE 32768 - LPCTSTR CefBrowserImpl::GetWndClass() { @@ -46,6 +44,11 @@ LRESULT CALLBACK CefBrowserImpl::WndProc(HWND hwnd, UINT message, case WM_DESTROY: { + CefRefPtr handler = browser->GetHandler(); + if(handler.get()) { + // Notify the handler that the window is about to be closed + handler->HandleBeforeWindowClose(browser); + } // Remove the browser from the list maintained by the context _Context->RemoveBrowser(browser); } @@ -295,78 +298,6 @@ void CefBrowserImpl::UIT_CreateBrowser() if(url_.size() > 0) UIT_LoadURL(url_.c_str()); } - -void CefBrowserImpl::UIT_LoadURLForRequest(const std::wstring& url, - const std::wstring& frame_name, - const std::wstring& method, - net::UploadData *upload_data, - const WebRequest::HeaderMap& headers) -{ - REQUIRE_UIT(); - - if (url.empty()) - return; - - std::wstring urlString(url); - if (PathFileExists(url.c_str()) || PathIsUNC(url.c_str())) { - TCHAR fileURL[INTERNET_MAX_URL_LENGTH]; - DWORD fileURLLength = sizeof(fileURL)/sizeof(fileURL[0]); - if (SUCCEEDED(UrlCreateFromPath(url.c_str(), fileURL, &fileURLLength, 0))) - urlString.assign(fileURL); - } - - nav_controller_->LoadEntry(new BrowserNavigationEntry( - -1, GURL(urlString), std::wstring(), frame_name, method, upload_data, - headers)); -} - -void CefBrowserImpl::UIT_LoadHTML(const std::wstring& html, - const std::wstring& url) -{ - REQUIRE_UIT(); - - std::wstring urlString(url); - if (PathFileExists(url.c_str()) || PathIsUNC(url.c_str())) { - TCHAR fileURL[INTERNET_MAX_URL_LENGTH]; - DWORD fileURLLength = sizeof(fileURL)/sizeof(fileURL[0]); - if (SUCCEEDED(UrlCreateFromPath(url.c_str(), fileURL, &fileURLLength, 0))) - urlString.assign(fileURL); - } - - UIT_GetWebView()->GetMainFrame()->LoadHTMLString( - WideToUTF8(html), GURL(urlString)); -} - -void CefBrowserImpl::UIT_LoadHTMLForStreamRef(CefStreamReader* stream, - const std::wstring& url) -{ - REQUIRE_UIT(); - - std::wstring urlString(url); - if (PathFileExists(url.c_str()) || PathIsUNC(url.c_str())) { - TCHAR fileURL[INTERNET_MAX_URL_LENGTH]; - DWORD fileURLLength = sizeof(fileURL)/sizeof(fileURL[0]); - if (SUCCEEDED(UrlCreateFromPath(url.c_str(), fileURL, &fileURLLength, 0))) - urlString.assign(fileURL); - } - - // 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); - - UIT_GetWebView()->GetMainFrame()->LoadHTMLString(ss.str(), GURL(urlString)); - - stream->Release(); -} void CefBrowserImpl::UIT_SetFocus(WebWidgetHost* host, bool enable) { diff --git a/libcef/browser_webview_delegate.cc b/libcef/browser_webview_delegate.cc index 00e97d2ea..40aa7437d 100644 --- a/libcef/browser_webview_delegate.cc +++ b/libcef/browser_webview_delegate.cc @@ -643,3 +643,11 @@ std::wstring BrowserWebViewDelegate::GetFrameDescription(WebFrame* webframe) { return L"frame (anonymous)"; } } + +void BrowserWebViewDelegate::TakeFocus(WebView* webview, bool reverse) { + CefRefPtr handler = browser_->GetHandler(); + if(handler.get()) { + // Notify the handler that it should take a focus + handler->HandleTakeFocus(browser_, reverse); + } +} diff --git a/libcef/browser_webview_delegate.h b/libcef/browser_webview_delegate.h index 3e8d0d5bc..67cc60f4d 100644 --- a/libcef/browser_webview_delegate.h +++ b/libcef/browser_webview_delegate.h @@ -203,6 +203,7 @@ class BrowserWebViewDelegate : public base::RefCounted, virtual void Release() { base::RefCounted::Release(); } + virtual void TakeFocus(WebView* webview, bool reverse); // Additional accessors WebFrame* top_loading_frame() { return top_loading_frame_; } diff --git a/libcef/context.cc b/libcef/context.cc index 9b954b3c6..41f78a4d8 100644 --- a/libcef/context.cc +++ b/libcef/context.cc @@ -273,7 +273,7 @@ bool CefContext::Initialize(bool multi_threaded_message_loop, Lock(); // We only need to initialize if the UI thread is not currently running - if(!hthreadui_) { + if(!idthreadui_) { // Only start the initialization if we're not currently in a transitional // state intransition = in_transition_; @@ -351,6 +351,7 @@ bool CefContext::Initialize(bool multi_threaded_message_loop, hthreadui_ = CreateThread( NULL, 0, ThreadHandlerUI, this, 0, &idthreadui_); DCHECK(hthreadui_ != NULL); + DCHECK(idthreadui_ != 0); } else { if (!DoInitialize()) { // TODO: Process initialization errors @@ -358,6 +359,7 @@ bool CefContext::Initialize(bool multi_threaded_message_loop, // Create our own message loop there SetMessageLoopForUI(new CefMessageLoopForUI()); idthreadui_ = GetCurrentThreadId(); + DCHECK(idthreadui_ != 0); } initialized = true; @@ -390,7 +392,7 @@ void CefContext::Shutdown() Lock(); // We only need to shut down if the UI thread is currently running - if(hthreadui_) { + if(idthreadui_) { // Only start the shutdown if we're not currently in a transitional state intransition = in_transition_; if(!intransition) { @@ -417,21 +419,24 @@ void CefContext::Shutdown() Unlock(); if(shutdown) { - // Wait for the UI thread to exit - WaitForSingleObject(hthreadui_, INFINITE); + if (hthreadui_) { + // Wait for the UI thread to exit + WaitForSingleObject(hthreadui_, INFINITE); + + // Clean up thread and event handles + CloseHandle(hthreadui_); + CloseHandle(heventui_); + + hthreadui_ = NULL; + heventui_ = NULL; + } Lock(); // Unregister the window class UnregisterClass(CefBrowserImpl::GetWndClass(), hinstance_); - // Clean up thread and event handles - CloseHandle(hthreadui_); - CloseHandle(heventui_); - - hthreadui_ = NULL; idthreadui_ = 0; - heventui_ = NULL; messageloopui_ = NULL; // We have exited the transitional state diff --git a/libcef/jscontainer.cc b/libcef/jscontainer.cc index fcc185f5d..26f369eb9 100644 --- a/libcef/jscontainer.cc +++ b/libcef/jscontainer.cc @@ -41,7 +41,7 @@ MSVC_POP_WARNING() // callbacks to. struct CefNPObject { NPObject parent; // This must be the first field in the struct. - CefRefPtr container; + CefJSContainer* container; WebFrame* webframe; // @@ -148,11 +148,11 @@ NPClass CefNPObject::np_class_ = { return obj->container->SetProperty(ident, obj->webframe, value); } -CefJSContainer::CefJSContainer(CefRefPtr browser, +CefJSContainer::CefJSContainer(CefBrowser* browser, CefRefPtr handler) : browser_(browser), handler_(handler) { - DCHECK(browser_.get() != NULL); + DCHECK(browser_ != NULL); DCHECK(handler_.get() != NULL); } @@ -275,4 +275,3 @@ void CefJSContainer::BindToJavascript(WebFrame* frame, // so we can release it when we're destroyed. frame->BindToWindowObject(classname, np_obj); } - diff --git a/libcef/jscontainer.h b/libcef/jscontainer.h index 95070c992..c42dc6ec1 100644 --- a/libcef/jscontainer.h +++ b/libcef/jscontainer.h @@ -18,7 +18,7 @@ class WebFrame; class CefJSContainer : public CefThreadSafeBase { public: - CefJSContainer(CefRefPtr browser, + CefJSContainer(CefBrowser* browser, CefRefPtr handler); ~CefJSContainer(); @@ -52,7 +52,7 @@ protected: friend struct CefNPObject; protected: - CefRefPtr browser_; + CefBrowser* browser_; CefRefPtr handler_; // A list of all NPObjects we created and bound in BindToJavascript(), so we diff --git a/libcef_dll/cpptoc/browser_cpptoc.cc b/libcef_dll/cpptoc/browser_cpptoc.cc index f514cae75..516ac62e0 100644 --- a/libcef_dll/cpptoc/browser_cpptoc.cc +++ b/libcef_dll/cpptoc/browser_cpptoc.cc @@ -10,6 +10,7 @@ #include "ctocpp/jshandler_ctocpp.h" #include "base/logging.h" + int CEF_CALLBACK browser_can_go_back(cef_browser_t* browser) { DCHECK(browser); @@ -160,6 +161,17 @@ void CEF_CALLBACK browser_select_all(cef_browser_t* browser, impl->class_->GetClass()->SelectAll(targetFrame); } +void CEF_CALLBACK browser_set_focus(struct _cef_browser_t* browser, int enable) +{ + DCHECK(browser); + if(!browser) + return; + + CefBrowserCppToC::Struct* impl = + reinterpret_cast(browser); + impl->class_->GetClass()->SetFocus(enable ? true : false); +} + void CEF_CALLBACK browser_print(cef_browser_t* browser, enum cef_targetframe_t targetFrame) { @@ -460,7 +472,7 @@ cef_string_t CEF_CALLBACK browser_get_url(cef_browser_t* browser) return cef_string_alloc(urlStr.c_str()); } -CefBrowserCppToC::CefBrowserCppToC(CefRefPtr cls) +CefBrowserCppToC::CefBrowserCppToC(CefBrowser* cls) : CefCppToC(cls) { struct_.struct_.can_go_back = browser_can_go_back; @@ -476,6 +488,7 @@ CefBrowserCppToC::CefBrowserCppToC(CefRefPtr cls) struct_.struct_.paste = browser_paste; struct_.struct_.del = browser_delete; struct_.struct_.select_all = browser_select_all; + struct_.struct_.set_focus = browser_set_focus; struct_.struct_.print = browser_print; struct_.struct_.view_source = browser_view_source; struct_.struct_.get_source = browser_get_source; @@ -495,3 +508,7 @@ CefBrowserCppToC::CefBrowserCppToC(CefRefPtr cls) struct_.struct_.get_handler = browser_get_handler; struct_.struct_.get_url = browser_get_url; } + +#ifdef _DEBUG +long CefCppToC::DebugObjCt = 0; +#endif diff --git a/libcef_dll/cpptoc/browser_cpptoc.h b/libcef_dll/cpptoc/browser_cpptoc.h index bac843fdd..91a2a3381 100644 --- a/libcef_dll/cpptoc/browser_cpptoc.h +++ b/libcef_dll/cpptoc/browser_cpptoc.h @@ -19,7 +19,7 @@ class CefBrowserCppToC : public CefCppToC { public: - CefBrowserCppToC(CefRefPtr cls); + CefBrowserCppToC(CefBrowser* cls); virtual ~CefBrowserCppToC() {} }; diff --git a/libcef_dll/cpptoc/cpptoc.h b/libcef_dll/cpptoc/cpptoc.h index 5a2ec4c1d..82c5ad1b6 100644 --- a/libcef_dll/cpptoc/cpptoc.h +++ b/libcef_dll/cpptoc/cpptoc.h @@ -22,10 +22,10 @@ public: CefCppToC* class_; }; - CefCppToC(CefRefPtr cls) + CefCppToC(ClassName* cls) : class_(cls) { - DCHECK(cls.get()); + DCHECK(cls); struct_.class_ = this; @@ -34,12 +34,20 @@ public: 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; + +#ifdef _DEBUG + CefAtomicIncrement(&DebugObjCt); +#endif } virtual ~CefCppToC() { +#ifdef _DEBUG + CefAtomicDecrement(&DebugObjCt); +#endif } - CefRefPtr GetClass() { return class_; } + ClassName* 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, @@ -62,6 +70,12 @@ public: // Increment/decrement reference counts on only the underlying class. int UnderlyingAddRef() { return class_->AddRef(); } int UnderlyingRelease() { return class_->Release(); } + int UnderlyingGetRefCt() { return class_->GetRefCt(); } + +#ifdef _DEBUG + // Simple tracking of allocated objects. + static long DebugObjCt; +#endif private: static int CEF_CALLBACK struct_add_ref(struct _cef_base_t* base) @@ -84,9 +98,19 @@ private: 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: Struct struct_; - CefRefPtr class_; + ClassName* class_; }; #endif // _CPPTOC_H diff --git a/libcef_dll/cpptoc/handler_cpptoc.cc b/libcef_dll/cpptoc/handler_cpptoc.cc index 9fb6c0cce..424a4009a 100644 --- a/libcef_dll/cpptoc/handler_cpptoc.cc +++ b/libcef_dll/cpptoc/handler_cpptoc.cc @@ -53,7 +53,7 @@ enum cef_retval_t CEF_CALLBACK handler_handle_before_created( transfer_string_contents(urlStr, url); - if(handlerPtr.get() != structPtr->class_->GetClass().get()) + if(handlerPtr.get() != structPtr->class_->GetClass()) { // The handler has been changed. CefHandlerCppToC* hobj = new CefHandlerCppToC(handlerPtr); @@ -501,8 +501,45 @@ enum cef_retval_t CEF_CALLBACK handler_handle_jsprompt( return rv; } +enum cef_retval_t CEF_CALLBACK handler_handle_before_window_close( + struct _cef_handler_t* handler, cef_browser_t* browser) +{ + DCHECK(handler); + DCHECK(browser); + if(!handler || !browser) + return RV_CONTINUE; + + CefHandlerCppToC::Struct* impl = + reinterpret_cast(handler); + + CefBrowserCToCpp* bp = new CefBrowserCToCpp(browser); + CefRefPtr browserPtr(bp); + bp->UnderlyingRelease(); + + return impl->class_->GetClass()->HandleBeforeWindowClose(browserPtr); +} -CefHandlerCppToC::CefHandlerCppToC(CefRefPtr cls) +enum cef_retval_t CEF_CALLBACK handler_handle_take_focus( + struct _cef_handler_t* handler, cef_browser_t* browser, int reverse) +{ + DCHECK(handler); + DCHECK(browser); + if(!handler || !browser) + return RV_CONTINUE; + + CefHandlerCppToC::Struct* impl = + reinterpret_cast(handler); + + CefBrowserCToCpp* bp = new CefBrowserCToCpp(browser); + CefRefPtr browserPtr(bp); + bp->UnderlyingRelease(); + + return impl->class_->GetClass()-> + HandleTakeFocus(browserPtr, (reverse ? true : false)); +} + + +CefHandlerCppToC::CefHandlerCppToC(CefHandler* cls) : CefCppToC(cls) { struct_.struct_.handle_before_created = handler_handle_before_created; @@ -523,4 +560,11 @@ CefHandlerCppToC::CefHandlerCppToC(CefRefPtr cls) struct_.struct_.handle_jsalert = handler_handle_jsalert; struct_.struct_.handle_jsconfirm = handler_handle_jsconfirm; struct_.struct_.handle_jsprompt = handler_handle_jsprompt; + struct_.struct_.handle_before_window_close = + handler_handle_before_window_close; + struct_.struct_.handle_take_focus = handler_handle_take_focus; } + +#ifdef _DEBUG +long CefCppToC::DebugObjCt = 0; +#endif diff --git a/libcef_dll/cpptoc/handler_cpptoc.h b/libcef_dll/cpptoc/handler_cpptoc.h index f59265a4a..adc877094 100644 --- a/libcef_dll/cpptoc/handler_cpptoc.h +++ b/libcef_dll/cpptoc/handler_cpptoc.h @@ -19,7 +19,7 @@ class CefHandlerCppToC : public CefCppToC { public: - CefHandlerCppToC(CefRefPtr cls); + CefHandlerCppToC(CefHandler* cls); virtual ~CefHandlerCppToC() {} }; diff --git a/libcef_dll/cpptoc/jshandler_cpptoc.cc b/libcef_dll/cpptoc/jshandler_cpptoc.cc index 56cebf5ac..46e4beab9 100644 --- a/libcef_dll/cpptoc/jshandler_cpptoc.cc +++ b/libcef_dll/cpptoc/jshandler_cpptoc.cc @@ -144,7 +144,7 @@ bool CEF_CALLBACK jshandler_execute_method(struct _cef_jshandler_t* jshandler, } -CefJSHandlerCppToC::CefJSHandlerCppToC(CefRefPtr cls) +CefJSHandlerCppToC::CefJSHandlerCppToC(CefJSHandler* cls) : CefCppToC(cls) { struct_.struct_.has_method = jshandler_has_method; @@ -153,3 +153,7 @@ CefJSHandlerCppToC::CefJSHandlerCppToC(CefRefPtr cls) struct_.struct_.get_property = jshandler_get_property; struct_.struct_.execute_method = jshandler_execute_method; } + +#ifdef _DEBUG +long CefCppToC::DebugObjCt = 0; +#endif diff --git a/libcef_dll/cpptoc/jshandler_cpptoc.h b/libcef_dll/cpptoc/jshandler_cpptoc.h index 95e0562c9..70938f4dd 100644 --- a/libcef_dll/cpptoc/jshandler_cpptoc.h +++ b/libcef_dll/cpptoc/jshandler_cpptoc.h @@ -19,7 +19,7 @@ class CefJSHandlerCppToC : public CefCppToC { public: - CefJSHandlerCppToC(CefRefPtr cls); + CefJSHandlerCppToC(CefJSHandler* cls); virtual ~CefJSHandlerCppToC() {} }; diff --git a/libcef_dll/cpptoc/request_cpptoc.cc b/libcef_dll/cpptoc/request_cpptoc.cc index c14a85dc6..064cff7a1 100644 --- a/libcef_dll/cpptoc/request_cpptoc.cc +++ b/libcef_dll/cpptoc/request_cpptoc.cc @@ -207,7 +207,7 @@ void CEF_CALLBACK request_set(struct _cef_request_t* request, } -CefRequestCppToC::CefRequestCppToC(CefRefPtr cls) +CefRequestCppToC::CefRequestCppToC(CefRequest* cls) : CefCppToC(cls) { struct_.struct_.get_url = request_get_url; @@ -222,7 +222,10 @@ CefRequestCppToC::CefRequestCppToC(CefRefPtr cls) struct_.struct_.set_header_map = request_set_header_map; struct_.struct_.set = request_set; } - + +#ifdef _DEBUG +long CefCppToC::DebugObjCt = 0; +#endif size_t CEF_CALLBACK post_data_get_element_count( @@ -303,7 +306,7 @@ void CEF_CALLBACK post_data_remove_elements(struct _cef_post_data_t* postData) } -CefPostDataCppToC::CefPostDataCppToC(CefRefPtr cls) +CefPostDataCppToC::CefPostDataCppToC(CefPostData* cls) : CefCppToC(cls) { struct_.struct_.get_element_count = post_data_get_element_count; @@ -312,7 +315,10 @@ CefPostDataCppToC::CefPostDataCppToC(CefRefPtr cls) struct_.struct_.add_element = post_data_add_element; struct_.struct_.remove_elements = post_data_remove_elements; } - + +#ifdef _DEBUG +long CefCppToC::DebugObjCt = 0; +#endif void CEF_CALLBACK post_data_element_set_to_empty( @@ -411,8 +417,7 @@ size_t CEF_CALLBACK post_data_element_get_bytes( } -CefPostDataElementCppToC::CefPostDataElementCppToC( - CefRefPtr cls) +CefPostDataElementCppToC::CefPostDataElementCppToC(CefPostDataElement* cls) : CefCppToC(cls) { struct_.struct_.set_to_empty = post_data_element_set_to_empty; @@ -423,3 +428,7 @@ CefPostDataElementCppToC::CefPostDataElementCppToC( struct_.struct_.get_bytes_count = post_data_element_get_bytes_count; struct_.struct_.get_bytes = post_data_element_get_bytes; } + +#ifdef _DEBUG +long CefCppToC::DebugObjCt = 0; +#endif diff --git a/libcef_dll/cpptoc/request_cpptoc.h b/libcef_dll/cpptoc/request_cpptoc.h index 45691c513..47dfe8b02 100644 --- a/libcef_dll/cpptoc/request_cpptoc.h +++ b/libcef_dll/cpptoc/request_cpptoc.h @@ -19,7 +19,7 @@ class CefRequestCppToC : public CefCppToC { public: - CefRequestCppToC(CefRefPtr cls); + CefRequestCppToC(CefRequest* cls); virtual ~CefRequestCppToC() {} }; @@ -29,7 +29,7 @@ public: class CefPostDataCppToC : public CefCppToC { public: - CefPostDataCppToC(CefRefPtr cls); + CefPostDataCppToC(CefPostData* cls); virtual ~CefPostDataCppToC() {} }; @@ -42,7 +42,7 @@ class CefPostDataElementCppToC : public CefCppToC { public: - CefPostDataElementCppToC(CefRefPtr cls); + CefPostDataElementCppToC(CefPostDataElement* cls); virtual ~CefPostDataElementCppToC() {} }; diff --git a/libcef_dll/cpptoc/stream_cpptoc.cc b/libcef_dll/cpptoc/stream_cpptoc.cc index 0932fb880..eb78e09a4 100644 --- a/libcef_dll/cpptoc/stream_cpptoc.cc +++ b/libcef_dll/cpptoc/stream_cpptoc.cc @@ -54,7 +54,7 @@ int CEF_CALLBACK stream_reader_eof(struct _cef_stream_reader_t* stream) } -CefStreamReaderCppToC::CefStreamReaderCppToC(CefRefPtr cls) +CefStreamReaderCppToC::CefStreamReaderCppToC(CefStreamReader* cls) : CefCppToC(cls) { struct_.struct_.read = stream_reader_read; @@ -62,7 +62,10 @@ CefStreamReaderCppToC::CefStreamReaderCppToC(CefRefPtr cls) struct_.struct_.tell = stream_reader_tell; struct_.struct_.eof = stream_reader_eof; } - + +#ifdef _DEBUG +long CefCppToC::DebugObjCt = 0; +#endif size_t CEF_CALLBACK stream_writer_write(struct _cef_stream_writer_t* stream, @@ -112,7 +115,7 @@ int CEF_CALLBACK stream_writer_flush(struct _cef_stream_writer_t* stream) } -CefStreamWriterCppToC::CefStreamWriterCppToC(CefRefPtr cls) +CefStreamWriterCppToC::CefStreamWriterCppToC(CefStreamWriter* cls) : CefCppToC(cls) { struct_.struct_.write = stream_writer_write; @@ -120,3 +123,7 @@ CefStreamWriterCppToC::CefStreamWriterCppToC(CefRefPtr cls) struct_.struct_.tell = stream_writer_tell; struct_.struct_.flush = stream_writer_flush; } + +#ifdef _DEBUG +long CefCppToC::DebugObjCt = 0; +#endif diff --git a/libcef_dll/cpptoc/stream_cpptoc.h b/libcef_dll/cpptoc/stream_cpptoc.h index 236fe9e55..0880db027 100644 --- a/libcef_dll/cpptoc/stream_cpptoc.h +++ b/libcef_dll/cpptoc/stream_cpptoc.h @@ -20,7 +20,7 @@ class CefStreamReaderCppToC : public CefCppToC { public: - CefStreamReaderCppToC(CefRefPtr cls); + CefStreamReaderCppToC(CefStreamReader* cls); virtual ~CefStreamReaderCppToC() {} }; @@ -31,7 +31,7 @@ class CefStreamWriterCppToC : public CefCppToC { public: - CefStreamWriterCppToC(CefRefPtr cls); + CefStreamWriterCppToC(CefStreamWriter* cls); virtual ~CefStreamWriterCppToC() {} }; diff --git a/libcef_dll/cpptoc/variant_cpptoc.cc b/libcef_dll/cpptoc/variant_cpptoc.cc index 0a6ca409f..8881dbd28 100644 --- a/libcef_dll/cpptoc/variant_cpptoc.cc +++ b/libcef_dll/cpptoc/variant_cpptoc.cc @@ -282,7 +282,7 @@ size_t CEF_CALLBACK variant_get_string_array(struct _cef_variant_t* variant, } -CefVariantCppToC::CefVariantCppToC(CefRefPtr cls) +CefVariantCppToC::CefVariantCppToC(CefVariant* cls) : CefCppToC(cls) { struct_.struct_.get_type = variant_get_type; @@ -305,3 +305,7 @@ CefVariantCppToC::CefVariantCppToC(CefRefPtr cls) struct_.struct_.get_double_array = variant_get_double_array; struct_.struct_.get_string_array = variant_get_string_array; } + +#ifdef _DEBUG +long CefCppToC::DebugObjCt = 0; +#endif diff --git a/libcef_dll/cpptoc/variant_cpptoc.h b/libcef_dll/cpptoc/variant_cpptoc.h index fe9aff5eb..ae15475cc 100644 --- a/libcef_dll/cpptoc/variant_cpptoc.h +++ b/libcef_dll/cpptoc/variant_cpptoc.h @@ -19,7 +19,7 @@ class CefVariantCppToC : public CefCppToC { public: - CefVariantCppToC(CefRefPtr cls); + CefVariantCppToC(CefVariant* cls); virtual ~CefVariantCppToC() {} }; diff --git a/libcef_dll/ctocpp/browser_ctocpp.cc b/libcef_dll/ctocpp/browser_ctocpp.cc index 0d55616ad..af0ae035e 100644 --- a/libcef_dll/ctocpp/browser_ctocpp.cc +++ b/libcef_dll/ctocpp/browser_ctocpp.cc @@ -115,6 +115,14 @@ void CefBrowserCToCpp::SelectAll(TargetFrame targetFrame) struct_->select_all(struct_, targetFrame); } +void CefBrowserCToCpp::SetFocus(bool enable) +{ + if(CEF_MEMBER_MISSING(struct_, set_focus)) + return; + + struct_->set_focus(struct_, enable); +} + void CefBrowserCToCpp::Print(TargetFrame targetFrame) { if(CEF_MEMBER_MISSING(struct_, print)) @@ -310,3 +318,7 @@ std::wstring CefBrowserCToCpp::GetURL() } return str; } + +#ifdef _DEBUG +long CefCToCpp::DebugObjCt = 0; +#endif diff --git a/libcef_dll/ctocpp/browser_ctocpp.h b/libcef_dll/ctocpp/browser_ctocpp.h index df7fc4d75..07ecb65bd 100644 --- a/libcef_dll/ctocpp/browser_ctocpp.h +++ b/libcef_dll/ctocpp/browser_ctocpp.h @@ -37,6 +37,7 @@ public: virtual void Paste(TargetFrame targetFrame); virtual void Delete(TargetFrame targetFrame); virtual void SelectAll(TargetFrame targetFrame); + virtual void SetFocus(bool enable); virtual void Print(TargetFrame targetFrame); virtual void ViewSource(TargetFrame targetFrame); virtual std::wstring GetSource(TargetFrame targetFrame); diff --git a/libcef_dll/ctocpp/ctocpp.h b/libcef_dll/ctocpp/ctocpp.h index 1be2f9d0f..113a43020 100644 --- a/libcef_dll/ctocpp/ctocpp.h +++ b/libcef_dll/ctocpp/ctocpp.h @@ -19,9 +19,16 @@ public: : struct_(str) { DCHECK(str); + +#ifdef _DEBUG + CefAtomicIncrement(&DebugObjCt); +#endif } virtual ~CefCToCpp() { +#ifdef _DEBUG + CefAtomicDecrement(&DebugObjCt); +#endif } // If returning the structure across the DLL boundary you should call @@ -55,6 +62,17 @@ public: return 0; return struct_->base.release(&struct_->base); } + int UnderlyingGetRefCt() + { + if(!struct_->base.get_refct) + return 0; + return struct_->base.get_refct(&struct_->base); + } + +#ifdef _DEBUG + // Simple tracking of allocated objects. + static long DebugObjCt; +#endif protected: StructName* struct_; diff --git a/libcef_dll/ctocpp/handler_ctocpp.cc b/libcef_dll/ctocpp/handler_ctocpp.cc index 38bf8d828..bc27df805 100644 --- a/libcef_dll/ctocpp/handler_ctocpp.cc +++ b/libcef_dll/ctocpp/handler_ctocpp.cc @@ -335,3 +335,31 @@ CefHandler::RetVal CefHandlerCToCpp::HandleJSPrompt( return rv; } + +CefHandler::RetVal CefHandlerCToCpp::HandleBeforeWindowClose( + CefRefPtr browser) +{ + if(CEF_MEMBER_MISSING(struct_, handle_before_window_close)) + return RV_CONTINUE; + + CefBrowserCppToC* browserPtr = new CefBrowserCppToC(browser); + browserPtr->AddRef(); + + return struct_->handle_before_window_close(struct_, browserPtr->GetStruct()); +} + +CefHandler::RetVal CefHandlerCToCpp::HandleTakeFocus( + CefRefPtr browser, bool reverse) +{ + if(CEF_MEMBER_MISSING(struct_, handle_take_focus)) + return RV_CONTINUE; + + CefBrowserCppToC* browserPtr = new CefBrowserCppToC(browser); + browserPtr->AddRef(); + + return struct_->handle_take_focus(struct_, browserPtr->GetStruct(), reverse); +} + +#ifdef _DEBUG +long CefCToCpp::DebugObjCt = 0; +#endif diff --git a/libcef_dll/ctocpp/handler_ctocpp.h b/libcef_dll/ctocpp/handler_ctocpp.h index adfc1092e..0c48ab666 100644 --- a/libcef_dll/ctocpp/handler_ctocpp.h +++ b/libcef_dll/ctocpp/handler_ctocpp.h @@ -74,6 +74,9 @@ public: const std::wstring& default_value, bool& retval, std::wstring& result); + virtual RetVal HandleBeforeWindowClose(CefRefPtr browser); + virtual RetVal HandleTakeFocus(CefRefPtr browser, + bool reverse); }; diff --git a/libcef_dll/ctocpp/jshandler_ctocpp.cc b/libcef_dll/ctocpp/jshandler_ctocpp.cc index 6945c1877..2b0b9665b 100644 --- a/libcef_dll/ctocpp/jshandler_ctocpp.cc +++ b/libcef_dll/ctocpp/jshandler_ctocpp.cc @@ -101,3 +101,7 @@ bool CefJSHandlerCToCpp::ExecuteMethod(CefRefPtr browser, return rv; } + +#ifdef _DEBUG +long CefCToCpp::DebugObjCt = 0; +#endif diff --git a/libcef_dll/ctocpp/request_ctocpp.cc b/libcef_dll/ctocpp/request_ctocpp.cc index 683d7f10a..8025339fb 100644 --- a/libcef_dll/ctocpp/request_ctocpp.cc +++ b/libcef_dll/ctocpp/request_ctocpp.cc @@ -168,6 +168,10 @@ void CefRequestCToCpp::Set(const std::wstring& url, cef_string_map_free(map); } +#ifdef _DEBUG +long CefCToCpp::DebugObjCt = 0; +#endif + size_t CefPostDataCToCpp::GetElementCount() @@ -231,6 +235,9 @@ void CefPostDataCToCpp::RemoveElements() return struct_->remove_elements(struct_); } +#ifdef _DEBUG +long CefCToCpp::DebugObjCt = 0; +#endif void CefPostDataElementCToCpp::SetToEmpty() @@ -295,3 +302,7 @@ size_t CefPostDataElementCToCpp::GetBytes(size_t size, void *bytes) return struct_->get_bytes(struct_, size, bytes); } + +#ifdef _DEBUG +long CefCToCpp::DebugObjCt = 0; +#endif diff --git a/libcef_dll/ctocpp/stream_ctocpp.cc b/libcef_dll/ctocpp/stream_ctocpp.cc index a72e07157..2d5e42acc 100644 --- a/libcef_dll/ctocpp/stream_ctocpp.cc +++ b/libcef_dll/ctocpp/stream_ctocpp.cc @@ -39,6 +39,10 @@ int CefStreamReaderCToCpp::Eof() return struct_->eof(struct_); } +#ifdef _DEBUG +long CefCToCpp::DebugObjCt = 0; +#endif + size_t CefStreamWriterCToCpp::Write(const void *ptr, size_t size, size_t n) { @@ -71,3 +75,7 @@ int CefStreamWriterCToCpp::Flush() return struct_->flush(struct_); } + +#ifdef _DEBUG +long CefCToCpp::DebugObjCt = 0; +#endif diff --git a/libcef_dll/ctocpp/variant_ctocpp.cc b/libcef_dll/ctocpp/variant_ctocpp.cc index 06c8ccf33..1697648f0 100644 --- a/libcef_dll/ctocpp/variant_ctocpp.cc +++ b/libcef_dll/ctocpp/variant_ctocpp.cc @@ -295,3 +295,7 @@ int CefVariantCToCpp::GetArraySize() return struct_->get_array_size(struct_); } + +#ifdef _DEBUG +long CefCToCpp::DebugObjCt = 0; +#endif diff --git a/libcef_dll/libcef_dll.cc b/libcef_dll/libcef_dll.cc index 5eac33e24..7c5125881 100644 --- a/libcef_dll/libcef_dll.cc +++ b/libcef_dll/libcef_dll.cc @@ -7,9 +7,12 @@ #include "cef_capi.h" #include "cef_nplugin.h" #include "cef_nplugin_capi.h" +#include "cpptoc/browser_cpptoc.h" #include "cpptoc/request_cpptoc.h" +#include "cpptoc/variant_cpptoc.h" #include "cpptoc/stream_cpptoc.h" #include "ctocpp/handler_ctocpp.h" +#include "ctocpp/jshandler_ctocpp.h" #include "base/logging.h" #include "base/string_util.h" @@ -26,6 +29,17 @@ CEF_EXPORT int cef_initialize(int multi_threaded_message_loop, CEF_EXPORT void cef_shutdown() { CefShutdown(); + + // Check that all wrapper objects have been destroyed + DCHECK(CefBrowserCppToC::DebugObjCt == 0); + DCHECK(CefRequestCppToC::DebugObjCt == 0); + DCHECK(CefPostDataCppToC::DebugObjCt == 0); + DCHECK(CefPostDataElementCppToC::DebugObjCt == 0); + DCHECK(CefStreamReaderCppToC::DebugObjCt == 0); + DCHECK(CefStreamWriterCppToC::DebugObjCt == 0); + DCHECK(CefVariantCppToC::DebugObjCt == 0); + DCHECK(CefHandlerCToCpp::DebugObjCt == 0); + DCHECK(CefJSHandlerCToCpp::DebugObjCt == 0); } CEF_EXPORT void cef_do_message_loop_work() @@ -53,6 +67,36 @@ CEF_EXPORT int cef_create_browser(cef_window_info_t* windowInfo, int popup, return CefBrowser::CreateBrowser(wi, popup, handlerPtr, urlStr); } +CEF_EXPORT cef_browser_t* cef_create_browser_sync(cef_window_info_t* windowInfo, + int popup, + cef_handler_t* handler, + const wchar_t* url) +{ + DCHECK(windowInfo); + + CefRefPtr handlerPtr; + std::wstring urlStr; + CefWindowInfo wi = *windowInfo; + + if(handler) { + CefHandlerCToCpp* hp = new CefHandlerCToCpp(handler); + handlerPtr = hp; + hp->UnderlyingRelease(); + } + if(url) + urlStr = url; + + cef_browser_t* browserStruct = NULL; + CefRefPtr browserPtr( + CefBrowser::CreateBrowserSync(wi, popup, handlerPtr, urlStr)); + if(!browserPtr.get()) + return NULL; + + CefBrowserCppToC* bp = new CefBrowserCppToC(browserPtr); + bp->AddRef(); + return bp->GetStruct(); +} + CEF_EXPORT cef_request_t* cef_create_request() { CefRefPtr impl = CefRequest::CreateRequest(); diff --git a/libcef_dll/wrapper/libcef_dll_wrapper.cc b/libcef_dll/wrapper/libcef_dll_wrapper.cc index b2b6e5bb0..991e2bdfd 100644 --- a/libcef_dll/wrapper/libcef_dll_wrapper.cc +++ b/libcef_dll/wrapper/libcef_dll_wrapper.cc @@ -8,7 +8,10 @@ #include "cef_nplugin.h" #include "cef_nplugin_capi.h" #include "../cpptoc/handler_cpptoc.h" +#include "../cpptoc/jshandler_cpptoc.h" +#include "../ctocpp/browser_ctocpp.h" #include "../ctocpp/request_ctocpp.h" +#include "../ctocpp/variant_ctocpp.h" #include "../ctocpp/stream_ctocpp.h" @@ -21,6 +24,17 @@ bool CefInitialize(bool multi_threaded_message_loop, void CefShutdown() { cef_shutdown(); + + // Check that all wrapper objects have been destroyed + DCHECK(CefHandlerCppToC::DebugObjCt == 0); + DCHECK(CefJSHandlerCppToC::DebugObjCt == 0); + DCHECK(CefBrowserCToCpp::DebugObjCt == 0); + DCHECK(CefRequestCToCpp::DebugObjCt == 0); + DCHECK(CefPostDataCToCpp::DebugObjCt == 0); + DCHECK(CefPostDataElementCToCpp::DebugObjCt == 0); + DCHECK(CefStreamReaderCToCpp::DebugObjCt == 0); + DCHECK(CefStreamWriterCToCpp::DebugObjCt == 0); + DCHECK(CefVariantCToCpp::DebugObjCt == 0); } void CefDoMessageLoopWork() @@ -37,6 +51,26 @@ bool CefBrowser::CreateBrowser(CefWindowInfo& windowInfo, bool popup, return cef_create_browser(&windowInfo, popup, hp->GetStruct(), url.c_str()); } +CefRefPtr CefBrowser::CreateBrowserSync(CefWindowInfo& windowInfo, + bool popup, + CefRefPtr handler, + const std::wstring& url) +{ + CefHandlerCppToC* hp = new CefHandlerCppToC(handler); + hp->AddRef(); + + cef_browser_t* browserStruct = cef_create_browser_sync(&windowInfo, popup, + hp->GetStruct(), url.c_str()); + if(!browserStruct) + return NULL; + + CefBrowserCToCpp* bp = new CefBrowserCToCpp(browserStruct); + CefRefPtr browserPtr(bp); + bp->UnderlyingRelease(); + + return browserPtr; +} + CefRefPtr CreateRequest() { cef_request_t* impl = cef_create_request(); diff --git a/tests/cefclient/cefclient.cpp b/tests/cefclient/cefclient.cpp index 98f6a15b2..48f261e3f 100644 --- a/tests/cefclient/cefclient.cpp +++ b/tests/cefclient/cefclient.cpp @@ -596,6 +596,26 @@ public: return RV_CONTINUE; } + // Called just before a window is closed. The return value is currently + // ignored. + virtual RetVal HandleBeforeWindowClose(CefRefPtr browser) + { + if(m_BrowserHwnd == browser->GetWindowHandle()) + { + // Free the browser pointer so that the browser can be destroyed + m_Browser = NULL; + } + return RV_CONTINUE; + } + + // 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. + // The return value is currently ignored. + virtual RetVal HandleTakeFocus(CefRefPtr browser, bool reverse) + { + return RV_CONTINUE; + } + // Retrieve the current navigation state flags void GetNavState(bool &isLoading, bool &canGoBack, bool &canGoForward) { @@ -678,7 +698,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { // When the user hits the enter key load the URL CefRefPtr browser = handler->GetBrowser(); - wchar_t strPtr[MAX_URL_LENGTH]; + wchar_t strPtr[MAX_URL_LENGTH] = {0}; *((LPWORD)strPtr) = MAX_URL_LENGTH; LRESULT strLen = SendMessage(hWnd, EM_GETLINE, 0, (LPARAM)strPtr); if (strLen > 0) @@ -778,6 +798,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) EnableWindow(reloadWnd, !isLoading); EnableWindow(stopWnd, isLoading); } + return 0; case WM_COMMAND: {