mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Windows: Improve "view source" implementation.
git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@1550 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
@@ -14,7 +14,9 @@
|
|||||||
#include "libcef/browser/content_browser_client.h"
|
#include "libcef/browser/content_browser_client.h"
|
||||||
#include "libcef/browser/thread_util.h"
|
#include "libcef/browser/thread_util.h"
|
||||||
|
|
||||||
|
#include "base/file_util.h"
|
||||||
#include "base/i18n/case_conversion.h"
|
#include "base/i18n/case_conversion.h"
|
||||||
|
#include "base/memory/ref_counted_memory.h"
|
||||||
#include "base/strings/string_util.h"
|
#include "base/strings/string_util.h"
|
||||||
#include "base/strings/utf_string_conversions.h"
|
#include "base/strings/utf_string_conversions.h"
|
||||||
#include "base/win/registry.h"
|
#include "base/win/registry.h"
|
||||||
@@ -29,6 +31,7 @@
|
|||||||
#include "third_party/WebKit/public/web/WebInputEvent.h"
|
#include "third_party/WebKit/public/web/WebInputEvent.h"
|
||||||
#include "third_party/WebKit/public/web/win/WebInputEventFactory.h"
|
#include "third_party/WebKit/public/web/win/WebInputEventFactory.h"
|
||||||
#include "ui/base/l10n/l10n_util.h"
|
#include "ui/base/l10n/l10n_util.h"
|
||||||
|
#include "ui/base/win/shell.h"
|
||||||
#include "ui/gfx/win/hwnd_util.h"
|
#include "ui/gfx/win/hwnd_util.h"
|
||||||
#include "ui/views/background.h"
|
#include "ui/views/background.h"
|
||||||
#include "ui/views/controls/webview/webview.h"
|
#include "ui/views/controls/webview/webview.h"
|
||||||
@@ -58,13 +61,22 @@ void SetAeroGlass(HWND hWnd) {
|
|||||||
DwmExtendFrameIntoClientArea(hWnd, &mgMarInset);
|
DwmExtendFrameIntoClientArea(hWnd, &mgMarInset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteTextToFile(const std::string& data, const std::wstring& file_path) {
|
void WriteTempFileAndView(scoped_refptr<base::RefCountedString> str) {
|
||||||
FILE* fp;
|
CEF_REQUIRE_FILET();
|
||||||
errno_t err = _wfopen_s(&fp, file_path.c_str(), L"wt");
|
|
||||||
if (err)
|
base::FilePath tmp_file;
|
||||||
|
if (!base::CreateTemporaryFile(&tmp_file))
|
||||||
return;
|
return;
|
||||||
fwrite(data.c_str(), 1, data.size(), fp);
|
|
||||||
fclose(fp);
|
// The shell command will look at the file extension to identify the correct
|
||||||
|
// program to open.
|
||||||
|
tmp_file = tmp_file.AddExtension(L"txt");
|
||||||
|
|
||||||
|
const std::string& data = str->data();
|
||||||
|
int write_ct = file_util::WriteFile(tmp_file, data.c_str(), data.size());
|
||||||
|
DCHECK_EQ(static_cast<int>(data.size()), write_ct);
|
||||||
|
|
||||||
|
ui::win::OpenItemViaShell(tmp_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
// From ui/base/dialogs/select_file_dialog_win.cc.
|
// From ui/base/dialogs/select_file_dialog_win.cc.
|
||||||
@@ -783,35 +795,10 @@ CefWindowHandle CefBrowserHostImpl::PlatformGetWindowHandle() {
|
|||||||
bool CefBrowserHostImpl::PlatformViewText(const std::string& text) {
|
bool CefBrowserHostImpl::PlatformViewText(const std::string& text) {
|
||||||
CEF_REQUIRE_UIT();
|
CEF_REQUIRE_UIT();
|
||||||
|
|
||||||
DWORD dwRetVal;
|
std::string str = text;
|
||||||
DWORD dwBufSize = 512;
|
scoped_refptr<base::RefCountedString> str_ref =
|
||||||
TCHAR lpPathBuffer[512];
|
base::RefCountedString::TakeString(&str);
|
||||||
UINT uRetVal;
|
CEF_POST_TASK(CEF_FILET, base::Bind(WriteTempFileAndView, str_ref));
|
||||||
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");
|
|
||||||
WriteTextToFile(text, szTempName);
|
|
||||||
|
|
||||||
HWND frameWnd = GetAncestor(PlatformGetWindowHandle(), GA_ROOT);
|
|
||||||
int errorCode = reinterpret_cast<int>(ShellExecute(frameWnd, L"open",
|
|
||||||
szTempName, NULL, NULL, SW_SHOWNORMAL));
|
|
||||||
if (errorCode <= 32)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user