Add API to capture a page into file.

This commit is contained in:
Cheng Zhao 2013-11-21 21:50:06 +08:00
parent 9ad3b7939f
commit 36ecb35cb1
2 changed files with 49 additions and 0 deletions

View file

@ -29,6 +29,7 @@
#include "common/api/api_messages.h"
#include "common/options_switches.h"
#include "ipc/ipc_message_macros.h"
#include "ui/gfx/codec/png_codec.h"
#include "ui/gfx/point.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/size.h"
@ -198,6 +199,18 @@ bool NativeWindow::SetIcon(const std::string& str_path) {
return true;
}
void NativeWindow::CapturePage(const gfx::Rect& rect,
const base::FilePath& path,
const CapturePageCallback& callback) {
GetWebContents()->GetRenderViewHost()->CopyFromBackingStore(
rect,
gfx::Size(),
base::Bind(&NativeWindow::OnCapturePageDone,
base::Unretained(this),
path,
callback));
}
void NativeWindow::CloseWebContents() {
bool prevent_default = false;
FOR_EACH_OBSERVER(NativeWindowObserver,
@ -374,6 +387,29 @@ void NativeWindow::Observe(int type,
}
}
void NativeWindow::OnCapturePageDone(const base::FilePath& filename,
const CapturePageCallback& callback,
bool succeed,
const SkBitmap& bitmap) {
if (!succeed) {
callback.Run(false);
return;
}
std::vector<unsigned char> data;
bool encoded = gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, true, &data);
if (!encoded) {
callback.Run(false);
return;
}
int written = file_util::WriteFile(
filename,
reinterpret_cast<const char*>(&data[0]),
data.size());
callback.Run(written > 0);
}
void NativeWindow::OnRendererMessage(const string16& channel,
const base::ListValue& args) {
AtomBrowserMainParts::Get()->atom_bindings()->OnRendererMessage(

View file

@ -108,6 +108,13 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
virtual void RestartHangMonitorTimeout();
virtual bool SetIcon(const std::string& path);
// Captures the page with |rect| and saves the image to |path|, |callback|
// would be called when capturing is done.
typedef base::Callback<void(bool succeed)> CapturePageCallback;
virtual void CapturePage(const gfx::Rect& rect,
const base::FilePath& path,
const CapturePageCallback& callback);
// The same with closing a tab in a real browser.
//
// Should be called by platform code when user want to close the window.
@ -184,6 +191,12 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
private:
void RendererUnresponsiveDelayed();
// Called when CapturePage has done.
void OnCapturePageDone(const base::FilePath& filename,
const CapturePageCallback& callback,
bool succeed,
const SkBitmap& bitmap);
void OnRendererMessage(const string16& channel,
const base::ListValue& args);